From 03327712285d1a14ec916415b44e0dab63cbd6fd Mon Sep 17 00:00:00 2001 From: Prajwal D C Date: Wed, 21 Jan 2026 19:35:42 +0530 Subject: [PATCH 001/225] docs: Updated the architecture diagram --- docs/images/readme/agent_flow.png | Bin 125290 -> 156275 bytes docs/images/readme/architecture.png | Bin 161882 -> 211660 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/images/readme/agent_flow.png b/docs/images/readme/agent_flow.png index fd22ae7759c2643102f6b5914314e75d575a767c..1518756a273e6783688b6dad28c7e1a1b0d5d33a 100644 GIT binary patch literal 156275 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ðkp2n4DlDloD zAh|9#%km7os4l7Q$uFrg$N+e1MGnYV8LI<{t5}0rz z@BQM?b~`!ivZ=RxHTmPl!-Cc2)cLeK%d;LaK~jx|`|)Og^0h8%PPbA#q4G;gqky}| zjjspgw~Q<=S{_-^1NR54GO6fltm|gjPa-ot8nvr1_y2G;dQf6<2GzlADkBKY<=&!8TQW7knHPS zq!Pwzohl1p*RlBpAcGpT($7{|rg|T@5L+7SV|LpT+o1Mq^TbcV15#MkGv%^D2Di@s zBFEh?AAQ!>fd(aE%X%1KeN;*z&{37fRJ`7&@BQQo>Jr}Mvm3rYKe2zXr%U`0-AU|n zq~-ZSMYL5mgdyGDOU+>LvCZMo{^KVfb#G7D#9&lcUrtAgGqQ!w#YXy*{B25M@xR)0 z)QJxuKh*jacW3-fUjRuX%)6vfo!#=%uH^dY_Ks!$_3!9{{DyMtg=!7H>wPxl?H2d8 zN$a72=2^i@n5>OxucsDuN@d?i_nWHP3HN?`>Lt)yej1A*;$9`O?8%or8^R`w5= z2zf|?GHW{6=`unyt2i;A&mnG3O!?2QvOM@hP@NW5Ov*3O%ZBzO;|U-rU8E^{k4r_l z$oJp&b1KHTIOq$0kfj8Yf;6YHW9-g8hriK-)M8qhBO#0ou2-%rN>Ip>8c$Z z-ljKaBI*JoXALpVXG=?eE<&V7^XHDoJJ8 zQB#GnZYFY0wrt{2L(mvO38~4um&s{yCFi^|s<{5b%Bz&Sd{E!B>Sc(D7@FWFpeJ2) zS6CahhT!K2OfI|s!U#=}W2U{Mx^yLh8__(RX}cS8ye4J@8E(ZZbQ*sgeatv!O4`>f zo~1qQy_*GHCR&kne(9vxXKP|RDhJ?r;?U+(*UTbSef_eE+S=NJ0&mx?s_ffwn`lv% zUk4!C56eFEzDDOpH5)_78m~d9<5}CRxN%^qusvO@I1;(Dn8DklC> zMggLLRB^x2ld-y?O_RDfadL!m{qy^D&1btp=`pm&^@Rl$2Eu?YOKd!oio#SscCj#+ zMcrL)XH9vqe}G7xG@04?*k)bsL*nE!`hlT#@mHgYNqnJG>KXdfl>AparQ+F%X|6=PcqoV%WwqZq(0R#r6lt!rm1XQF!N-4>qTN29Qnx>6C^cM4F+yd4F?V|Lc11`+1)IfwlO+TFjok&p3|bJhn4|XhXR9j7<7) zdWda$QCuPY_voaM*6`d(d+V?kT%fv?7Q>JZVT_~_jQ&9iX*ME@20-B)YDD<_HzchK zsY9{4f_FoKaQOCa@vqH7e+dUe+K?C~mSpE=r~f{_{@tIVf5_q}NU9-@goX*$lk8Dn|n;VRE_B|7yskUVy zQ(qZj<`EZk-D0J1-Q~C>o|KnMf350s5rHps?XdNk`pP%@S%v`fHi}thx|}Z8?V#>} zi^71TOHrdQZ(B)L!@B8{<${K%!IW+@YiUw`5Jc9$((z@DzRmNERQ-FN8OZNnxIlkN zIXpD0n{Tahuy|!fvCL#M+eSM%!HVOhap{f^G!(n?zebzb5aqzOsh$rM_LF9zt?(wa zwFBK&9g;o7DgyPQk@RY=Vr$%SE(Ym8o={?7P+r=9A$Fyem1F43{(c33)BDqS_V*!j zSLJ;a(2l3=|EnFR74bx%(`H`AfxpoQcNq39M0NHt30yCyXJ;OCPy|=_TrR8xl&qI5_a5-g1njZJY933`%{lz2`FxGPl$dgO2 zS}P8}Ey%c($cz`NJ=9!yJ5#;ETA;R>XM!8MCFv76|7Gm*n%=4armL3v`LC{8^4#OV{_df#0QeLna~XW=hGW&a#lTjBTrwxznFKap+38TUzw~ivx)5G z9c?5s^O?FN1pUHh6VqYCZ4r3}^jNai$yo>Og+xxjJN(sUv;SQA&VE!f%G>2l?jAUu zW1LPtI)F}zn`Hv+Dw(w}C~w2$rO}zXC~DOsX=Ch_f3}gXbXu43d^ALi0ol8>Xl0^h zWz{zYJ(P(3@;~k!d|U`{=DI@rv^-?A&NT2nU-?dJsHL@joVI_ya076~Qc~r>SU{k` zf`x?zfpnG(V$XHnW38w2Jzd|QE41li!){M+bWP7d^0f@D;Z5;_#>Q_@4UOLBYuwy} zGm15Lg6^r%>>3KZoF5>6@(<_1Pi z=NVMB9VG-^H#zpV1-qN=iDkORqMR0S=9Uq@#B%D#cmj@%3L}Cn@)CMYV;UNLgK-b7 z;xiaU8jfRb&%fQqGKifQ;@fw0bjWhBe*H{tU>REw_#E_Rz+>%{kk;AV&_SFMpAM=& zBA#6;Qr|oLyFFI`CXpg4c9n?)rY=hv%}ZI$=863{AD67@Ce!MBi=8~VyevlTj~j52 z77st3{wJ9MnscD0Y#JMb*7^OtmXInL3W=mL1#B7aijX78p1zBKPGUAsDwdIl=f%yh zqI++ z0~^+LpN^2Z4%5PQAOBRv4Ks^xGKmjDHG6M-40~%V2IJ*Xzhu3=12RN?-U7ZZ&$^VL z-E2$fgQxFSmN%YQp{h%sRidAf@j8wSo?S#Z>Lxpn=IWe0#%;GgC-K=%V{Rb^N_y*pZK20|OLbo=?^L|G3H)4S|*?n*^ zvy=CE?Z99c5_xQJG9xcyn0|T>{j+ZOQ*-KMV2nYF&2usqO4RW0$xD4=(^E9(A}Jek z0ka+D;Vrf#Bpv)W@=tG}^qV(+j~K0efd8EX*<797+H&!u{%^Q&>hUj*4Paga5X*F6 zVPsADpL^ve7aRhw){5+VecDSChnlC@Y*AJ5XJ_uRGBPps^@6g>cRzc|D##?{E|Y%w zs-z5q6WOBVb#~{SuF_(i*3sKe&HKlxC*w|=mUSHZ7Z&IHT);Fds#?{tLT=DD`i*)? zr7i01LsX>-L(xkM#iDJ1;4K7PtfV0}gWV@IRL{)Z;;1<|}}E(9e0j`M@Qz{zY=NC`Yf`YoT|)C(a`1*7{f?^=$YomHd~P6WE7Ouqbd zr1Xm-=+}jTSK))E(M!joq(-!}FlI+d&oQNSxZ_na&|MGi)T5ufh$pgE4$U5pPg|>i z@6ZgE<{ztsocDg@0Y()4ee4>WjiA4C$t)`EA#HhOh zyR^C_%cK7Zus6qFfyxGm5*TGkUkrmJpeYCo)6=4PDY$N35bM;aT(=R0+D%a3z15y^ zTmKGu(eapK={7E99sg+u>_dX1xE4fF-6cHvqSjr&b2%k}Zi*}UcK30`ZpXBfLY!G2 zi(l-!tW2)`FJC%6t(nT-XV6A{UNlTjm8y9)cZO9?+8=Z-VUqK8 z_R<_3rl$G#;#JnyFL@q|Rk9CMXzXm;YAcOLugGE$2vJTKMns&NzE6{NiKe}`p`j+b z)mkRYe&>q<#c#3BLqhL}wimciU*&T9hJ2X}eVX;neJbQ<+(b2LeLmHH+MLx^_Z2h| zuGUAns_GiD^H%Y8PJXfWNgOYgQxl^Wu-0Sg_INCk+l50RqdM`1x7xChC{Ltzk3^lM z3;!-LbQUmr>Mqm@{5jy__WI-dRlJ%bkYCEP8G&HmG_0uhQM&5_!EYJWUk>rdVIfhp z%((a1tmg_b|fq{B=ZxA;A5Km5CzNvYrzdu37$=$EKUU6qu9jNl$6W=F@t*vg4OmVbe zU-JVx9)+8m=*&3BR-6$Y0a?K9J!`+^we7=|K0n{5UD0&$bjO=kvj*&It~<{bc5W3B zh@w270%xWYwYX<4mQM}0uH$9gX4o{W5I!PmkA0p4bBGq}RE1~F9uH=gn&rwzG zPJo?JvAwRiJU*y2eQMDm6lv11>+oZ6dQj;GHbeCxoxh-hYa>rWZ2)HtZ{}$6iNu`! zp=TK#X#QN6m{tf7Yh>+Ov>ehQwx9mdGBWrsA6@!hlqD7z(*tCha;Lj|zQk90KAEYp z49SMBsbCVEaLz-FEb8VDFs3Ed%05#sj}sGKO^zUjRUQ$HFx^%t=Q%D!y2d(IT> zHJ&n(?wIc1CcJ&-kiP9>^>`!B)Y~XI5vAsI|0HoDx0l~OX~-bIx%2!*H@|%tBhJ4# z7j^c3g=POYdm!Y?(R{^33UV>7$09FRLg|3VIucCP84&M3G-klz3Gz-{NffsWP8(L< zwTZ*|kj1;Q96VL|e%E<{CZ~e@pzB*+^Xr^lB!A!Lk`|)v=st3S3Gqd#U zFYzKE(ii}xY zvX7f6%`MYAH>YJZE5_#mRyO!@2NV5>WP!*;pWo za^4y6JEV}}yxe@58ILu1j2e)0pwMp#V+p1LYWlDwAs>9QZ0ktkA|?68a#5Zn5$F83 z5C1N${QC09X`m|5RCCd;?gCMyPKoc&#+WVhs1UiZ-1g4|7N)<#EIUvcM^?3r`iXy| zv8LP&oB>f!lCaGcAD8_>`^S;U61u&@dr-AdP=zgrdExmp$Z~=`-Zhj4sp=epubDFW z-rin0x%_2ksEC5bjcsbN_bTCZ^Uh1{gBr7uk+N@3Buqdf9iE9Cb2B^^My2@80P`{` z|NecVOt3O3mMro6G>*fYy@aEdt%v7}p>$Apwn3j;|6L;aHN{M+O=;^0lu)HTi&Dlk2E884S(n?H^OYwsJD0<{^= zed8xIArfU4y##7Z?30&kmO5`K#xFjeoyAsopQvj8*b>n`-=d03Nb8qV2|0@R^o=3q zy}jSZ{>gOfQW9o>Z6%#R$eQJa-a|mgsmr44dnp545GCL7@jG1Ud&kY4lJTWfOqVXP z8Lgj#o-w2x?T+3=3)ifRt(*wGlLe+6GDKZ;>Rn`$vqf$b`VSlWPTxf%x^7w7C7anq zauJdMof@tThqxR8NS&*(QXvwl7Hxy7j)ZDz%1SgyEtQW$WO%Pa(#_5fZdpvaZn%`p z;QU9^fMgt4*%~YcVLIh^+mUfAhD{8+)H4pP!N~?{BUM`OX7A^iIT7{*1 zopLBqT3>`~6SgU9m{>$5H=>bHL!{nWh&9RE=9LB4%rxD(=esKceIH!s!3lwl#`jFm zYDqS2pb>vPB&2==U~>mrf)p|*y4xyytLwUZA%}n>bDP1vb% z?ir0q*2sIlO$H=f{C;u58MmMDRZFyW=yRAa?MOnnA5;f+38~{l_;$G1AS#9hX1Vej zib{AP^Y?YeU>_cxNaMx?XwOelQr%lh<+qRPr+L}8+n9Qa(^3=qg09)<+R`jkBMjD` z$R({yFzzy6c7s^?plTggWcEjwu5WMuDV9O>x%W@c0Ge;d-fxD9P4M2z{+@r!sU-EA zT|`6}`DLuKx3_o9C6|tiCj5!8d)bBWeq2Xf>YU_#!V8M?kC#Ms-*qVpg+1ir;^UUl zf9>-O7pMiCR};o2#(Nicqh+mCae)pa1{g0XEGYzNB@s<0t_}9CX0hk?E!R>n|ZP`mkSr#4RU;M9<)n=i`idobA{-zMsN(urLV zAK!&IAhBsA!*YvP@TDXn^9o61q^*NoqB2f~zk@15n#5Lc)AfwYhqB3i1jM1qA^o#it>2nkK3 z*oACT@-6$GlPLtO7&atz2p%0!y6L<<6XSS;65kR!aXCa$J;Bb-Sj9T>PB}H(ACs<_ z9)Z|@+(n5Pu0=m#e6*@`;2mw7trI_Yk+}+?6f{}`UIIHTrdY!pta^i`;!cfFV2Cgc z@sI=)UqC4u^O6UuvNid)Z_{!MGFbvkMKqg5w4SeJrURmx z#JIRw@fR;%F8}@dJnralWTj!3s26z9V)>ibNpB?IJZsCDw0)K08`ki!ZrSAi(hB!W z)i2n;kAS=n)Si))Vb;n>{m)}+6d?0ma#JxnuO!0ZE2mR>Qui| zOd4|h!z1`7{w23&g;Rw{UqhQ%@QWIwW)l}Wjt1|+7hOCdR1g;9bogME$H;ezi59O#cD0!cN2htvNuSOPpD%GaF-EC_GnFyReTftS3&0Q zaJN3mOHbYqDf_c-y_8UFhUhaq2zec0y_GM($_CNsLp%52t=@?iKV~lzqEmLkzg(}R z4T3p{rX+XNI!1oixWL(fQ08r%cRG$Py&e*hrp2`FNx72pAep(VAKwc5VxPVa=@1ZimD{N2JS1Bezuq$yb>(!EId3oKcGbO?RC&}GL zgPjb)&PP!a^qciUevEW2H?cs@B2hV`@6JW7=nHde1|*v3nA`t0K)oTwdJc-7eQA<` zc#>N~u(FWU)90K7!1d90BM2ACX)4MC|KJC_fLp&>2`)sGq`G+MU0N%J@?<-aKyFiN z7NAbZ&9(FT;-fNa+ybTo<{r2Q@hkX5uuqDplXakm*J(c`^7$(MyP=QX^NuLc(@5Uc z$BBr3FsaUq0d)_&WM!TEf89Tb#N2*m$U>EK28DnrC2-gZ-jF6u8nZSm!J-SQoD!xF zrsaX^WbK}W(kgk3Cy`?d^6>5&>C8KwqAU^TTkk5{j30vF;A8apM5{3GNvL;C%(Lun zx4*yekh^MXYQd}-f0vfjQ}B`jZ>PTFNkh6}CwJihWk*LxYZ_p87ypwL7C2wWXMVeC zKRjOV>OAui4p75LYJ4Jx2M1fOB;hXFw-@#IjZ0u|M2|2rAD_!Pad`RdeSbw-WJME= zc-)smW)B?Qqe*ym;Ai4C_KB`LZOpZEcv!FCtM^X(sdvdjDxODI`_>1nqz)@95V8iA;g93{Ma2%&SO~VK@U}o2nMM36?%dWY`B?50ARZV8%xQ zQnga|XnbE7-f3knxRlfm2?J&-M}e8jU;k8jKstkZ^1FWDCHiF|Zke{GPU*p1P3N9UErsSAy~kAkGJC^>&AKM`#3>BRUX zKTA37me63V(PGNU)}(wD`-7F)pUvyel{}Y!)8d!OMGAmu0yoS21OnkeV!&jG75?d) z#n&z+k`Pz$ytp(&1L95k{DqeODfiA0m22MiLH$J>BE+n)Gk1=EhxrR>vxIiN^kQ@N z2fWjI28%a_(~W+CTLe7dDyPNt&6(0`#=(2D(Mv{}{`fU$?)a8Nan1A!okLZBG|xR} zsvy{_pn;^J^PHjA(TZ!u=d+H8FaUBIKxa4)##+K86@VbB|L?x_cbGri{Gfy7Hs-Ea zQ}3gXK&g~;pL3+&F3bJv8akk3_daP@{mvlTY&}!V@grHyO_fXMYs3A=^Wy2v=`1&m zt)YUR)3_9h`w?bqEQa0vDks~kV1p;N#eH@h&7J!|8=QqS1U!Z@Y)VyR0{}i4L`!}) zPvqgk;c7l`zHS<1Pn4ka6lQR(|Wg)Z*BgAu{`?c5@=owd>P~(Cwmt1xDbX<+c9U zMc7fV#Mw&pwPHpRp{pVIftUBRf|7h&aQwHZY1g3X>1j-1IM|;UE`hh3p8R_}xOfXo zrVMF`Ecl?N5w-hmT7())1yjE8`ihMhKM|7c^!=bal|ScxWh*w@Z=97oW*XW>{raR% zN_|RVCFh07W9%<&d?D?smi=@A;-EK)-r9eyzER>sLr3~hIQ`&G2@w9}XY$}tO?TYv ze)YnO1#V?;*_Q8LZRzn3^J-Sm-ow2S9#sUq0+~OwkVGZ|>QXuDKLK6(KZ~>v2(EAG zTB;Q*ER>WD7laqrqFRZA3_sn;cVFW}NW_SNyaA4A`L=7MHe@Nq#-^!K{GjMH*Vevxr4!530k);{|Dv-@`%g158VxQ^9 zhlP-QkzNs+^m1ZECgV#Tp$fVSw_}HtmF5Hq`jq%f)8@sUv2;fy8kOQf;gWS1;3R}jz zs^*8D7_A^Z|&c)Fkf48|j>?Gyi8FDT;^kWK30~klfw+nZy0NG|tc`f18a=Y?Tph2m0Z**Yi z&7-V)6XkH%n0z@+t@%c!TM?5l``(3n8C{S+D^J0}&h|~^H_7H4CmCzS=qU3jrF-bR>S3nBdR0_1C`s+f6CC|MH zL)o@VM9!5GNxo0vlRe->g~YQ2*r$Wwpghz{Bv9lJbuk_VpM(OvV9i`t#Wf6fB~C3q zPp=nB3DFtE1=_?6%t-G5@z|HJYy!g;px_TnBfqCI@Ic)W7##7Z(a(EJ#eHS1#BG93 zQ@XCE8wC?hZ-6;QP~-lrHhC;I-93eQ^UlN~oY$rLo0QbzmeQf2P}IxxO%0H)tL2n7KRrpf_HbG)x zWn9~bZ!ic@;RSGkC=y9`5-mSprvNCzF)!i~1}<1@_L24yIZSoCzJpphB_o%ISNqkf z>law$qC#Nb58M-jBs3c(%$WVepHZ*XnV1)vM41#sdnu_MKR?`d&6vSE>E0-8)2P=W zi+%JzEvU%3#)|t}^GwH`w#bo}17u0~?RUcyvk~2e>7yt}p~KVv}B~;$WID*ZbDE&hZM=)4Q>8 z%#SVN&|=pVa(P`PbBKe|da>;>=}OT&ZKQwUify(f!3>)G9tWlkJ*GEJFt_d~=!)3S zmR_I_?Uh;lyeYSm^hYDFd^?-70lN1N_Y=1$bg?3&yMM_5K=2+5nPjA#F0M@XL5oaT zR#&zmc6H5uYE`-I?gt_I8+A&WrA}!Uh7*m@@1^k(3pE2|NN@2lqAs$;JcpeP`h;eE z+{5Cvdpd_D02;RBNfOg8Y~<&iNz5PWxD#^eJ&X!Z3OAElPPbdhDbG_fm6OH0qH6@Q z`SKsMo9TbYf#BqylMLMyX>!`wKs*d(0o9K1nVjjW^g|p@U|voH*18QEqhAgJtB4iQ z$FuSOEy79=(|^$*Th`BjkQvSEnkKeL6AY?y86Y2*8~&Ia4bk=YbXX*PY%PdajYqeK{M#h-S4Z~6#g^R7W^7AYxC90nRPSDlkAPyIF=7!Az< z>t%I6`ySAjPimQ`;kO0h-+h8z4jt~8dR^*#e_1YW|MGzZ6NrT2S>S>!A9B{HAqwx1 zb`NUc$$xv7>`Im|@-gQaBI5M^qqX;O`9Vo;#Kb2}k>WWa-6EYfO>-HG)r(7Zs)x~c zC{D!KYYL!`FPnYlEEtcEvwp_Va3I@_Q;35Cfw(%R$EX+VvQai1aJlBOGwB?p{Ls!h z%>sCQLVf;N^L}H5-Dnu_NK8rexUWBNO2H5=tFvZyo5^vVG49$v@HbwW#GbV27v4Xw z7SD`7szo^8HR*cI@&v$gLF!|`=y1!?(I<=}S^K0ta4oX)JKjJEe&Rm16m$L2piisw zV|(s65>sQZ-IVOwQTs41(X9^LZxg+gvG{aT^`c`X$yy=Ae>6px z5SxxmO@u{*V3j_}@8(eA%JzuDDf&2tosl=WGU8K}{aI=deRRtn|J30~JCU=iWH-XutQiBj$5* zJJ0AMC$tDK+WJYEJY;}a{pl%cM6{>1l@nh)yA`q)$R<3Vuy!x&kyg#IUVeA`|52_p zSf&@;Q<2=IUM0Jjs$W%8ieUpkokOeiJwf}}9R%Eumc`>9j-RWk8M$LRo=e*AXk|6|crEc{B%-4N7-e|&M7u};cu*_T(N21;862$p zJ4vFe7o2wUd3FX8s&gOW^U+C@Mx1~Rx@XBboF!Wm$QXVfJ`+TMSpWWzxOBg9ptnaA zS>g{3YFkS3yEgv`2)bl6Z-A}=UCliBE%$kIb?Bvvk1X=ucr;Y~S!k~?2#Njjt)a=J zcz)*y>{aDMjs?TjRDvMyJCo<4GmXZyS<^?2_>j7ZuUbb{6| zVSE-OXP!Pk&sy`oS>K0Wk<=DSP|dCGk8kcJ@UY&Y_~}FX;T#03tmPFA-__MC+&sqE z(Q>GGQ+Cs)O;DtS_B*xFuIR9AD&2FbP~iPDmpQ;!5p$7S|9@*i!$#$=;(y-CyWZMp zW2c1&emoBT8D>6t^T3#u23kSWm8R6x?6)`l?uqdI#Z=%f8hC40Eq{z5U_fGe^Q~ku zJL246Lw=*J9)>F$Q|yWUR_>sQ(uPBp>ga8h!sSC&o3COG^neUV4A06yrwyYP@{Syy z2Qbpb_p z;pazf8nxG}U&J)~(gBC+u2Ro^{kn5eO?9RSHZLEpDq8)zUUf5wZpb{ZLUr>g1(~2V z{sg|J64Gz*(Nr7%J=?X@k^YVYK)#c;%fjU?6*BM9gz4)_a9eZy+mSC;w^Zw@(4a4* zlvDvOf}j;aT*z4CAO7qEvQBDFhpk~ORemlk(a@=Y zw5vDjEH&yI0|sLRh^GHp6Lta-UBc4r+6FCbJH02;Cfh2ZWx5QA#Ickt{R(vdv@VWF zLg;xf%6X#DXV_i6csv{xM zN@a83CL?(6<9FS&J?JO<0UmMJw{CJS6Qn#`QLTxBWm`*R>EC zFUVXaqyDvXN0PO-g;R~rsQtT&B-8~s!tG2c9&f(p#o{Z?WklGP#U)$Z%-EUW z?;CF0ekpcH2kNgyO|!?UG?<#7o{20p!&ChQMs;^0~prBF!r=v8{-(?e9NVeq^${T?U>B3~nXOfs&%(`Us38&z z;FoUw9ApUXvV9NjAD^o5*ViYzR}5P=uHB(I?kDeuLd(px>!x40c5?aLHvxkrP@?Dq z&{0GtkD~Wu)TOJ7h))Mcm#xuUx~5&sm5QWk+m&o}^nMj_dsn1#$^B!`ep*1u;?q2_ z`_(Qol(>3yj_#w0Avd{qEsYGk+cQGgq~11+=Vbo?9UEO36E`ZnNZANDm(KuhAr5d= zAlYscCSgcn>vT%K8Sa@#ak_SZOV65HsNsVX9}bXHEpWLm+OH{LCY2%J#ZJQVnEiFL zj=?&dY$-4;6?#&X$zHxy|nnPS&ZqP50C zxoBC=cR1m9>LDia5z=kmf44Kjr0g)BOSo0Yun*VM&Ub5V_JFU`h&FU-4^Rpoj6^UQ zbiw*-ugmJEYI+Dh8HRlz!Fr*iits^?4cObqtN`Q#vDWB|k*1`(L1Do4Zf}Zuwy{gp z45dXnX|h9->fDCn03iWDcJlF3x7U~fyRD`kcE9gwaUhrw@nA7<9_MsOZTmVcZo!Au zsVYKtb2;rEuidHe`mX*di#+RVPm|CBIO@S4f<)z2`_M0o*MLjV9rZrlB?~g&=y!RndV0u3*tIZlrKS=9 z=MDfh#yDgHpxRg^Wmq^5XpNMwLU7R7t@f83PTp+E-q_L!%}GP4LqtJ2I0TOZ`->i$ zU_mfl@>SGyvZV+SClgQ$!jDJBqrh)^dbh1EDWO-7kB7Ijs)azcmT>0WK&krhm~%-j zVe-BP33YjFRf4$-Vk8J>Xgaw7%1Mv zbP_=b^o8js*-cG|IA9R)gD1RFRnkB1f7zSD&@hl2dQy{WZFMdub*73C*wF#x`%;de zstG+j@FzL_1G5_9KcsK*acSh*snbpkeWtdF=r(@F(}?(T*b_>&0!+G3_4|>oJ6)iz zpY^wvb)harwj!7LOP<53!xyc>C%A|B@XCLYbLDx?Yl8-WbsG>S1O6K(Wjyw#*_`Gw z#Z)*Kiycr+KUlg4^52XB`Bey<*jvnx4`VhT z&a{@{95sm{YT;FX{_&sSJe1iO$@!{4dmVP+xyEw4SJ|&-d+>Z?n=GNt2czx&YJ=cj^jF}tAt(0rc3T#9=hwc=(dOg8Xs=ua^;HmGR4iMeEq4L%=swkQv zCGs@z4)#xbi1q&Sro#0c=W;(cl3x)d2|LcL!h*`i+FXe^d0tS9ttuf4S}A9{=mA?N z7HYHLB-hVNp)OkNu4XHyU*drl1cOoluIp-gTb>I>w!ww=lf|dWNl9|R%dKmeF%Ve= zg$Jl>Tw>Y;p!yp+ovU|=C!!Gy^7hlwNz2X8_iW~3XO9OQZp!AOH|bW18>6WO7y(;u zLew=d-W!+YdvZPczSO$ZCWKw&UHp2dfi2FJ z<)??#YXY>KYy7&89|2$vFX8=cxIaLlZMxI7DZjM$$ry))Wrwx!&68e(t9xityiP77 zp2sDQs#WpXC=A0lYuWXd*dOGi2L3QxNGjw>NJZc<@u~dj`4*S`&?R$T0!HJ^E)3nR z2>kvC^0Gwx!XWTX0uhAC?Px)jyHL#u`0bqX%(~A)!=*U8M~Cv^zwiSYlTJ5pxfs=i7b`S6E^mb0&0PPIWt-dh z0pf~gcNDGc|IPm-+7aLOn7gylXWOCz04QFFrzOu9EH1r+e-(q%2ji`vI5aBRPk!~G$3R}Jl<$0Bi$(t3|q2rSt?WIST?ldWF z{CrKv5$ngFy3H075(gI%97pPlZ17r~^!!4-HSp+n+-%Q3T;{OFOBq(b#vd;z~aEK02T0vq0Uw_(oyrJq+tXh>VIegzgosCPu7JMU4Z#A}z8b1KN zg4w1U(Au7WAap0Pir=nZpK zM)NxTSda&?dw{~%0!~$D<9WY+u>i~3xl%0BsGh0RC9^N(A7zcpF&eQnE}sW|3QJ90 zL(Rchhv5SAxd`(_*?PxDCZbDTSiq6}5gjA56 zvRM*D0v-_L@KufJnPK0WzF(d~hFFh9A74;>J~Cwm4`<_Nj0dV&=fe2B4(Cw)yG?vU zVy4FfL1i;DB1VROocikwE|l2p=K0Kw#4v@hhPsoJX7Nbh2ZQokgv3}cp}{3G(30{t zE!n$rpusi_pOFEqp$h#w{p|;8P<^qa@(w~9hrs_eHcZ%r&rXsx3eNWDJg_=m5W5hz zN!6BYDf#6)b94TBwbLS%s)3HV7oG1a+^ER0_=nCknlJ!KS6jp|@4g$RQFDtS8vng? z^qRzV{< z=??m7O<%&l?~LC?wWwgYt!>ir(2Ys_r)acoK(8NZW4>=Dk$P^6QkXgL3{)}#qPa2% zI5;Qf=1%!t|0|y{TH|Bhdsz^@{oev?GR%l5tC8U6_@^*&5TYDq|B;n#iszMU|6&mF ziDUU-3z4mV%ekWtfO?>q@cA@_2F@YecyRX+jY!b_>=)3LeL1pasg)~PrZ_3MFz1G} z9H3M35x)Gbq1W|{Ak=3Sn;(EKSBVmT+^^V}Rp{g7l;?NI+^_R^)3!$0O)u;qAhF(Wry!X1yPCt{i&_s3Ew(n>**m+1E17C zZK9ny-aAsa3U{TjXVfghw`u@sMfp5{d~NAo;OLtURGf}AfB1$q7b2>pY>ePp(=ize z?c`AM$B2plS(u^#2puHSWyP}`(~YXabboahCGCR5!C{Qn?=?g(L+amZJsmrwgMGyi zY{+E4>-?o9TH346_z&M_@D++Py~h5b?9#n+o(g0Yg%q(K8=5Rzd(MRNCi_!w`x?9A zN9upJCL&`%2)gND_2SE5h&bq8Dhh{jJpiGjHE%_C5JISI3(Cae(b`!7v|aq84_e<- z$E(EK+m}6vqUsE&wj0$HW&^_OA(UsNh8HIS7bQM*f2k_u(K(KKor8d+ z3Uc5k%v0k@HN{+AQf)t4L4sU#btZct63TDRUk&L_h%N1`HMjCFzY)4Bz1P)Y7m?Bc zw2vMqLyh+4ifbgD0nVt&^Y7o-T}^%-5VvrTv;PV;sWMG-tKzC08cRFSW3;v%85zM$ zFTr{LV`+o2XahWLUVC539N#@{me4#VhEn*yTDtean?4fq{NvrXB_vp^!?z)KM^wRg z#6glZ+h`=BHm?@4ML9HCVNdKuo4!LtrcP6I1l^L|{B%->g5|j3&|$+go_`8%E=Et> z?Fl`kDH!iJqp`$a`2Hcm zgZ7F>>Blym-68hbk>gK2Telji4jZ|P8H+z+_$xz^?sV%3y%inUuSV$H2!XVb?6af`$)wd zD7*226Q}ZD$=SaL3rG|-FS~78|KO@T6X(zAry*)|H!7_p4HD)i3VH>eC<}S?RiTwi zzvQiEwRp@9*#`F*Jk-t}Y~K3%TOFYF)o&8ENcFUJu>KNqtl(#sw5;b+ogGbk zPp6%MRNbRkVzo4FZQNB^bH~w|r=Xn+J`?yo#$)05!ZETeNuQSiJ0iTgnc>lzh>>vT z_|B-|dVcwc%jZ>8#r;!bF=d<{VWsb<9fHIcQyU%!F2cru!VWQ$D zFfUcP0O2Xz6(~|g3|VT7f-5E5Y`C#ywjfp7?Y#aYi;sdVw;-46u5O^1+5kqJD73`) zUco4DH5oh@Ymh-d1L>rbn|qtU>iK==J8Q=BXVOSI6V1zmVjqAFe->dI!}fD@YBnwe_`B*fcZr4NT|Z4Aso`Lgda~EdF^SZIUv5CC&slxVpezGLe-9 zo`%Cu>$=UNt~=p4I9}xHT|3|`s!%RKr@WyYZE~nf^>Nbwy6dE5jbZTE+YRRxlp|;F z@BbZ|NL0o~O8RspoDl41gOpw(DzPW@c0S3o7tOKlYNKfWq$n)N2&O_*pl^viR;b3w;@x+o)++GZT z6@ibtH#R6=j|}G%f=R`vI!fo#d?ONxN{_nBTj&IHXF_#9-NEfLj+dk?nx!!iU!iL# z$EomJ)Yu`qIm2gV_!(^S+41Qe40^!AJ*Jg{TTFoN(&B!n)j|Zx6gD6`60E_9C7vpq zy6rHS20`?vzP-2inf;EHAi6NzJ2<)TP*02=hw%md0QBdIFy^^I?iAp99>U@9y$ey1 zrj>whO!^%7pL6oS;bTR7;tsZf4uAMw397^@5;VxunPmV45VTPN(>^FY8`DDNdI2FR{`&WN@-`_h zU~DbQ7M>rSffyvn_;H?dU!K^c$@3a+ce3{fSC}jzK*e+`nh2hV0Y-+p?C0{HyC&wg zIW`w2c|72fCi}k|E+GA8UZFy|)68}Y5egutDpT;iyCq)^SspLd>SL;xHWd(}ALz9D zIaBDyrarCYHtkryZBCJVH9#i#LbJ5DVNq_w9*;sA!7IOTSeY;RM^-YOk0vCI+dfVZ zS*(}^YC?>z*61?`U@w7VeiU7)yKqznym+rS7T2n)yr|V=fFn$Wcd&_Cv|KIbmQuSAme#%7D|&>*xAa` zA6Fzag#>~o`eC_14pN_le_A1hKnP%-@gbk7>4QuuLL}&mdX*@9h>|2J!DUM4Kn3ac zcy8u5HGO~YK->Vk{&rpDP){JKGsr8Vk( zsFWgY4RHhg@P`6mO2Mqo>;GfxtD~Z9yM7VLL0}XRq*0NQ?rs&3W&r7w?vO?rk&==w z$)P(10R;pEq+v*r9JpbT>^N*~>S^_iob?v=>wO<)Zvd{kMs6HK^?CM!~ z{DaAV3`$ZiIZlu9V`C2cP!KoJ2Db=%1CuZDi9j*K>ucPhn8F6;I z3r7=JxUxT!YHmGgiBQ%o?`bVY57ySy`Yz=`=-7hvn8{M`BG_KHwxc2Ycx9+JX|g80 zvOmn?`QHcsuIko1fI3E4p@di9i(Kshd48NGv`%S-0#@fz*C52lp;rYup;kDm8yvWu zloPS{l02uiyK&(J)0k=Uv*Q_yzXF;JPB)S~iiFG>N+Ir|zaj1^T_Ufw`DgYwG;ISk zupxz#4fsx&ZP8kAr>SjhdtD$|gn5=Q8M9U5A7b|4ABI*fC7Y%TC=XW;%G3B$5+a*| ze7^|!VEVYiI5qmK)51#ApSnf$y_~poV*5o2p_j-jk@=qNMH+k@P_*d0t z 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 literal 125290 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%0A>Xc9z?cRGb8@nE6T5x?!iQ^Lo9HD!V*qRINPk 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

C`lm{OZXHWX>8M92sR(VQsANC!ph^Y> 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 diff --git a/docs/images/readme/architecture.png b/docs/images/readme/architecture.png index b4d5976b68180c9d98b16b88403d508b3a10391a..6d0b648d07bacf42e2842ee0529a50b16ab718ec 100644 GIT binary patch literal 211660 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�h%5;Kf@dKGouu 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 Date: Wed, 4 Feb 2026 18:28:21 +0530 Subject: [PATCH 002/225] agent framework v2 changes --- src/backend/pyproject.toml | 26 +- src/backend/uv.lock | 1026 ++--------------- src/backend/v4/callbacks/response_handlers.py | 30 +- .../v4/magentic_agents/common/lifecycle.py | 53 +- .../v4/magentic_agents/foundry_agent.py | 14 +- src/backend/v4/magentic_agents/proxy_agent.py | 26 +- .../orchestration/human_approval_manager.py | 6 +- .../v4/orchestration/orchestration_manager.py | 154 ++- 8 files changed, 276 insertions(+), 1059 deletions(-) diff --git a/src/backend/pyproject.toml b/src/backend/pyproject.toml index d176467f5..7750638dd 100644 --- a/src/backend/pyproject.toml +++ b/src/backend/pyproject.toml @@ -7,21 +7,20 @@ requires-python = ">=3.11" dependencies = [ "azure-ai-evaluation==1.11.0", "azure-ai-inference==1.0.0b9", - "azure-ai-projects==1.0.0", - "azure-ai-agents==1.2.0b5", + "azure-ai-projects==2.0.0b3", "azure-cosmos==4.9.0", "azure-identity==1.24.0", "azure-monitor-events-extension==0.1.0", - "azure-monitor-opentelemetry==1.7.0", + "azure-monitor-opentelemetry>=1.8.0", "azure-search-documents==11.5.3", "fastapi==0.116.1", - "openai==1.105.0", - "opentelemetry-api==1.36.0", - "opentelemetry-exporter-otlp-proto-grpc==1.36.0", - "opentelemetry-exporter-otlp-proto-http==1.36.0", - "opentelemetry-instrumentation-fastapi==0.57b0", - "opentelemetry-instrumentation-openai==0.46.2", - "opentelemetry-sdk==1.36.0", + "openai>=2.8.0", + "opentelemetry-api>=1.39.0", + "opentelemetry-exporter-otlp-proto-grpc>=1.39.0", + "opentelemetry-exporter-otlp-proto-http>=1.39.0", + "opentelemetry-instrumentation-fastapi>=0.57b0", + "opentelemetry-instrumentation-openai>=0.46.2", + "opentelemetry-sdk>=1.39.0", "pytest==8.4.1", "pytest-asyncio==0.24.0", "pytest-cov==5.0.0", @@ -31,6 +30,7 @@ dependencies = [ "uvicorn==0.35.0", "pylint-pydantic==0.3.5", "pexpect==4.9.0", - "mcp==1.13.1", - "agent-framework>=1.0.0b251105", -] + "mcp>=1.24.0,<2", + "agent-framework-azure-ai==1.0.0b260130", + "agent-framework-core==1.0.0b260130" +] \ No newline at end of file diff --git a/src/backend/uv.lock b/src/backend/uv.lock index 73a5e2e5c..526fe789a 100644 --- a/src/backend/uv.lock +++ b/src/backend/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 2 +revision = 3 requires-python = ">=3.11" resolution-markers = [ "python_full_version >= '3.13'", @@ -7,101 +7,9 @@ resolution-markers = [ "python_full_version < '3.12'", ] -[[package]] -name = "a2a-sdk" -version = "0.3.11" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "google-api-core" }, - { name = "httpx" }, - { name = "httpx-sse" }, - { name = "protobuf" }, - { name = "pydantic" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/11/2c/6eff205080a4fb3937745f0bab4ff58716cdcc524acd077a493612d34336/a2a_sdk-0.3.11.tar.gz", hash = "sha256:194a6184d3e5c1c5d8941eb64fb33c346df3ebbec754effed8403f253bedb085", size = 226923, upload-time = "2025-11-07T11:05:38.496Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/00/f9/3e633485a3f23f5b3e04a7f0d3e690ae918fd1252941e8107c7593d882f1/a2a_sdk-0.3.11-py3-none-any.whl", hash = "sha256:f57673d5f38b3e0eb7c5b57e7dc126404d02c54c90692395ab4fd06aaa80cc8f", size = 140381, upload-time = "2025-11-07T11:05:37.093Z" }, -] - -[[package]] -name = "ag-ui-protocol" -version = "0.1.10" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pydantic" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/67/bb/5a5ec893eea5805fb9a3db76a9888c3429710dfb6f24bbb37568f2cf7320/ag_ui_protocol-0.1.10.tar.gz", hash = "sha256:3213991c6b2eb24bb1a8c362ee270c16705a07a4c5962267a083d0959ed894f4", size = 6945, upload-time = "2025-11-06T15:17:17.068Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/78/eb55fabaab41abc53f52c0918a9a8c0f747807e5306273f51120fd695957/ag_ui_protocol-0.1.10-py3-none-any.whl", hash = "sha256:c81e6981f30aabdf97a7ee312bfd4df0cd38e718d9fc10019c7d438128b93ab5", size = 7889, upload-time = "2025-11-06T15:17:15.325Z" }, -] - -[[package]] -name = "agent-framework" -version = "1.0.0b251108" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "agent-framework-a2a" }, - { name = "agent-framework-ag-ui" }, - { name = "agent-framework-anthropic" }, - { name = "agent-framework-azure-ai" }, - { name = "agent-framework-chatkit" }, - { name = "agent-framework-copilotstudio" }, - { name = "agent-framework-core" }, - { name = "agent-framework-devui" }, - { name = "agent-framework-lab" }, - { name = "agent-framework-mem0" }, - { name = "agent-framework-purview" }, - { name = "agent-framework-redis" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/36/6a/8e467a13b06471f300236d3caa29370be355cd9cbc6169f2bc93e780d24e/agent_framework-1.0.0b251108.tar.gz", hash = "sha256:456c5aa6b03ad0c3545eca3f0460d94eb51eb2f7a3827530ac7cb6203ff2adc8", size = 2408664, upload-time = "2025-11-08T18:17:30.388Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/35/4d384facf5a8af7a3a0830ab38cbbfa0140c1abdb494a4ec4ed4dc1b3092/agent_framework-1.0.0b251108-py3-none-any.whl", hash = "sha256:faaacbb7af156084847df39a7a7e4151198fa4f00271c742672e202466d796cf", size = 5613, upload-time = "2025-11-08T18:17:28.547Z" }, -] - -[[package]] -name = "agent-framework-a2a" -version = "1.0.0b251108" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "a2a-sdk" }, - { name = "agent-framework-core" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e7/3c/ede80d6f004888c6b1d2f014215a78e9e9325ec6789c73ceb32e63e196f9/agent_framework_a2a-1.0.0b251108.tar.gz", hash = "sha256:4799cbf6be6314e4c8c1e1b6b4ab58dad771af3af555afb508ee1b485ae92896", size = 11023, upload-time = "2025-11-08T18:17:32.634Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/e2/4a8e7cef6cb32a752543f2c4cde39ece089ce758bd12659b6404bef88732/agent_framework_a2a-1.0.0b251108-py3-none-any.whl", hash = "sha256:0804719a7341a9f5caa90a3e83b8fd907e80166bfa52a2a82ab061ab58362a1b", size = 7035, upload-time = "2025-11-08T18:17:31.459Z" }, -] - -[[package]] -name = "agent-framework-ag-ui" -version = "1.0.0b251108" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "ag-ui-protocol" }, - { name = "agent-framework-core" }, - { name = "fastapi" }, - { name = "uvicorn" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/63/3e/f32ec6e059d3878cfd045a5e31a502f9016d3ec3b7a7633911d92640f134/agent_framework_ag_ui-1.0.0b251108.tar.gz", hash = "sha256:ff0b3471ce7c56a908dfed42e0484cbba034a471e9ae187f8d852a6677e34734", size = 57026, upload-time = "2025-11-08T18:17:34.422Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/42/d4/b2f31a8196b11d7af95ec7f33674877055e9868399caddf29afe184772f0/agent_framework_ag_ui-1.0.0b251108-py3-none-any.whl", hash = "sha256:974435f1c22d914f2e032603e7a50d5d8a02f960742dcd4cdaf1a69f0e08a3b3", size = 23387, upload-time = "2025-11-08T18:17:33.234Z" }, -] - -[[package]] -name = "agent-framework-anthropic" -version = "1.0.0b251108" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "agent-framework-core" }, - { name = "anthropic" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/d8/0e/2db7dc5be7aeab0cdafc00d90c2cb85eae17e7c0607ac312a02b42b424eb/agent_framework_anthropic-1.0.0b251108.tar.gz", hash = "sha256:b7b46bd735627587c58e429cc8f15cd7175c1aebb4a6b02128a2423fd07a7948", size = 13464, upload-time = "2025-11-08T18:17:36.18Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/9f/b852b795aa0a735577fb3823fca98027a260c68bd7d1f8e3820ff467b286/agent_framework_anthropic-1.0.0b251108-py3-none-any.whl", hash = "sha256:d7ce9d10338fea0ddfb7a20aa9b977f270ae63a5565287ecd89c3b0cc10d1c41", size = 8719, upload-time = "2025-11-08T18:17:35.083Z" }, -] - [[package]] name = "agent-framework-azure-ai" -version = "1.0.0b251108" +version = "1.0.0b260130" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "agent-framework-core" }, @@ -109,43 +17,20 @@ dependencies = [ { name = "azure-ai-agents" }, { name = "azure-ai-projects" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d8/18/29016d35185e51ad29b31f2089d66d0dbae11ecf02fe7707eab798dc8a48/agent_framework_azure_ai-1.0.0b251108.tar.gz", hash = "sha256:75fd77959f8e770338dacd41e6fc6698151a3c85abb5941e97d6581d8a7fd9e6", size = 25686, upload-time = "2025-11-08T18:17:38.174Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/48/db/725da2ad1467b54edc5d31ac64a3a46e0277cf9b6b7508aef1a2dc9b7360/agent_framework_azure_ai-1.0.0b251108-py3-none-any.whl", hash = "sha256:5957e90eb0ce3d4fde2d54cde53d01a44f4a3b242faedaca304a359a34d18f7b", size = 13655, upload-time = "2025-11-08T18:17:37.061Z" }, -] - -[[package]] -name = "agent-framework-chatkit" -version = "0.0.1a0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/0c/e7a14bb04393e65d04016ebf8dd61d4560f794a124df28923ee5afebbaa4/agent_framework_chatkit-0.0.1a0.tar.gz", hash = "sha256:7687daaab3f48be7f72dcd08cf60383afa488e42bc6ecb3825d1978bb72da28a", size = 1862, upload-time = "2025-10-07T18:31:22.111Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/36/ab/b7c1ca3ee7d88688d1cb7ff66957d319aa9056291a34eb39ebb1206d9985/agent_framework_chatkit-0.0.1a0-py3-none-any.whl", hash = "sha256:a9ab2dd40aa0e243119eec37f78f5d429bc3f08b835eb66725c2440360ff31de", size = 2240, upload-time = "2025-10-07T18:31:20.834Z" }, -] - -[[package]] -name = "agent-framework-copilotstudio" -version = "1.0.0b251108" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "agent-framework-core" }, - { name = "microsoft-agents-copilotstudio-client" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e2/d5/ffca3932aea23b79ebcdb51a9537971dc0344a36e0ae0c1605f87d51fc3e/agent_framework_copilotstudio-1.0.0b251108.tar.gz", hash = "sha256:464d3d36a9138372f463efc9e7dce24094162c5211eab45644bedaceb19c486a", size = 11985, upload-time = "2025-11-08T18:17:41.223Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ac/ef/69ead4fcd2c21608ce35353a507df23df51872552747f803c43d1d81f612/agent_framework_azure_ai-1.0.0b260130.tar.gz", hash = "sha256:c571275089a801f961370ba824568c8b02143b1a6bb5b1d78b97c6debdf4906f", size = 32723, upload-time = "2026-01-30T18:56:41.07Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/37/5d83bad31a2f15db1864eb6b10d18d5647c511f8a6214ce56423718b60b9/agent_framework_copilotstudio-1.0.0b251108-py3-none-any.whl", hash = "sha256:8f799a9b6fef126893ebbbefa5fc63676498093ccf415e025f30ca3bf83b2593", size = 8710, upload-time = "2025-11-08T18:17:40.433Z" }, + { url = "https://files.pythonhosted.org/packages/72/8f/a1467c352fed5eb6ebb9567109251cc39b5b3ebb5137a2d14c71fea51bc8/agent_framework_azure_ai-1.0.0b260130-py3-none-any.whl", hash = "sha256:87f0248fe6d4f2f4146f0a56a53527af6365d4a377dc2e3d56c37cbb9deae098", size = 38542, upload-time = "2026-01-30T19:01:12.102Z" }, ] [[package]] name = "agent-framework-core" -version = "1.0.0b251108" +version = "1.0.0b260130" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "azure-identity" }, { name = "mcp", extra = ["ws"] }, { name = "openai" }, { name = "opentelemetry-api" }, - { name = "opentelemetry-exporter-otlp-proto-grpc" }, { name = "opentelemetry-sdk" }, { name = "opentelemetry-semantic-conventions-ai" }, { name = "packaging" }, @@ -153,78 +38,9 @@ dependencies = [ { name = "pydantic-settings" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8b/75/bb7fad403146236ca70a6c5ebac500763381c457b1834cadd1eb0c864c9a/agent_framework_core-1.0.0b251108.tar.gz", hash = "sha256:4d7b0b301e46abdcce469d015194d9359dd10ae15ebe98014064ce00a08b5c2a", size = 463832, upload-time = "2025-11-08T18:17:43.486Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bb/65/64367c292402cf95ef9a91cd5007734d141b3b96eb8d3146f896efccfc72/agent_framework_core-1.0.0b251108-py3-none-any.whl", hash = "sha256:04392835292ab66c19f873ea3bd78c612ca3bc206792a8c272be250f53cff42b", size = 318092, upload-time = "2025-11-08T18:17:41.949Z" }, -] - -[[package]] -name = "agent-framework-devui" -version = "1.0.0b251108" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "agent-framework-core" }, - { name = "fastapi" }, - { name = "python-dotenv" }, - { name = "uvicorn", extra = ["standard"] }, -] -sdist = { url = "https://files.pythonhosted.org/packages/dc/b1/9e66dfcdd4405bc85aa2ab402b8b735460e182160579e23284c3e7308c01/agent_framework_devui-1.0.0b251108.tar.gz", hash = "sha256:b064165b499a8ff23ebd3956970251295a1a22857fbc5a918d7988a0fd428c89", size = 759911, upload-time = "2025-11-08T18:17:46.196Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/47/40601d0e349fbfbf80bedddcc6c556e53fee5555bd7b587ced9f20a004f0/agent_framework_devui-1.0.0b251108-py3-none-any.whl", hash = "sha256:d5564d969bab4dfaf96ad161abbdf456aed1efd7d8ff0953048724cf237c7e8f", size = 337466, upload-time = "2025-11-08T18:17:44.628Z" }, -] - -[[package]] -name = "agent-framework-lab" -version = "1.0.0b251024" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "agent-framework-core" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/05/c5/be86273cb3545651d0c8112ff9f38ae8fe13b740ce9b65b9be83ff2d70ee/agent_framework_lab-1.0.0b251024.tar.gz", hash = "sha256:4261cb595b6edfd4f30db613c1885c71b3dcfa2088cf29224d4f17b3ff956b2a", size = 23397, upload-time = "2025-10-24T18:13:48.58Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/26/0f/3974b2b1f6bf523ee3ced0886b6afd5ca8bbebd24aa5278ef77db0d3d765/agent_framework_lab-1.0.0b251024-py3-none-any.whl", hash = "sha256:1596408991a92fcacef4bb939305d2b59159517b707f48114105fc0dd46bfee7", size = 26589, upload-time = "2025-10-24T18:13:47.229Z" }, -] - -[[package]] -name = "agent-framework-mem0" -version = "1.0.0b251108" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "agent-framework-core" }, - { name = "mem0ai" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/db/4f/a56c83fbadb42be5edada9fcbb00f460dbb9ddf4b38c4956e16a3ed45b00/agent_framework_mem0-1.0.0b251108.tar.gz", hash = "sha256:742206230ffc780410c145e26f2cd6ccf9e1ac1b616db9ca3327b6be73d81ccc", size = 8045, upload-time = "2025-11-08T18:17:47.8Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4d/39/e508e778219bd6d20e023a6f48235861a639e3cf888776f9e873bbad3c6b/agent_framework_core-1.0.0b260130.tar.gz", hash = "sha256:030a5b2ced796eec6839c2dabad90b4bd1ea33d1026f3ed1813050a56ccfa4ec", size = 301823, upload-time = "2026-01-30T19:01:09.629Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/df/57/5203bc38cf2e7913c6ea10cfb9d6723884e071e4bc7e18e35d6d94c43c6a/agent_framework_mem0-1.0.0b251108-py3-none-any.whl", hash = "sha256:68a7277cc174886288d0cc98fc5459bc57a61332468aa516501d6a217150b023", size = 5302, upload-time = "2025-11-08T18:17:47.033Z" }, -] - -[[package]] -name = "agent-framework-purview" -version = "1.0.0b251108" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "agent-framework-core" }, - { name = "azure-core" }, - { name = "httpx" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/11/a8/fc24a829db5d3267633e7c8f4d0b9b03b7a15d4eca9e7e8402c59b5e7f22/agent_framework_purview-1.0.0b251108.tar.gz", hash = "sha256:42620e76614d52e7fd43cba4207a2d29844fd968338e3bf66da98a848eb51b2d", size = 39712, upload-time = "2025-11-08T18:17:49.849Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/01/48/31e0746054e7d1b257f096b111d02e330771647d3583c2011500e2c716e7/agent_framework_purview-1.0.0b251108-py3-none-any.whl", hash = "sha256:bc37ca695a3243f614a522a4d6428604919c99c62e029940cd47a10be725cbfb", size = 26271, upload-time = "2025-11-08T18:17:48.667Z" }, -] - -[[package]] -name = "agent-framework-redis" -version = "1.0.0b251108" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "agent-framework-core" }, - { name = "numpy" }, - { name = "redis" }, - { name = "redisvl" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/86/51/2234704e16833cd8fda9b8d810fea8b0ecf8e66f84f7b41ae42b063af788/agent_framework_redis-1.0.0b251108.tar.gz", hash = "sha256:e6a26b23982a888580e7a92011a3882ec76d523d49c9917ea16df950db70950e", size = 22726, upload-time = "2025-11-08T18:17:51.346Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/42/0eb6a4051b10654de1fbe63e15784e0682427b0227132faca661e1821cb0/agent_framework_redis-1.0.0b251108-py3-none-any.whl", hash = "sha256:a3186b7ea987aa072b9f1ef4663ed3012ed575bb276e201a41db967de2c58c1a", size = 15563, upload-time = "2025-11-08T18:17:50.49Z" }, + { url = "https://files.pythonhosted.org/packages/36/68/afe66c72951a279e0fe048fd5af1e775528cde40dbdab8ec03b42c545df4/agent_framework_core-1.0.0b260130-py3-none-any.whl", hash = "sha256:75b4dd0ca2ae52574d406cf5c9ed7adf63e187379f72fce891743254d83dfd56", size = 348724, upload-time = "2026-01-30T18:56:47.15Z" }, ] [[package]] @@ -391,25 +207,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, ] -[[package]] -name = "anthropic" -version = "0.72.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "distro" }, - { name = "docstring-parser" }, - { name = "httpx" }, - { name = "jiter" }, - { name = "pydantic" }, - { name = "sniffio" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/49/07/61f3ca8e69c5dcdaec31b36b79a53ea21c5b4ca5e93c7df58c71f43bf8d8/anthropic-0.72.0.tar.gz", hash = "sha256:8971fe76dcffc644f74ac3883069beb1527641115ae0d6eb8fa21c1ce4082f7a", size = 493721, upload-time = "2025-10-28T19:13:01.755Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/b7/160d4fb30080395b4143f1d1a4f6c646ba9105561108d2a434b606c03579/anthropic-0.72.0-py3-none-any.whl", hash = "sha256:0e9f5a7582f038cab8efbb4c959e49ef654a56bfc7ba2da51b5a7b8a84de2e4d", size = 357464, upload-time = "2025-10-28T19:13:00.215Z" }, -] - [[package]] name = "anyio" version = "4.11.0" @@ -442,15 +239,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/af/0f/3b8fdc946b4d9cc8cc1e8af42c4e409468c84441b933d037e101b3d72d86/astroid-3.3.11-py3-none-any.whl", hash = "sha256:54c760ae8322ece1abd213057c4b5bba7c49818853fc901ef09719a60dbf9dec", size = 275612, upload-time = "2025-07-13T18:04:21.07Z" }, ] -[[package]] -name = "async-timeout" -version = "5.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a5/ae/136395dfbfe00dfc94da3f3e136d0b13f394cba8f4841120e34226265780/async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3", size = 9274, upload-time = "2024-11-06T16:41:39.6Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/ba/e2081de779ca30d473f21f5b30e0e737c438205440784c7dfc81efc2b029/async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c", size = 6233, upload-time = "2024-11-06T16:41:37.9Z" }, -] - [[package]] name = "attrs" version = "25.4.0" @@ -563,18 +351,18 @@ wheels = [ [[package]] name = "azure-ai-projects" -version = "1.0.0" +version = "2.0.0b3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "azure-ai-agents" }, { name = "azure-core" }, + { name = "azure-identity" }, { name = "azure-storage-blob" }, { name = "isodate" }, - { name = "typing-extensions" }, + { name = "openai" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/dd/95/9c04cb5f658c7f856026aa18432e0f0fa254ead2983a3574a0f5558a7234/azure_ai_projects-1.0.0.tar.gz", hash = "sha256:b5f03024ccf0fd543fbe0f5abcc74e45b15eccc1c71ab87fc71c63061d9fd63c", size = 130798, upload-time = "2025-07-31T02:09:27.912Z" } +sdist = { url = "https://files.pythonhosted.org/packages/24/e0/3512d3f07e9dd2eb4af684387c31598c435bd87833b6a81850972963cb9c/azure_ai_projects-2.0.0b3.tar.gz", hash = "sha256:6d09ad110086e450a47b991ee8a3644f1be97fa3085d5981d543f900d78f4505", size = 431749, upload-time = "2026-01-06T05:31:25.849Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/db/7149cdf71e12d9737f186656176efc94943ead4f205671768c1549593efe/azure_ai_projects-1.0.0-py3-none-any.whl", hash = "sha256:81369ed7a2f84a65864f57d3fa153e16c30f411a1504d334e184fb070165a3fa", size = 115188, upload-time = "2025-07-31T02:09:29.362Z" }, + { url = "https://files.pythonhosted.org/packages/4e/b6/8fbd4786bb5c0dd19eaff86ddce0fbfb53a6f90d712038272161067a076a/azure_ai_projects-2.0.0b3-py3-none-any.whl", hash = "sha256:3b3048a3ba3904d556ba392b7bd20b6e84c93bb39df6d43a6470cdb0ad08af8c", size = 240717, upload-time = "2026-01-06T05:31:27.716Z" }, ] [[package]] @@ -656,7 +444,7 @@ wheels = [ [[package]] name = "azure-monitor-opentelemetry" -version = "1.7.0" +version = "1.8.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "azure-core" }, @@ -672,27 +460,26 @@ dependencies = [ { name = "opentelemetry-resource-detector-azure" }, { name = "opentelemetry-sdk" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4d/77/be4ae57398fe54fdd97af90df32173f68f37593dc56610c7b04c1643da96/azure_monitor_opentelemetry-1.7.0.tar.gz", hash = "sha256:eba75e793a95d50f6e5bc35dd2781744e2c1a5cc801b530b688f649423f2ee00", size = 51735, upload-time = "2025-08-21T15:52:58.563Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e6/55/b5a48ec320be030eab11126b4636b45ed4ea145f96ddaba6e45974a87add/azure_monitor_opentelemetry-1.8.5.tar.gz", hash = "sha256:7962083a4d650e37e70063edc6315b832b4d6f94d0013ba8428799b36e26a8ce", size = 59683, upload-time = "2026-01-27T21:43:25.657Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/bd/b898a883f379d2b4f9bcb9473d4daac24160854d947f17219a7b9211ab34/azure_monitor_opentelemetry-1.7.0-py3-none-any.whl", hash = "sha256:937c60e9706f75c77b221979a273a27e811cc6529d6887099f53916719c66dd3", size = 26316, upload-time = "2025-08-21T15:53:00.153Z" }, + { url = "https://files.pythonhosted.org/packages/6a/18/1df078fce133237f04b9c1018d03bc043a793f1965063d5863aaf1b9947e/azure_monitor_opentelemetry-1.8.5-py3-none-any.whl", hash = "sha256:0f98db1de166ff6bd37ee8d69e657f604cc1785d30607f8daad9bcfdcf3e2111", size = 28986, upload-time = "2026-01-27T21:43:27.231Z" }, ] [[package]] name = "azure-monitor-opentelemetry-exporter" -version = "1.0.0b44" +version = "1.0.0b47" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "azure-core" }, { name = "azure-identity" }, - { name = "fixedint" }, { name = "msrest" }, { name = "opentelemetry-api" }, { name = "opentelemetry-sdk" }, { name = "psutil" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3e/9a/acb253869ef59482c628f4dc7e049323d0026a9374adf7b398d0b04b6094/azure_monitor_opentelemetry_exporter-1.0.0b44.tar.gz", hash = "sha256:9b0f430a6a46a78bf757ae301488c10c1996f1bd6c5c01a07b9d33583cc4fa4b", size = 271712, upload-time = "2025-10-14T00:27:20.869Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/3b/d0e4d8e0f61cb82fd3e94e52291036a7415321f9f7d5386ddb1277d31faa/azure_monitor_opentelemetry_exporter-1.0.0b47.tar.gz", hash = "sha256:c1207bd1c356aa77255e256f1af8eb2ac40a3bf51f90735f456056def7ac38c0", size = 279165, upload-time = "2026-02-03T15:41:17.604Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4a/46/31809698a0d50559fde108a4f4cb2d9532967ae514a113dba39763e048b7/azure_monitor_opentelemetry_exporter-1.0.0b44-py2.py3-none-any.whl", hash = "sha256:82d23081bf007acab8d4861229ab482e4666307a29492fbf0bf19981b4d37024", size = 198516, upload-time = "2025-10-14T00:27:22.379Z" }, + { url = "https://files.pythonhosted.org/packages/8d/b1/67361bdb9047591f84b2bbd1e03c3161cf85f718a7532b78b4e48f6eaa38/azure_monitor_opentelemetry_exporter-1.0.0b47-py2.py3-none-any.whl", hash = "sha256:be1eca7ddfc07436793981313a68662e14713902f7e7fa7cf81736f1cf6d8bf8", size = 201193, upload-time = "2026-02-03T15:41:18.892Z" }, ] [[package]] @@ -730,8 +517,8 @@ name = "backend" version = "0.1.0" source = { virtual = "." } dependencies = [ - { name = "agent-framework" }, - { name = "azure-ai-agents" }, + { name = "agent-framework-azure-ai" }, + { name = "agent-framework-core" }, { name = "azure-ai-evaluation" }, { name = "azure-ai-inference" }, { name = "azure-ai-projects" }, @@ -762,25 +549,25 @@ dependencies = [ [package.metadata] requires-dist = [ - { name = "agent-framework", specifier = ">=1.0.0b251105" }, - { name = "azure-ai-agents", specifier = "==1.2.0b5" }, + { name = "agent-framework-azure-ai", specifier = "==1.0.0b260130" }, + { name = "agent-framework-core", specifier = "==1.0.0b260130" }, { name = "azure-ai-evaluation", specifier = "==1.11.0" }, { name = "azure-ai-inference", specifier = "==1.0.0b9" }, - { name = "azure-ai-projects", specifier = "==1.0.0" }, + { name = "azure-ai-projects", specifier = "==2.0.0b3" }, { name = "azure-cosmos", specifier = "==4.9.0" }, { name = "azure-identity", specifier = "==1.24.0" }, { name = "azure-monitor-events-extension", specifier = "==0.1.0" }, - { name = "azure-monitor-opentelemetry", specifier = "==1.7.0" }, + { name = "azure-monitor-opentelemetry", specifier = ">=1.8.0" }, { name = "azure-search-documents", specifier = "==11.5.3" }, { name = "fastapi", specifier = "==0.116.1" }, - { name = "mcp", specifier = "==1.13.1" }, - { name = "openai", specifier = "==1.105.0" }, - { name = "opentelemetry-api", specifier = "==1.36.0" }, - { name = "opentelemetry-exporter-otlp-proto-grpc", specifier = "==1.36.0" }, - { name = "opentelemetry-exporter-otlp-proto-http", specifier = "==1.36.0" }, - { name = "opentelemetry-instrumentation-fastapi", specifier = "==0.57b0" }, - { name = "opentelemetry-instrumentation-openai", specifier = "==0.46.2" }, - { name = "opentelemetry-sdk", specifier = "==1.36.0" }, + { name = "mcp", specifier = ">=1.24.0,<2" }, + { name = "openai", specifier = ">=2.8.0" }, + { name = "opentelemetry-api", specifier = ">=1.39.0" }, + { name = "opentelemetry-exporter-otlp-proto-grpc", specifier = ">=1.39.0" }, + { name = "opentelemetry-exporter-otlp-proto-http", specifier = ">=1.39.0" }, + { name = "opentelemetry-instrumentation-fastapi", specifier = ">=0.57b0" }, + { name = "opentelemetry-instrumentation-openai", specifier = ">=0.46.2" }, + { name = "opentelemetry-sdk", specifier = ">=1.39.0" }, { name = "pexpect", specifier = "==4.9.0" }, { name = "pylint-pydantic", specifier = "==0.3.5" }, { name = "pytest", specifier = "==8.4.1" }, @@ -792,24 +579,6 @@ requires-dist = [ { name = "uvicorn", specifier = "==0.35.0" }, ] -[[package]] -name = "backoff" -version = "2.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/47/d7/5bbeb12c44d7c4f2fb5b56abce497eb5ed9f34d85701de869acedd602619/backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba", size = 17001, upload-time = "2022-10-05T19:19:32.061Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/df/73/b6e24bd22e6720ca8ee9a85a0c4a2971af8497d8f3193fa05390cbd46e09/backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8", size = 15148, upload-time = "2022-10-05T19:19:30.546Z" }, -] - -[[package]] -name = "cachetools" -version = "6.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cc/7e/b975b5814bd36faf009faebe22c1072a1fa1168db34d285ef0ba071ad78c/cachetools-6.2.1.tar.gz", hash = "sha256:3f391e4bd8f8bf0931169baf7456cc822705f4e2a31f840d218f445b9a854201", size = 31325, upload-time = "2025-10-12T14:55:30.139Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/96/c5/1e741d26306c42e2bf6ab740b2202872727e0f606033c9dd713f8b93f5a8/cachetools-6.2.1-py3-none-any.whl", hash = "sha256:09868944b6dde876dfd44e1d47e18484541eaf12f26f29b7af91b26cc892d701", size = 11280, upload-time = "2025-10-12T14:55:28.382Z" }, -] - [[package]] name = "certifi" version = "2025.10.5" @@ -1206,15 +975,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl", hash = "sha256:01d9bbc4a2d76bf0db7c1f729812ded6d912bd318d3b1cf81d30c0f845dbf3af", size = 331094, upload-time = "2025-09-07T18:57:58.071Z" }, ] -[[package]] -name = "docstring-parser" -version = "0.17.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/9d/c3b43da9515bd270df0f80548d9944e389870713cc1fe2b8fb35fe2bcefd/docstring_parser-0.17.0.tar.gz", hash = "sha256:583de4a309722b3315439bb31d64ba3eebada841f2e2cee23b99df001434c912", size = 27442, upload-time = "2025-07-21T07:35:01.868Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/55/e2/2537ebcff11c1ee1ff17d8d0b6f4db75873e3b0fb32c2d4a2ee31ecb310a/docstring_parser-0.17.0-py3-none-any.whl", hash = "sha256:cf2569abd23dce8099b300f9b4fa8191e9582dda731fd533daf54c4551658708", size = 36896, upload-time = "2025-07-21T07:35:00.684Z" }, -] - [[package]] name = "fastapi" version = "0.116.1" @@ -1229,15 +989,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e5/47/d63c60f59a59467fda0f93f46335c9d18526d7071f025cb5b89d5353ea42/fastapi-0.116.1-py3-none-any.whl", hash = "sha256:c46ac7c312df840f0c9e220f7964bada936781bc4e2e6eb71f1c4d7553786565", size = 95631, upload-time = "2025-07-11T16:22:30.485Z" }, ] -[[package]] -name = "fixedint" -version = "0.1.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/32/c6/b1b9b3f69915d51909ef6ebe6352e286ec3d6f2077278af83ec6e3cc569c/fixedint-0.1.6.tar.gz", hash = "sha256:703005d090499d41ce7ce2ee7eae8f7a5589a81acdc6b79f1728a56495f2c799", size = 12750, upload-time = "2020-06-20T22:14:16.544Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/6d/8f5307d26ce700a89e5a67d1e1ad15eff977211f9ed3ae90d7b0d67f4e66/fixedint-0.1.6-py3-none-any.whl", hash = "sha256:b8cf9f913735d2904deadda7a6daa9f57100599da1de57a7448ea1be75ae8c9c", size = 12702, upload-time = "2020-06-20T22:14:15.454Z" }, -] - [[package]] name = "frozenlist" version = "1.8.0" @@ -1343,36 +1094,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9a/9a/e35b4a917281c0b8419d4207f4334c8e8c5dbf4f3f5f9ada73958d937dcc/frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d", size = 13409, upload-time = "2025-10-06T05:38:16.721Z" }, ] -[[package]] -name = "google-api-core" -version = "2.28.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "google-auth" }, - { name = "googleapis-common-protos" }, - { name = "proto-plus" }, - { name = "protobuf" }, - { name = "requests" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/61/da/83d7043169ac2c8c7469f0e375610d78ae2160134bf1b80634c482fa079c/google_api_core-2.28.1.tar.gz", hash = "sha256:2b405df02d68e68ce0fbc138559e6036559e685159d148ae5861013dc201baf8", size = 176759, upload-time = "2025-10-28T21:34:51.529Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/d4/90197b416cb61cefd316964fd9e7bd8324bcbafabf40eef14a9f20b81974/google_api_core-2.28.1-py3-none-any.whl", hash = "sha256:4021b0f8ceb77a6fb4de6fde4502cecab45062e66ff4f2895169e0b35bc9466c", size = 173706, upload-time = "2025-10-28T21:34:50.151Z" }, -] - -[[package]] -name = "google-auth" -version = "2.43.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cachetools" }, - { name = "pyasn1-modules" }, - { name = "rsa" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ff/ef/66d14cf0e01b08d2d51ffc3c20410c4e134a1548fc246a6081eae585a4fe/google_auth-2.43.0.tar.gz", hash = "sha256:88228eee5fc21b62a1b5fe773ca15e67778cb07dc8363adcb4a8827b52d81483", size = 296359, upload-time = "2025-11-06T00:13:36.587Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6f/d1/385110a9ae86d91cc14c5282c61fe9f4dc41c0b9f7d423c6ad77038c4448/google_auth-2.43.0-py2.py3-none-any.whl", hash = "sha256:af628ba6fa493f75c7e9dbe9373d148ca9f4399b5ea29976519e0a3848eddd16", size = 223114, upload-time = "2025-11-06T00:13:35.209Z" }, -] - [[package]] name = "google-crc32c" version = "1.7.1" @@ -1412,56 +1133,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c4/ab/09169d5a4612a5f92490806649ac8d41e3ec9129c636754575b3553f4ea4/googleapis_common_protos-1.72.0-py3-none-any.whl", hash = "sha256:4299c5a82d5ae1a9702ada957347726b167f9f8d1fc352477702a1e851ff4038", size = 297515, upload-time = "2025-11-06T18:29:13.14Z" }, ] -[[package]] -name = "greenlet" -version = "3.2.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/03/b8/704d753a5a45507a7aab61f18db9509302ed3d0a27ac7e0359ec2905b1a6/greenlet-3.2.4.tar.gz", hash = "sha256:0dca0d95ff849f9a364385f36ab49f50065d76964944638be9691e1832e9f86d", size = 188260, upload-time = "2025-08-07T13:24:33.51Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a4/de/f28ced0a67749cac23fecb02b694f6473f47686dff6afaa211d186e2ef9c/greenlet-3.2.4-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:96378df1de302bc38e99c3a9aa311967b7dc80ced1dcc6f171e99842987882a2", size = 272305, upload-time = "2025-08-07T13:15:41.288Z" }, - { url = "https://files.pythonhosted.org/packages/09/16/2c3792cba130000bf2a31c5272999113f4764fd9d874fb257ff588ac779a/greenlet-3.2.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1ee8fae0519a337f2329cb78bd7a8e128ec0f881073d43f023c7b8d4831d5246", size = 632472, upload-time = "2025-08-07T13:42:55.044Z" }, - { url = "https://files.pythonhosted.org/packages/ae/8f/95d48d7e3d433e6dae5b1682e4292242a53f22df82e6d3dda81b1701a960/greenlet-3.2.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:94abf90142c2a18151632371140b3dba4dee031633fe614cb592dbb6c9e17bc3", size = 644646, upload-time = "2025-08-07T13:45:26.523Z" }, - { url = "https://files.pythonhosted.org/packages/d5/5e/405965351aef8c76b8ef7ad370e5da58d57ef6068df197548b015464001a/greenlet-3.2.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:4d1378601b85e2e5171b99be8d2dc85f594c79967599328f95c1dc1a40f1c633", size = 640519, upload-time = "2025-08-07T13:53:13.928Z" }, - { url = "https://files.pythonhosted.org/packages/25/5d/382753b52006ce0218297ec1b628e048c4e64b155379331f25a7316eb749/greenlet-3.2.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0db5594dce18db94f7d1650d7489909b57afde4c580806b8d9203b6e79cdc079", size = 639707, upload-time = "2025-08-07T13:18:27.146Z" }, - { url = "https://files.pythonhosted.org/packages/1f/8e/abdd3f14d735b2929290a018ecf133c901be4874b858dd1c604b9319f064/greenlet-3.2.4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2523e5246274f54fdadbce8494458a2ebdcdbc7b802318466ac5606d3cded1f8", size = 587684, upload-time = "2025-08-07T13:18:25.164Z" }, - { url = "https://files.pythonhosted.org/packages/5d/65/deb2a69c3e5996439b0176f6651e0052542bb6c8f8ec2e3fba97c9768805/greenlet-3.2.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1987de92fec508535687fb807a5cea1560f6196285a4cde35c100b8cd632cc52", size = 1116647, upload-time = "2025-08-07T13:42:38.655Z" }, - { url = "https://files.pythonhosted.org/packages/3f/cc/b07000438a29ac5cfb2194bfc128151d52f333cee74dd7dfe3fb733fc16c/greenlet-3.2.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:55e9c5affaa6775e2c6b67659f3a71684de4c549b3dd9afca3bc773533d284fa", size = 1142073, upload-time = "2025-08-07T13:18:21.737Z" }, - { url = "https://files.pythonhosted.org/packages/67/24/28a5b2fa42d12b3d7e5614145f0bd89714c34c08be6aabe39c14dd52db34/greenlet-3.2.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c9c6de1940a7d828635fbd254d69db79e54619f165ee7ce32fda763a9cb6a58c", size = 1548385, upload-time = "2025-11-04T12:42:11.067Z" }, - { url = "https://files.pythonhosted.org/packages/6a/05/03f2f0bdd0b0ff9a4f7b99333d57b53a7709c27723ec8123056b084e69cd/greenlet-3.2.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03c5136e7be905045160b1b9fdca93dd6727b180feeafda6818e6496434ed8c5", size = 1613329, upload-time = "2025-11-04T12:42:12.928Z" }, - { url = "https://files.pythonhosted.org/packages/d8/0f/30aef242fcab550b0b3520b8e3561156857c94288f0332a79928c31a52cf/greenlet-3.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:9c40adce87eaa9ddb593ccb0fa6a07caf34015a29bf8d344811665b573138db9", size = 299100, upload-time = "2025-08-07T13:44:12.287Z" }, - { url = "https://files.pythonhosted.org/packages/44/69/9b804adb5fd0671f367781560eb5eb586c4d495277c93bde4307b9e28068/greenlet-3.2.4-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3b67ca49f54cede0186854a008109d6ee71f66bd57bb36abd6d0a0267b540cdd", size = 274079, upload-time = "2025-08-07T13:15:45.033Z" }, - { url = "https://files.pythonhosted.org/packages/46/e9/d2a80c99f19a153eff70bc451ab78615583b8dac0754cfb942223d2c1a0d/greenlet-3.2.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ddf9164e7a5b08e9d22511526865780a576f19ddd00d62f8a665949327fde8bb", size = 640997, upload-time = "2025-08-07T13:42:56.234Z" }, - { url = "https://files.pythonhosted.org/packages/3b/16/035dcfcc48715ccd345f3a93183267167cdd162ad123cd93067d86f27ce4/greenlet-3.2.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f28588772bb5fb869a8eb331374ec06f24a83a9c25bfa1f38b6993afe9c1e968", size = 655185, upload-time = "2025-08-07T13:45:27.624Z" }, - { url = "https://files.pythonhosted.org/packages/31/da/0386695eef69ffae1ad726881571dfe28b41970173947e7c558d9998de0f/greenlet-3.2.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:5c9320971821a7cb77cfab8d956fa8e39cd07ca44b6070db358ceb7f8797c8c9", size = 649926, upload-time = "2025-08-07T13:53:15.251Z" }, - { url = "https://files.pythonhosted.org/packages/68/88/69bf19fd4dc19981928ceacbc5fd4bb6bc2215d53199e367832e98d1d8fe/greenlet-3.2.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c60a6d84229b271d44b70fb6e5fa23781abb5d742af7b808ae3f6efd7c9c60f6", size = 651839, upload-time = "2025-08-07T13:18:30.281Z" }, - { url = "https://files.pythonhosted.org/packages/19/0d/6660d55f7373b2ff8152401a83e02084956da23ae58cddbfb0b330978fe9/greenlet-3.2.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b3812d8d0c9579967815af437d96623f45c0f2ae5f04e366de62a12d83a8fb0", size = 607586, upload-time = "2025-08-07T13:18:28.544Z" }, - { url = "https://files.pythonhosted.org/packages/8e/1a/c953fdedd22d81ee4629afbb38d2f9d71e37d23caace44775a3a969147d4/greenlet-3.2.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:abbf57b5a870d30c4675928c37278493044d7c14378350b3aa5d484fa65575f0", size = 1123281, upload-time = "2025-08-07T13:42:39.858Z" }, - { url = "https://files.pythonhosted.org/packages/3f/c7/12381b18e21aef2c6bd3a636da1088b888b97b7a0362fac2e4de92405f97/greenlet-3.2.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:20fb936b4652b6e307b8f347665e2c615540d4b42b3b4c8a321d8286da7e520f", size = 1151142, upload-time = "2025-08-07T13:18:22.981Z" }, - { url = "https://files.pythonhosted.org/packages/27/45/80935968b53cfd3f33cf99ea5f08227f2646e044568c9b1555b58ffd61c2/greenlet-3.2.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ee7a6ec486883397d70eec05059353b8e83eca9168b9f3f9a361971e77e0bcd0", size = 1564846, upload-time = "2025-11-04T12:42:15.191Z" }, - { url = "https://files.pythonhosted.org/packages/69/02/b7c30e5e04752cb4db6202a3858b149c0710e5453b71a3b2aec5d78a1aab/greenlet-3.2.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:326d234cbf337c9c3def0676412eb7040a35a768efc92504b947b3e9cfc7543d", size = 1633814, upload-time = "2025-11-04T12:42:17.175Z" }, - { url = "https://files.pythonhosted.org/packages/e9/08/b0814846b79399e585f974bbeebf5580fbe59e258ea7be64d9dfb253c84f/greenlet-3.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:a7d4e128405eea3814a12cc2605e0e6aedb4035bf32697f72deca74de4105e02", size = 299899, upload-time = "2025-08-07T13:38:53.448Z" }, - { url = "https://files.pythonhosted.org/packages/49/e8/58c7f85958bda41dafea50497cbd59738c5c43dbbea5ee83d651234398f4/greenlet-3.2.4-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:1a921e542453fe531144e91e1feedf12e07351b1cf6c9e8a3325ea600a715a31", size = 272814, upload-time = "2025-08-07T13:15:50.011Z" }, - { url = "https://files.pythonhosted.org/packages/62/dd/b9f59862e9e257a16e4e610480cfffd29e3fae018a68c2332090b53aac3d/greenlet-3.2.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd3c8e693bff0fff6ba55f140bf390fa92c994083f838fece0f63be121334945", size = 641073, upload-time = "2025-08-07T13:42:57.23Z" }, - { url = "https://files.pythonhosted.org/packages/f7/0b/bc13f787394920b23073ca3b6c4a7a21396301ed75a655bcb47196b50e6e/greenlet-3.2.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:710638eb93b1fa52823aa91bf75326f9ecdfd5e0466f00789246a5280f4ba0fc", size = 655191, upload-time = "2025-08-07T13:45:29.752Z" }, - { url = "https://files.pythonhosted.org/packages/f2/d6/6adde57d1345a8d0f14d31e4ab9c23cfe8e2cd39c3baf7674b4b0338d266/greenlet-3.2.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c5111ccdc9c88f423426df3fd1811bfc40ed66264d35aa373420a34377efc98a", size = 649516, upload-time = "2025-08-07T13:53:16.314Z" }, - { url = "https://files.pythonhosted.org/packages/7f/3b/3a3328a788d4a473889a2d403199932be55b1b0060f4ddd96ee7cdfcad10/greenlet-3.2.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d76383238584e9711e20ebe14db6c88ddcedc1829a9ad31a584389463b5aa504", size = 652169, upload-time = "2025-08-07T13:18:32.861Z" }, - { url = "https://files.pythonhosted.org/packages/ee/43/3cecdc0349359e1a527cbf2e3e28e5f8f06d3343aaf82ca13437a9aa290f/greenlet-3.2.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23768528f2911bcd7e475210822ffb5254ed10d71f4028387e5a99b4c6699671", size = 610497, upload-time = "2025-08-07T13:18:31.636Z" }, - { url = "https://files.pythonhosted.org/packages/b8/19/06b6cf5d604e2c382a6f31cafafd6f33d5dea706f4db7bdab184bad2b21d/greenlet-3.2.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:00fadb3fedccc447f517ee0d3fd8fe49eae949e1cd0f6a611818f4f6fb7dc83b", size = 1121662, upload-time = "2025-08-07T13:42:41.117Z" }, - { url = "https://files.pythonhosted.org/packages/a2/15/0d5e4e1a66fab130d98168fe984c509249c833c1a3c16806b90f253ce7b9/greenlet-3.2.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d25c5091190f2dc0eaa3f950252122edbbadbb682aa7b1ef2f8af0f8c0afefae", size = 1149210, upload-time = "2025-08-07T13:18:24.072Z" }, - { url = "https://files.pythonhosted.org/packages/1c/53/f9c440463b3057485b8594d7a638bed53ba531165ef0ca0e6c364b5cc807/greenlet-3.2.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e343822feb58ac4d0a1211bd9399de2b3a04963ddeec21530fc426cc121f19b", size = 1564759, upload-time = "2025-11-04T12:42:19.395Z" }, - { url = "https://files.pythonhosted.org/packages/47/e4/3bb4240abdd0a8d23f4f88adec746a3099f0d86bfedb623f063b2e3b4df0/greenlet-3.2.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca7f6f1f2649b89ce02f6f229d7c19f680a6238af656f61e0115b24857917929", size = 1634288, upload-time = "2025-11-04T12:42:21.174Z" }, - { url = "https://files.pythonhosted.org/packages/0b/55/2321e43595e6801e105fcfdee02b34c0f996eb71e6ddffca6b10b7e1d771/greenlet-3.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:554b03b6e73aaabec3745364d6239e9e012d64c68ccd0b8430c64ccc14939a8b", size = 299685, upload-time = "2025-08-07T13:24:38.824Z" }, - { url = "https://files.pythonhosted.org/packages/22/5c/85273fd7cc388285632b0498dbbab97596e04b154933dfe0f3e68156c68c/greenlet-3.2.4-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:49a30d5fda2507ae77be16479bdb62a660fa51b1eb4928b524975b3bde77b3c0", size = 273586, upload-time = "2025-08-07T13:16:08.004Z" }, - { url = "https://files.pythonhosted.org/packages/d1/75/10aeeaa3da9332c2e761e4c50d4c3556c21113ee3f0afa2cf5769946f7a3/greenlet-3.2.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:299fd615cd8fc86267b47597123e3f43ad79c9d8a22bebdce535e53550763e2f", size = 686346, upload-time = "2025-08-07T13:42:59.944Z" }, - { url = "https://files.pythonhosted.org/packages/c0/aa/687d6b12ffb505a4447567d1f3abea23bd20e73a5bed63871178e0831b7a/greenlet-3.2.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c17b6b34111ea72fc5a4e4beec9711d2226285f0386ea83477cbb97c30a3f3a5", size = 699218, upload-time = "2025-08-07T13:45:30.969Z" }, - { url = "https://files.pythonhosted.org/packages/dc/8b/29aae55436521f1d6f8ff4e12fb676f3400de7fcf27fccd1d4d17fd8fecd/greenlet-3.2.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b4a1870c51720687af7fa3e7cda6d08d801dae660f75a76f3845b642b4da6ee1", size = 694659, upload-time = "2025-08-07T13:53:17.759Z" }, - { url = "https://files.pythonhosted.org/packages/92/2e/ea25914b1ebfde93b6fc4ff46d6864564fba59024e928bdc7de475affc25/greenlet-3.2.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:061dc4cf2c34852b052a8620d40f36324554bc192be474b9e9770e8c042fd735", size = 695355, upload-time = "2025-08-07T13:18:34.517Z" }, - { url = "https://files.pythonhosted.org/packages/72/60/fc56c62046ec17f6b0d3060564562c64c862948c9d4bc8aa807cf5bd74f4/greenlet-3.2.4-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:44358b9bf66c8576a9f57a590d5f5d6e72fa4228b763d0e43fee6d3b06d3a337", size = 657512, upload-time = "2025-08-07T13:18:33.969Z" }, - { url = "https://files.pythonhosted.org/packages/23/6e/74407aed965a4ab6ddd93a7ded3180b730d281c77b765788419484cdfeef/greenlet-3.2.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2917bdf657f5859fbf3386b12d68ede4cf1f04c90c3a6bc1f013dd68a22e2269", size = 1612508, upload-time = "2025-11-04T12:42:23.427Z" }, - { url = "https://files.pythonhosted.org/packages/0d/da/343cd760ab2f92bac1845ca07ee3faea9fe52bee65f7bcb19f16ad7de08b/greenlet-3.2.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:015d48959d4add5d6c9f6c5210ee3803a830dce46356e3bc326d6776bde54681", size = 1680760, upload-time = "2025-11-04T12:42:25.341Z" }, - { url = "https://files.pythonhosted.org/packages/e3/a5/6ddab2b4c112be95601c13428db1d8b6608a8b6039816f2ba09c346c08fc/greenlet-3.2.4-cp314-cp314-win_amd64.whl", hash = "sha256:e37ab26028f12dbb0ff65f29a8d3d44a765c61e729647bf2ddfbbed621726f01", size = 303425, upload-time = "2025-08-07T13:32:27.59Z" }, -] - [[package]] name = "grpcio" version = "1.76.0" @@ -1522,28 +1193,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, ] -[[package]] -name = "h2" -version = "4.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "hpack" }, - { name = "hyperframe" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/1d/17/afa56379f94ad0fe8defd37d6eb3f89a25404ffc71d4d848893d270325fc/h2-4.3.0.tar.gz", hash = "sha256:6c59efe4323fa18b47a632221a1888bd7fde6249819beda254aeca909f221bf1", size = 2152026, upload-time = "2025-08-23T18:12:19.778Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/69/b2/119f6e6dcbd96f9069ce9a2665e0146588dc9f88f29549711853645e736a/h2-4.3.0-py3-none-any.whl", hash = "sha256:c438f029a25f7945c69e0ccf0fb951dc3f73a5f6412981daee861431b70e2bdd", size = 61779, upload-time = "2025-08-23T18:12:17.779Z" }, -] - -[[package]] -name = "hpack" -version = "4.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2c/48/71de9ed269fdae9c8057e5a4c0aa7402e8bb16f2c6e90b3aa53327b113f8/hpack-4.1.0.tar.gz", hash = "sha256:ec5eca154f7056aa06f196a557655c5b009b382873ac8d1e66e79e87535f1dca", size = 51276, upload-time = "2025-01-22T21:44:58.347Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/07/c6/80c95b1b2b94682a72cbdbfb85b81ae2daffa4291fbfa1b1464502ede10d/hpack-4.1.0-py3-none-any.whl", hash = "sha256:157ac792668d995c657d93111f46b4535ed114f0c9c8d672271bbec7eae1b496", size = 34357, upload-time = "2025-01-22T21:44:56.92Z" }, -] - [[package]] name = "httpcore" version = "1.0.9" @@ -1557,42 +1206,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, ] -[[package]] -name = "httptools" -version = "0.7.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b5/46/120a669232c7bdedb9d52d4aeae7e6c7dfe151e99dc70802e2fc7a5e1993/httptools-0.7.1.tar.gz", hash = "sha256:abd72556974f8e7c74a259655924a717a2365b236c882c3f6f8a45fe94703ac9", size = 258961, upload-time = "2025-10-10T03:55:08.559Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9c/08/17e07e8d89ab8f343c134616d72eebfe03798835058e2ab579dcc8353c06/httptools-0.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:474d3b7ab469fefcca3697a10d11a32ee2b9573250206ba1e50d5980910da657", size = 206521, upload-time = "2025-10-10T03:54:31.002Z" }, - { url = "https://files.pythonhosted.org/packages/aa/06/c9c1b41ff52f16aee526fd10fbda99fa4787938aa776858ddc4a1ea825ec/httptools-0.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3c3b7366bb6c7b96bd72d0dbe7f7d5eead261361f013be5f6d9590465ea1c70", size = 110375, upload-time = "2025-10-10T03:54:31.941Z" }, - { url = "https://files.pythonhosted.org/packages/cc/cc/10935db22fda0ee34c76f047590ca0a8bd9de531406a3ccb10a90e12ea21/httptools-0.7.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:379b479408b8747f47f3b253326183d7c009a3936518cdb70db58cffd369d9df", size = 456621, upload-time = "2025-10-10T03:54:33.176Z" }, - { url = "https://files.pythonhosted.org/packages/0e/84/875382b10d271b0c11aa5d414b44f92f8dd53e9b658aec338a79164fa548/httptools-0.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cad6b591a682dcc6cf1397c3900527f9affef1e55a06c4547264796bbd17cf5e", size = 454954, upload-time = "2025-10-10T03:54:34.226Z" }, - { url = "https://files.pythonhosted.org/packages/30/e1/44f89b280f7e46c0b1b2ccee5737d46b3bb13136383958f20b580a821ca0/httptools-0.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eb844698d11433d2139bbeeb56499102143beb582bd6c194e3ba69c22f25c274", size = 440175, upload-time = "2025-10-10T03:54:35.942Z" }, - { url = "https://files.pythonhosted.org/packages/6f/7e/b9287763159e700e335028bc1824359dc736fa9b829dacedace91a39b37e/httptools-0.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f65744d7a8bdb4bda5e1fa23e4ba16832860606fcc09d674d56e425e991539ec", size = 440310, upload-time = "2025-10-10T03:54:37.1Z" }, - { url = "https://files.pythonhosted.org/packages/b3/07/5b614f592868e07f5c94b1f301b5e14a21df4e8076215a3bccb830a687d8/httptools-0.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:135fbe974b3718eada677229312e97f3b31f8a9c8ffa3ae6f565bf808d5b6bcb", size = 86875, upload-time = "2025-10-10T03:54:38.421Z" }, - { url = "https://files.pythonhosted.org/packages/53/7f/403e5d787dc4942316e515e949b0c8a013d84078a915910e9f391ba9b3ed/httptools-0.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:38e0c83a2ea9746ebbd643bdfb521b9aa4a91703e2cd705c20443405d2fd16a5", size = 206280, upload-time = "2025-10-10T03:54:39.274Z" }, - { url = "https://files.pythonhosted.org/packages/2a/0d/7f3fd28e2ce311ccc998c388dd1c53b18120fda3b70ebb022b135dc9839b/httptools-0.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f25bbaf1235e27704f1a7b86cd3304eabc04f569c828101d94a0e605ef7205a5", size = 110004, upload-time = "2025-10-10T03:54:40.403Z" }, - { url = "https://files.pythonhosted.org/packages/84/a6/b3965e1e146ef5762870bbe76117876ceba51a201e18cc31f5703e454596/httptools-0.7.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2c15f37ef679ab9ecc06bfc4e6e8628c32a8e4b305459de7cf6785acd57e4d03", size = 517655, upload-time = "2025-10-10T03:54:41.347Z" }, - { url = "https://files.pythonhosted.org/packages/11/7d/71fee6f1844e6fa378f2eddde6c3e41ce3a1fb4b2d81118dd544e3441ec0/httptools-0.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7fe6e96090df46b36ccfaf746f03034e5ab723162bc51b0a4cf58305324036f2", size = 511440, upload-time = "2025-10-10T03:54:42.452Z" }, - { url = "https://files.pythonhosted.org/packages/22/a5/079d216712a4f3ffa24af4a0381b108aa9c45b7a5cc6eb141f81726b1823/httptools-0.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f72fdbae2dbc6e68b8239defb48e6a5937b12218e6ffc2c7846cc37befa84362", size = 495186, upload-time = "2025-10-10T03:54:43.937Z" }, - { url = "https://files.pythonhosted.org/packages/e9/9e/025ad7b65278745dee3bd0ebf9314934c4592560878308a6121f7f812084/httptools-0.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e99c7b90a29fd82fea9ef57943d501a16f3404d7b9ee81799d41639bdaae412c", size = 499192, upload-time = "2025-10-10T03:54:45.003Z" }, - { url = "https://files.pythonhosted.org/packages/6d/de/40a8f202b987d43afc4d54689600ff03ce65680ede2f31df348d7f368b8f/httptools-0.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:3e14f530fefa7499334a79b0cf7e7cd2992870eb893526fb097d51b4f2d0f321", size = 86694, upload-time = "2025-10-10T03:54:45.923Z" }, - { url = "https://files.pythonhosted.org/packages/09/8f/c77b1fcbfd262d422f12da02feb0d218fa228d52485b77b953832105bb90/httptools-0.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6babce6cfa2a99545c60bfef8bee0cc0545413cb0018f617c8059a30ad985de3", size = 202889, upload-time = "2025-10-10T03:54:47.089Z" }, - { url = "https://files.pythonhosted.org/packages/0a/1a/22887f53602feaa066354867bc49a68fc295c2293433177ee90870a7d517/httptools-0.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:601b7628de7504077dd3dcb3791c6b8694bbd967148a6d1f01806509254fb1ca", size = 108180, upload-time = "2025-10-10T03:54:48.052Z" }, - { url = "https://files.pythonhosted.org/packages/32/6a/6aaa91937f0010d288d3d124ca2946d48d60c3a5ee7ca62afe870e3ea011/httptools-0.7.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:04c6c0e6c5fb0739c5b8a9eb046d298650a0ff38cf42537fc372b28dc7e4472c", size = 478596, upload-time = "2025-10-10T03:54:48.919Z" }, - { url = "https://files.pythonhosted.org/packages/6d/70/023d7ce117993107be88d2cbca566a7c1323ccbaf0af7eabf2064fe356f6/httptools-0.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:69d4f9705c405ae3ee83d6a12283dc9feba8cc6aaec671b412917e644ab4fa66", size = 473268, upload-time = "2025-10-10T03:54:49.993Z" }, - { url = "https://files.pythonhosted.org/packages/32/4d/9dd616c38da088e3f436e9a616e1d0cc66544b8cdac405cc4e81c8679fc7/httptools-0.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:44c8f4347d4b31269c8a9205d8a5ee2df5322b09bbbd30f8f862185bb6b05346", size = 455517, upload-time = "2025-10-10T03:54:51.066Z" }, - { url = "https://files.pythonhosted.org/packages/1d/3a/a6c595c310b7df958e739aae88724e24f9246a514d909547778d776799be/httptools-0.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:465275d76db4d554918aba40bf1cbebe324670f3dfc979eaffaa5d108e2ed650", size = 458337, upload-time = "2025-10-10T03:54:52.196Z" }, - { url = "https://files.pythonhosted.org/packages/fd/82/88e8d6d2c51edc1cc391b6e044c6c435b6aebe97b1abc33db1b0b24cd582/httptools-0.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:322d00c2068d125bd570f7bf78b2d367dad02b919d8581d7476d8b75b294e3e6", size = 85743, upload-time = "2025-10-10T03:54:53.448Z" }, - { url = "https://files.pythonhosted.org/packages/34/50/9d095fcbb6de2d523e027a2f304d4551855c2f46e0b82befd718b8b20056/httptools-0.7.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:c08fe65728b8d70b6923ce31e3956f859d5e1e8548e6f22ec520a962c6757270", size = 203619, upload-time = "2025-10-10T03:54:54.321Z" }, - { url = "https://files.pythonhosted.org/packages/07/f0/89720dc5139ae54b03f861b5e2c55a37dba9a5da7d51e1e824a1f343627f/httptools-0.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7aea2e3c3953521c3c51106ee11487a910d45586e351202474d45472db7d72d3", size = 108714, upload-time = "2025-10-10T03:54:55.163Z" }, - { url = "https://files.pythonhosted.org/packages/b3/cb/eea88506f191fb552c11787c23f9a405f4c7b0c5799bf73f2249cd4f5228/httptools-0.7.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0e68b8582f4ea9166be62926077a3334064d422cf08ab87d8b74664f8e9058e1", size = 472909, upload-time = "2025-10-10T03:54:56.056Z" }, - { url = "https://files.pythonhosted.org/packages/e0/4a/a548bdfae6369c0d078bab5769f7b66f17f1bfaa6fa28f81d6be6959066b/httptools-0.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df091cf961a3be783d6aebae963cc9b71e00d57fa6f149025075217bc6a55a7b", size = 470831, upload-time = "2025-10-10T03:54:57.219Z" }, - { url = "https://files.pythonhosted.org/packages/4d/31/14df99e1c43bd132eec921c2e7e11cda7852f65619bc0fc5bdc2d0cb126c/httptools-0.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f084813239e1eb403ddacd06a30de3d3e09a9b76e7894dcda2b22f8a726e9c60", size = 452631, upload-time = "2025-10-10T03:54:58.219Z" }, - { url = "https://files.pythonhosted.org/packages/22/d2/b7e131f7be8d854d48cb6d048113c30f9a46dca0c9a8b08fcb3fcd588cdc/httptools-0.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7347714368fb2b335e9063bc2b96f2f87a9ceffcd9758ac295f8bbcd3ffbc0ca", size = 452910, upload-time = "2025-10-10T03:54:59.366Z" }, - { url = "https://files.pythonhosted.org/packages/53/cf/878f3b91e4e6e011eff6d1fa9ca39f7eb17d19c9d7971b04873734112f30/httptools-0.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:cfabda2a5bb85aa2a904ce06d974a3f30fb36cc63d7feaddec05d2050acede96", size = 88205, upload-time = "2025-10-10T03:55:00.389Z" }, -] - [[package]] name = "httpx" version = "0.28.1" @@ -1608,11 +1221,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, ] -[package.optional-dependencies] -http2 = [ - { name = "h2" }, -] - [[package]] name = "httpx-sse" version = "0.4.3" @@ -1622,15 +1230,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d2/fd/6668e5aec43ab844de6fc74927e155a3b37bf40d7c3790e49fc0406b6578/httpx_sse-0.4.3-py3-none-any.whl", hash = "sha256:0ac1c9fe3c0afad2e0ebb25a934a59f4c7823b60792691f779fad2c5568830fc", size = 8960, upload-time = "2025-10-10T21:48:21.158Z" }, ] -[[package]] -name = "hyperframe" -version = "6.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/02/e7/94f8232d4a74cc99514c13a9f995811485a6903d48e5d952771ef6322e30/hyperframe-6.1.0.tar.gz", hash = "sha256:f630908a00854a7adeabd6382b43923a4c4cd4b821fcb527e6ab9e15382a3b08", size = 26566, upload-time = "2025-01-22T21:41:49.302Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/48/30/47d0bf6072f7252e6521f3447ccfa40b421b6824517f82854703d0f5a98b/hyperframe-6.1.0-py3-none-any.whl", hash = "sha256:b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5", size = 13007, upload-time = "2025-01-22T21:41:47.295Z" }, -] - [[package]] name = "idna" version = "3.11" @@ -1794,18 +1393,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1e/e8/685f47e0d754320684db4425a0967f7d3fa70126bffd76110b7009a0090f/joblib-1.5.2-py3-none-any.whl", hash = "sha256:4e1f0bdbb987e6d843c70cf43714cb276623def372df3c22fe5266b2670bc241", size = 308396, upload-time = "2025-08-27T12:15:45.188Z" }, ] -[[package]] -name = "jsonpath-ng" -version = "1.7.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "ply" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/6d/86/08646239a313f895186ff0a4573452038eed8c86f54380b3ebac34d32fb2/jsonpath-ng-1.7.0.tar.gz", hash = "sha256:f6f5f7fd4e5ff79c785f1573b394043b39849fb2bb47bcead935d12b00beab3c", size = 37838, upload-time = "2024-10-11T15:41:42.404Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/35/5a/73ecb3d82f8615f32ccdadeb9356726d6cae3a4bbc840b437ceb95708063/jsonpath_ng-1.7.0-py3-none-any.whl", hash = "sha256:f3d7f9e848cba1b6da28c55b1c26ff915dc9e0b1ba7e752a53d6da8d5cbd00b6", size = 30105, upload-time = "2024-11-20T17:58:30.418Z" }, -] - [[package]] name = "jsonschema" version = "4.25.1" @@ -1972,7 +1559,7 @@ wheels = [ [[package]] name = "mcp" -version = "1.13.1" +version = "1.26.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -1981,15 +1568,18 @@ dependencies = [ { name = "jsonschema" }, { name = "pydantic" }, { name = "pydantic-settings" }, + { name = "pyjwt", extra = ["crypto"] }, { name = "python-multipart" }, { name = "pywin32", marker = "sys_platform == 'win32'" }, { name = "sse-starlette" }, { name = "starlette" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, { name = "uvicorn", marker = "sys_platform != 'emscripten'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/66/3c/82c400c2d50afdac4fbefb5b4031fd327e2ad1f23ccef8eee13c5909aa48/mcp-1.13.1.tar.gz", hash = "sha256:165306a8fd7991dc80334edd2de07798175a56461043b7ae907b279794a834c5", size = 438198, upload-time = "2025-08-22T09:22:16.061Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/6d/62e76bbb8144d6ed86e202b5edd8a4cb631e7c8130f3f4893c3f90262b10/mcp-1.26.0.tar.gz", hash = "sha256:db6e2ef491eecc1a0d93711a76f28dec2e05999f93afd48795da1c1137142c66", size = 608005, upload-time = "2026-01-24T19:40:32.468Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/19/3f/d085c7f49ade6d273b185d61ec9405e672b6433f710ea64a90135a8dd445/mcp-1.13.1-py3-none-any.whl", hash = "sha256:c314e7c8bd477a23ba3ef472ee5a32880316c42d03e06dcfa31a1cc7a73b65df", size = 161494, upload-time = "2025-08-22T09:22:14.705Z" }, + { url = "https://files.pythonhosted.org/packages/fd/d9/eaa1f80170d2b7c5ba23f3b59f766f3a0bb41155fbc32a69adfa1adaaef9/mcp-1.26.0-py3-none-any.whl", hash = "sha256:904a21c33c25aa98ddbeb47273033c435e595bbacfdb177f4bd87f6dceebe1ca", size = 233615, upload-time = "2026-01-24T19:40:30.652Z" }, ] [package.optional-dependencies] @@ -1997,101 +1587,6 @@ ws = [ { name = "websockets" }, ] -[[package]] -name = "mem0ai" -version = "1.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "openai" }, - { name = "posthog" }, - { name = "protobuf" }, - { name = "pydantic" }, - { name = "pytz" }, - { name = "qdrant-client" }, - { name = "sqlalchemy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/99/02/b6c3bba83b4bb6450e6c8a07e4419b24644007588f5ef427b680addbd30f/mem0ai-1.0.0.tar.gz", hash = "sha256:8a891502e6547436adb526a59acf091cacaa689e182e186f4dd8baf185d75224", size = 177780, upload-time = "2025-10-16T10:36:23.871Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/61/49/eed6e2a77bf90e37da25c9a336af6a6129b0baae76551409ee995f0a1f0c/mem0ai-1.0.0-py3-none-any.whl", hash = "sha256:107fd2990613eba34880ca6578e6cdd4a8158fd35f5b80be031b6e2b5a66a1f1", size = 268141, upload-time = "2025-10-16T10:36:21.63Z" }, -] - -[[package]] -name = "microsoft-agents-activity" -version = "0.5.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pydantic" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7e/51/2698980f425cda122f5b755a957c3c2db604c0b9a787c6add5aa4649c237/microsoft_agents_activity-0.5.3.tar.gz", hash = "sha256:d80b055591df561df8cebda9e1712012352581a396b36459133a951982b3a760", size = 55892, upload-time = "2025-10-31T15:40:49.332Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/75/3d/9618243e7b6f1f6295642c4e2dfca65b3a37794efbe1bdec15f0a93827d9/microsoft_agents_activity-0.5.3-py3-none-any.whl", hash = "sha256:5ae2447ac47c32f03c614694f520817cd225c9c502ec08b90d448311fb5bf3b4", size = 127861, upload-time = "2025-10-31T15:40:57.628Z" }, -] - -[[package]] -name = "microsoft-agents-copilotstudio-client" -version = "0.5.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "microsoft-agents-hosting-core" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7e/22/109164fb585c4baee40d2372c5d76254ec4a28219908f11cd27ac92aa6c1/microsoft_agents_copilotstudio_client-0.5.3.tar.gz", hash = "sha256:a57ea6b3cb47dbb5ad22e59c986208ace6479e35da3f644e6346f4dfd85db57c", size = 11161, upload-time = "2025-10-31T15:40:51.444Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c4/65/984e139c85657ff0c8df0ed98a167c8b9434f4fd4f32862b4a6490b8c714/microsoft_agents_copilotstudio_client-0.5.3-py3-none-any.whl", hash = "sha256:6a36fce5c8c1a2df6f5142e35b12c69be80959ecff6d60cc309661018c40f00a", size = 11091, upload-time = "2025-10-31T15:40:59.718Z" }, -] - -[[package]] -name = "microsoft-agents-hosting-core" -version = "0.5.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "azure-core" }, - { name = "isodate" }, - { name = "microsoft-agents-activity" }, - { name = "pyjwt" }, - { name = "python-dotenv" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b1/98/7755c07b2ae5faf3e4dc14b17e44680a600c8b840b3003fb326d5720dea1/microsoft_agents_hosting_core-0.5.3.tar.gz", hash = "sha256:b113d4ea5c9e555bbf61037bb2a1a7a3ce7e5e4a7a0f681a3bd4719ba72ff821", size = 81672, upload-time = "2025-10-31T15:40:53.557Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/95/57/c9e98475971c9da9cc9ff88195bbfcfae90dba511ebe14610be79f23ab3f/microsoft_agents_hosting_core-0.5.3-py3-none-any.whl", hash = "sha256:8c228a8814dcf1a86dd60e4c7574a2e86078962695fabd693a118097e703e982", size = 120668, upload-time = "2025-10-31T15:41:01.691Z" }, -] - -[[package]] -name = "ml-dtypes" -version = "0.5.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/78/a7/aad060393123cfb383956dca68402aff3db1e1caffd5764887ed5153f41b/ml_dtypes-0.5.3.tar.gz", hash = "sha256:95ce33057ba4d05df50b1f3cfefab22e351868a843b3b15a46c65836283670c9", size = 692316, upload-time = "2025-07-29T18:39:19.454Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/af/f1/720cb1409b5d0c05cff9040c0e9fba73fa4c67897d33babf905d5d46a070/ml_dtypes-0.5.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4a177b882667c69422402df6ed5c3428ce07ac2c1f844d8a1314944651439458", size = 667412, upload-time = "2025-07-29T18:38:25.275Z" }, - { url = "https://files.pythonhosted.org/packages/6a/d5/05861ede5d299f6599f86e6bc1291714e2116d96df003cfe23cc54bcc568/ml_dtypes-0.5.3-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9849ce7267444c0a717c80c6900997de4f36e2815ce34ac560a3edb2d9a64cd2", size = 4964606, upload-time = "2025-07-29T18:38:27.045Z" }, - { url = "https://files.pythonhosted.org/packages/db/dc/72992b68de367741bfab8df3b3fe7c29f982b7279d341aa5bf3e7ef737ea/ml_dtypes-0.5.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c3f5ae0309d9f888fd825c2e9d0241102fadaca81d888f26f845bc8c13c1e4ee", size = 4938435, upload-time = "2025-07-29T18:38:29.193Z" }, - { url = "https://files.pythonhosted.org/packages/81/1c/d27a930bca31fb07d975a2d7eaf3404f9388114463b9f15032813c98f893/ml_dtypes-0.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:58e39349d820b5702bb6f94ea0cb2dc8ec62ee81c0267d9622067d8333596a46", size = 206334, upload-time = "2025-07-29T18:38:30.687Z" }, - { url = "https://files.pythonhosted.org/packages/1a/d8/6922499effa616012cb8dc445280f66d100a7ff39b35c864cfca019b3f89/ml_dtypes-0.5.3-cp311-cp311-win_arm64.whl", hash = "sha256:66c2756ae6cfd7f5224e355c893cfd617fa2f747b8bbd8996152cbdebad9a184", size = 157584, upload-time = "2025-07-29T18:38:32.187Z" }, - { url = "https://files.pythonhosted.org/packages/0d/eb/bc07c88a6ab002b4635e44585d80fa0b350603f11a2097c9d1bfacc03357/ml_dtypes-0.5.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:156418abeeda48ea4797db6776db3c5bdab9ac7be197c1233771e0880c304057", size = 663864, upload-time = "2025-07-29T18:38:33.777Z" }, - { url = "https://files.pythonhosted.org/packages/cf/89/11af9b0f21b99e6386b6581ab40fb38d03225f9de5f55cf52097047e2826/ml_dtypes-0.5.3-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1db60c154989af253f6c4a34e8a540c2c9dce4d770784d426945e09908fbb177", size = 4951313, upload-time = "2025-07-29T18:38:36.45Z" }, - { url = "https://files.pythonhosted.org/packages/d8/a9/b98b86426c24900b0c754aad006dce2863df7ce0bb2bcc2c02f9cc7e8489/ml_dtypes-0.5.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1b255acada256d1fa8c35ed07b5f6d18bc21d1556f842fbc2d5718aea2cd9e55", size = 4928805, upload-time = "2025-07-29T18:38:38.29Z" }, - { url = "https://files.pythonhosted.org/packages/50/c1/85e6be4fc09c6175f36fb05a45917837f30af9a5146a5151cb3a3f0f9e09/ml_dtypes-0.5.3-cp312-cp312-win_amd64.whl", hash = "sha256:da65e5fd3eea434ccb8984c3624bc234ddcc0d9f4c81864af611aaebcc08a50e", size = 208182, upload-time = "2025-07-29T18:38:39.72Z" }, - { url = "https://files.pythonhosted.org/packages/9e/17/cf5326d6867be057f232d0610de1458f70a8ce7b6290e4b4a277ea62b4cd/ml_dtypes-0.5.3-cp312-cp312-win_arm64.whl", hash = "sha256:8bb9cd1ce63096567f5f42851f5843b5a0ea11511e50039a7649619abfb4ba6d", size = 161560, upload-time = "2025-07-29T18:38:41.072Z" }, - { url = "https://files.pythonhosted.org/packages/2d/87/1bcc98a66de7b2455dfb292f271452cac9edc4e870796e0d87033524d790/ml_dtypes-0.5.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5103856a225465371fe119f2fef737402b705b810bd95ad5f348e6e1a6ae21af", size = 663781, upload-time = "2025-07-29T18:38:42.984Z" }, - { url = "https://files.pythonhosted.org/packages/fd/2c/bd2a79ba7c759ee192b5601b675b180a3fd6ccf48ffa27fe1782d280f1a7/ml_dtypes-0.5.3-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4cae435a68861660af81fa3c5af16b70ca11a17275c5b662d9c6f58294e0f113", size = 4956217, upload-time = "2025-07-29T18:38:44.65Z" }, - { url = "https://files.pythonhosted.org/packages/14/f3/091ba84e5395d7fe5b30c081a44dec881cd84b408db1763ee50768b2ab63/ml_dtypes-0.5.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6936283b56d74fbec431ca57ce58a90a908fdbd14d4e2d22eea6d72bb208a7b7", size = 4933109, upload-time = "2025-07-29T18:38:46.405Z" }, - { url = "https://files.pythonhosted.org/packages/bc/24/054036dbe32c43295382c90a1363241684c4d6aaa1ecc3df26bd0c8d5053/ml_dtypes-0.5.3-cp313-cp313-win_amd64.whl", hash = "sha256:d0f730a17cf4f343b2c7ad50cee3bd19e969e793d2be6ed911f43086460096e4", size = 208187, upload-time = "2025-07-29T18:38:48.24Z" }, - { url = "https://files.pythonhosted.org/packages/a6/3d/7dc3ec6794a4a9004c765e0c341e32355840b698f73fd2daff46f128afc1/ml_dtypes-0.5.3-cp313-cp313-win_arm64.whl", hash = "sha256:2db74788fc01914a3c7f7da0763427280adfc9cd377e9604b6b64eb8097284bd", size = 161559, upload-time = "2025-07-29T18:38:50.493Z" }, - { url = "https://files.pythonhosted.org/packages/12/91/e6c7a0d67a152b9330445f9f0cf8ae6eee9b83f990b8c57fe74631e42a90/ml_dtypes-0.5.3-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:93c36a08a6d158db44f2eb9ce3258e53f24a9a4a695325a689494f0fdbc71770", size = 689321, upload-time = "2025-07-29T18:38:52.03Z" }, - { url = "https://files.pythonhosted.org/packages/9e/6c/b7b94b84a104a5be1883305b87d4c6bd6ae781504474b4cca067cb2340ec/ml_dtypes-0.5.3-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0e44a3761f64bc009d71ddb6d6c71008ba21b53ab6ee588dadab65e2fa79eafc", size = 5274495, upload-time = "2025-07-29T18:38:53.797Z" }, - { url = "https://files.pythonhosted.org/packages/5b/38/6266604dffb43378055394ea110570cf261a49876fc48f548dfe876f34cc/ml_dtypes-0.5.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bdf40d2aaabd3913dec11840f0d0ebb1b93134f99af6a0a4fd88ffe924928ab4", size = 5285422, upload-time = "2025-07-29T18:38:56.603Z" }, - { url = "https://files.pythonhosted.org/packages/7c/88/8612ff177d043a474b9408f0382605d881eeb4125ba89d4d4b3286573a83/ml_dtypes-0.5.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:aec640bd94c4c85c0d11e2733bd13cbb10438fb004852996ec0efbc6cacdaf70", size = 661182, upload-time = "2025-07-29T18:38:58.414Z" }, - { url = "https://files.pythonhosted.org/packages/6f/2b/0569a5e88b29240d373e835107c94ae9256fb2191d3156b43b2601859eff/ml_dtypes-0.5.3-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bda32ce212baa724e03c68771e5c69f39e584ea426bfe1a701cb01508ffc7035", size = 4956187, upload-time = "2025-07-29T18:39:00.611Z" }, - { url = "https://files.pythonhosted.org/packages/51/66/273c2a06ae44562b104b61e6b14444da00061fd87652506579d7eb2c40b1/ml_dtypes-0.5.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c205cac07d24a29840c163d6469f61069ce4b065518519216297fc2f261f8db9", size = 4930911, upload-time = "2025-07-29T18:39:02.405Z" }, - { url = "https://files.pythonhosted.org/packages/93/ab/606be3e87dc0821bd360c8c1ee46108025c31a4f96942b63907bb441b87d/ml_dtypes-0.5.3-cp314-cp314-win_amd64.whl", hash = "sha256:cd7c0bb22d4ff86d65ad61b5dd246812e8993fbc95b558553624c33e8b6903ea", size = 216664, upload-time = "2025-07-29T18:39:03.927Z" }, - { url = "https://files.pythonhosted.org/packages/30/a2/e900690ca47d01dffffd66375c5de8c4f8ced0f1ef809ccd3b25b3e6b8fa/ml_dtypes-0.5.3-cp314-cp314-win_arm64.whl", hash = "sha256:9d55ea7f7baf2aed61bf1872116cefc9d0c3693b45cae3916897ee27ef4b835e", size = 160203, upload-time = "2025-07-29T18:39:05.671Z" }, - { url = "https://files.pythonhosted.org/packages/53/21/783dfb51f40d2660afeb9bccf3612b99f6a803d980d2a09132b0f9d216ab/ml_dtypes-0.5.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:e12e29764a0e66a7a31e9b8bf1de5cc0423ea72979f45909acd4292de834ccd3", size = 689324, upload-time = "2025-07-29T18:39:07.567Z" }, - { url = "https://files.pythonhosted.org/packages/09/f7/a82d249c711abf411ac027b7163f285487f5e615c3e0716c61033ce996ab/ml_dtypes-0.5.3-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:19f6c3a4f635c2fc9e2aa7d91416bd7a3d649b48350c51f7f715a09370a90d93", size = 5275917, upload-time = "2025-07-29T18:39:09.339Z" }, - { url = "https://files.pythonhosted.org/packages/7f/3c/541c4b30815ab90ebfbb51df15d0b4254f2f9f1e2b4907ab229300d5e6f2/ml_dtypes-0.5.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ab039ffb40f3dc0aeeeba84fd6c3452781b5e15bef72e2d10bcb33e4bbffc39", size = 5285284, upload-time = "2025-07-29T18:39:11.532Z" }, -] - [[package]] name = "more-itertools" version = "10.8.0" @@ -2376,7 +1871,7 @@ wheels = [ [[package]] name = "openai" -version = "1.105.0" +version = "2.16.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -2388,9 +1883,9 @@ dependencies = [ { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6f/a9/c8c2dea8066a8f3079f69c242f7d0d75aaad4c4c3431da5b0df22a24e75d/openai-1.105.0.tar.gz", hash = "sha256:a68a47adce0506d34def22dd78a42cbb6cfecae1cf6a5fe37f38776d32bbb514", size = 557265, upload-time = "2025-09-03T14:14:08.586Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b1/6c/e4c964fcf1d527fdf4739e7cc940c60075a4114d50d03871d5d5b1e13a88/openai-2.16.0.tar.gz", hash = "sha256:42eaa22ca0d8ded4367a77374104d7a2feafee5bd60a107c3c11b5243a11cd12", size = 629649, upload-time = "2026-01-27T23:28:02.579Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/51/01/186845829d3a3609bb5b474067959076244dd62540d3e336797319b13924/openai-1.105.0-py3-none-any.whl", hash = "sha256:3ad7635132b0705769ccae31ca7319f59ec0c7d09e94e5e713ce2d130e5b021f", size = 928203, upload-time = "2025-09-03T14:14:06.842Z" }, + { url = "https://files.pythonhosted.org/packages/16/83/0315bf2cfd75a2ce8a7e54188e9456c60cec6c0cf66728ed07bd9859ff26/openai-2.16.0-py3-none-any.whl", hash = "sha256:5f46643a8f42899a84e80c38838135d7038e7718333ce61396994f887b09a59b", size = 1068612, upload-time = "2026-01-27T23:28:00.356Z" }, ] [[package]] @@ -2444,32 +1939,32 @@ wheels = [ [[package]] name = "opentelemetry-api" -version = "1.36.0" +version = "1.39.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "importlib-metadata" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/27/d2/c782c88b8afbf961d6972428821c302bd1e9e7bc361352172f0ca31296e2/opentelemetry_api-1.36.0.tar.gz", hash = "sha256:9a72572b9c416d004d492cbc6e61962c0501eaf945ece9b5a0f56597d8348aa0", size = 64780, upload-time = "2025-07-29T15:12:06.02Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c0/0b/e5428c009d4d9af0515b0a8371a8aaae695371af291f45e702f7969dce6b/opentelemetry_api-1.39.0.tar.gz", hash = "sha256:6130644268c5ac6bdffaf660ce878f10906b3e789f7e2daa5e169b047a2933b9", size = 65763, upload-time = "2025-12-03T13:19:56.378Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bb/ee/6b08dde0a022c463b88f55ae81149584b125a42183407dc1045c486cc870/opentelemetry_api-1.36.0-py3-none-any.whl", hash = "sha256:02f20bcacf666e1333b6b1f04e647dc1d5111f86b8e510238fcc56d7762cda8c", size = 65564, upload-time = "2025-07-29T15:11:47.998Z" }, + { url = "https://files.pythonhosted.org/packages/05/85/d831a9bc0a9e0e1a304ff3d12c1489a5fbc9bf6690a15dcbdae372bbca45/opentelemetry_api-1.39.0-py3-none-any.whl", hash = "sha256:3c3b3ca5c5687b1b5b37e5c5027ff68eacea8675241b29f13110a8ffbb8f0459", size = 66357, upload-time = "2025-12-03T13:19:33.043Z" }, ] [[package]] name = "opentelemetry-exporter-otlp-proto-common" -version = "1.36.0" +version = "1.39.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-proto" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/34/da/7747e57eb341c59886052d733072bc878424bf20f1d8cf203d508bbece5b/opentelemetry_exporter_otlp_proto_common-1.36.0.tar.gz", hash = "sha256:6c496ccbcbe26b04653cecadd92f73659b814c6e3579af157d8716e5f9f25cbf", size = 20302, upload-time = "2025-07-29T15:12:07.71Z" } +sdist = { url = "https://files.pythonhosted.org/packages/11/cb/3a29ce606b10c76d413d6edd42d25a654af03e73e50696611e757d2602f3/opentelemetry_exporter_otlp_proto_common-1.39.0.tar.gz", hash = "sha256:a135fceed1a6d767f75be65bd2845da344dd8b9258eeed6bc48509d02b184409", size = 20407, upload-time = "2025-12-03T13:19:59.003Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/ed/22290dca7db78eb32e0101738366b5bbda00d0407f00feffb9bf8c3fdf87/opentelemetry_exporter_otlp_proto_common-1.36.0-py3-none-any.whl", hash = "sha256:0fc002a6ed63eac235ada9aa7056e5492e9a71728214a61745f6ad04b923f840", size = 18349, upload-time = "2025-07-29T15:11:51.327Z" }, + { url = "https://files.pythonhosted.org/packages/ef/c6/215edba62d13a3948c718b289539f70e40965bc37fc82ecd55bb0b749c1a/opentelemetry_exporter_otlp_proto_common-1.39.0-py3-none-any.whl", hash = "sha256:3d77be7c4bdf90f1a76666c934368b8abed730b5c6f0547a2ec57feb115849ac", size = 18367, upload-time = "2025-12-03T13:19:36.906Z" }, ] [[package]] name = "opentelemetry-exporter-otlp-proto-grpc" -version = "1.36.0" +version = "1.39.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "googleapis-common-protos" }, @@ -2480,14 +1975,14 @@ dependencies = [ { name = "opentelemetry-sdk" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/6f/6c1b0bdd0446e5532294d1d41bf11fbaea39c8a2423a4cdfe4fe6b708127/opentelemetry_exporter_otlp_proto_grpc-1.36.0.tar.gz", hash = "sha256:b281afbf7036b325b3588b5b6c8bb175069e3978d1bd24071f4a59d04c1e5bbf", size = 23822, upload-time = "2025-07-29T15:12:08.292Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/62/4db083ee9620da3065eeb559e9fc128f41a1d15e7c48d7c83aafbccd354c/opentelemetry_exporter_otlp_proto_grpc-1.39.0.tar.gz", hash = "sha256:7e7bb3f436006836c0e0a42ac619097746ad5553ad7128a5bd4d3e727f37fc06", size = 24650, upload-time = "2025-12-03T13:20:00.06Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/67/5f6bd188d66d0fd8e81e681bbf5822e53eb150034e2611dd2b935d3ab61a/opentelemetry_exporter_otlp_proto_grpc-1.36.0-py3-none-any.whl", hash = "sha256:734e841fc6a5d6f30e7be4d8053adb703c70ca80c562ae24e8083a28fadef211", size = 18828, upload-time = "2025-07-29T15:11:52.235Z" }, + { url = "https://files.pythonhosted.org/packages/56/e8/d420b94ffddfd8cff85bb4aa5d98da26ce7935dc3cf3eca6b83cd39ab436/opentelemetry_exporter_otlp_proto_grpc-1.39.0-py3-none-any.whl", hash = "sha256:758641278050de9bb895738f35ff8840e4a47685b7e6ef4a201fe83196ba7a05", size = 19765, upload-time = "2025-12-03T13:19:38.143Z" }, ] [[package]] name = "opentelemetry-exporter-otlp-proto-http" -version = "1.36.0" +version = "1.39.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "googleapis-common-protos" }, @@ -2498,14 +1993,14 @@ dependencies = [ { name = "requests" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/25/85/6632e7e5700ba1ce5b8a065315f92c1e6d787ccc4fb2bdab15139eaefc82/opentelemetry_exporter_otlp_proto_http-1.36.0.tar.gz", hash = "sha256:dd3637f72f774b9fc9608ab1ac479f8b44d09b6fb5b2f3df68a24ad1da7d356e", size = 16213, upload-time = "2025-07-29T15:12:08.932Z" } +sdist = { url = "https://files.pythonhosted.org/packages/81/dc/1e9bf3f6a28e29eba516bc0266e052996d02bc7e92675f3cd38169607609/opentelemetry_exporter_otlp_proto_http-1.39.0.tar.gz", hash = "sha256:28d78fc0eb82d5a71ae552263d5012fa3ebad18dfd189bf8d8095ba0e65ee1ed", size = 17287, upload-time = "2025-12-03T13:20:01.134Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7f/41/a680d38b34f8f5ddbd78ed9f0042e1cc712d58ec7531924d71cb1e6c629d/opentelemetry_exporter_otlp_proto_http-1.36.0-py3-none-any.whl", hash = "sha256:3d769f68e2267e7abe4527f70deb6f598f40be3ea34c6adc35789bea94a32902", size = 18752, upload-time = "2025-07-29T15:11:53.164Z" }, + { url = "https://files.pythonhosted.org/packages/bc/46/e4a102e17205bb05a50dbf24ef0e92b66b648cd67db9a68865af06a242fd/opentelemetry_exporter_otlp_proto_http-1.39.0-py3-none-any.whl", hash = "sha256:5789cb1375a8b82653328c0ce13a054d285f774099faf9d068032a49de4c7862", size = 19639, upload-time = "2025-12-03T13:19:39.536Z" }, ] [[package]] name = "opentelemetry-instrumentation" -version = "0.57b0" +version = "0.60b0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, @@ -2513,14 +2008,14 @@ dependencies = [ { name = "packaging" }, { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/12/37/cf17cf28f945a3aca5a038cfbb45ee01317d4f7f3a0e5209920883fe9b08/opentelemetry_instrumentation-0.57b0.tar.gz", hash = "sha256:f2a30135ba77cdea2b0e1df272f4163c154e978f57214795d72f40befd4fcf05", size = 30807, upload-time = "2025-07-29T15:42:44.746Z" } +sdist = { url = "https://files.pythonhosted.org/packages/55/3c/bd53dbb42eff93d18e3047c7be11224aa9966ce98ac4cc5bfb860a32c95a/opentelemetry_instrumentation-0.60b0.tar.gz", hash = "sha256:4e9fec930f283a2677a2217754b40aaf9ef76edae40499c165bc7f1d15366a74", size = 31707, upload-time = "2025-12-03T13:22:00.352Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/6f/f20cd1542959f43fb26a5bf9bb18cd81a1ea0700e8870c8f369bd07f5c65/opentelemetry_instrumentation-0.57b0-py3-none-any.whl", hash = "sha256:9109280f44882e07cec2850db28210b90600ae9110b42824d196de357cbddf7e", size = 32460, upload-time = "2025-07-29T15:41:40.883Z" }, + { url = "https://files.pythonhosted.org/packages/5c/7b/5b5b9f8cfe727a28553acf9cd287b1d7f706f5c0a00d6e482df55b169483/opentelemetry_instrumentation-0.60b0-py3-none-any.whl", hash = "sha256:aaafa1483543a402819f1bdfb06af721c87d60dd109501f9997332862a35c76a", size = 33096, upload-time = "2025-12-03T13:20:51.785Z" }, ] [[package]] name = "opentelemetry-instrumentation-asgi" -version = "0.57b0" +version = "0.60b0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "asgiref" }, @@ -2529,14 +2024,14 @@ dependencies = [ { name = "opentelemetry-semantic-conventions" }, { name = "opentelemetry-util-http" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/97/10/7ba59b586eb099fa0155521b387d857de476687c670096597f618d889323/opentelemetry_instrumentation_asgi-0.57b0.tar.gz", hash = "sha256:a6f880b5d1838f65688fc992c65fbb1d3571f319d370990c32e759d3160e510b", size = 24654, upload-time = "2025-07-29T15:42:48.199Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/0a/715ea7044708d3c215385fb2a1c6ffe429aacb3cd23a348060aaeda52834/opentelemetry_instrumentation_asgi-0.60b0.tar.gz", hash = "sha256:928731218050089dca69f0fe980b8bfe109f384be8b89802d7337372ddb67b91", size = 26083, upload-time = "2025-12-03T13:22:05.672Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/07/ab97dd7e8bc680b479203f7d3b2771b7a097468135a669a38da3208f96cb/opentelemetry_instrumentation_asgi-0.57b0-py3-none-any.whl", hash = "sha256:47debbde6af066a7e8e911f7193730d5e40d62effc1ac2e1119908347790a3ea", size = 16599, upload-time = "2025-07-29T15:41:48.332Z" }, + { url = "https://files.pythonhosted.org/packages/9b/8c/c6c59127fd996107243ca45669355665a7daff578ddafb86d6d2d3b01428/opentelemetry_instrumentation_asgi-0.60b0-py3-none-any.whl", hash = "sha256:9d76a541269452c718a0384478f3291feb650c5a3f29e578fdc6613ea3729cf3", size = 16907, upload-time = "2025-12-03T13:20:58.962Z" }, ] [[package]] name = "opentelemetry-instrumentation-dbapi" -version = "0.57b0" +version = "0.60b0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, @@ -2544,14 +2039,14 @@ dependencies = [ { name = "opentelemetry-semantic-conventions" }, { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/15/dc/5a17b2fb593901ba5257278073b28d0ed31497e56985990c26046e4da2d9/opentelemetry_instrumentation_dbapi-0.57b0.tar.gz", hash = "sha256:7ad9e39c91f6212f118435fd6fab842a1f78b2cbad1167f228c025bba2a8fc2d", size = 14176, upload-time = "2025-07-29T15:42:56.249Z" } +sdist = { url = "https://files.pythonhosted.org/packages/12/7f/b4c1fbce01b29daad5ef1396427c9cd3c7a55ee68e75f8c11089c7e2533d/opentelemetry_instrumentation_dbapi-0.60b0.tar.gz", hash = "sha256:2b7eb38e46890cebe5bc1a1c03d2ab07fc159b0b7b91342941ee33dd73876d84", size = 16311, upload-time = "2025-12-03T13:22:15.369Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/71/21a7e862dead70267b7c7bd5aa4e0b61fbc9fa9b4be57f4e183766abbad9/opentelemetry_instrumentation_dbapi-0.57b0-py3-none-any.whl", hash = "sha256:c1b110a5e86ec9b52b970460917523f47afa0c73f131e7f03c6a7c1921822dc4", size = 12466, upload-time = "2025-07-29T15:41:59.775Z" }, + { url = "https://files.pythonhosted.org/packages/23/0a/65e100c6d803de59a9113a993dcd371a4027453ba15ce4dabdb0343ca154/opentelemetry_instrumentation_dbapi-0.60b0-py3-none-any.whl", hash = "sha256:429d8ca34a44a4296b9b09a1bd373fff350998d200525c6e79883c3328559b03", size = 13966, upload-time = "2025-12-03T13:21:12.435Z" }, ] [[package]] name = "opentelemetry-instrumentation-django" -version = "0.57b0" +version = "0.60b0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, @@ -2560,14 +2055,14 @@ dependencies = [ { name = "opentelemetry-semantic-conventions" }, { name = "opentelemetry-util-http" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5a/88/d88268c37aabbd2bcc54f4f868394316fa6fdfd3b91e011d229617d862d3/opentelemetry_instrumentation_django-0.57b0.tar.gz", hash = "sha256:df4116d2ea2c6bbbbf8853b843deb74d66bd0d573ddd372ec84fd60adaf977c6", size = 25005, upload-time = "2025-07-29T15:42:56.88Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/d2/8ddd9a5c61cd5048d422be8d22fac40f603aa82f0babf9f7c40db871080c/opentelemetry_instrumentation_django-0.60b0.tar.gz", hash = "sha256:461e6fca27936ba97eec26da38bb5f19310783370478c7ca3a3e40faaceac9cc", size = 26596, upload-time = "2025-12-03T13:22:16.069Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/97/f0/1d5022f2fe16d50b79d9f1f5b70bd08d0e59819e0f6b237cff82c3dbda0f/opentelemetry_instrumentation_django-0.57b0-py3-none-any.whl", hash = "sha256:3d702d79a9ec0c836ccf733becf34630c6afb3c86c25c330c5b7601debe1e7c5", size = 19597, upload-time = "2025-07-29T15:42:00.657Z" }, + { url = "https://files.pythonhosted.org/packages/18/d6/28684547bf6c699582e998a172ba8bb08405cf6706729b0d6a16042e998f/opentelemetry_instrumentation_django-0.60b0-py3-none-any.whl", hash = "sha256:95495649c8c34ce9217c6873cdd10fc4fcaa67c25f8329adc54f5b286999e40b", size = 21169, upload-time = "2025-12-03T13:21:13.475Z" }, ] [[package]] name = "opentelemetry-instrumentation-fastapi" -version = "0.57b0" +version = "0.60b0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, @@ -2576,14 +2071,14 @@ dependencies = [ { name = "opentelemetry-semantic-conventions" }, { name = "opentelemetry-util-http" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/47/a8/7c22a33ff5986523a7f9afcb5f4d749533842c3cc77ef55b46727580edd0/opentelemetry_instrumentation_fastapi-0.57b0.tar.gz", hash = "sha256:73ac22f3c472a8f9cb21d1fbe5a4bf2797690c295fff4a1c040e9b1b1688a105", size = 20277, upload-time = "2025-07-29T15:42:58.68Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/51/a021a7c929b5103fcb6bfdfa5a99abcaeb3b505faf9e3ee3ec14612c1ef9/opentelemetry_instrumentation_fastapi-0.60b0.tar.gz", hash = "sha256:5d34d67eb634a08bfe9e530680d6177521cd9da79285144e6d5a8f42683ed1b3", size = 24960, upload-time = "2025-12-03T13:22:18.468Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/df/f20fc21c88c7af5311bfefc15fc4e606bab5edb7c193aa8c73c354904c35/opentelemetry_instrumentation_fastapi-0.57b0-py3-none-any.whl", hash = "sha256:61e6402749ffe0bfec582e58155e0d81dd38723cd9bc4562bca1acca80334006", size = 12712, upload-time = "2025-07-29T15:42:03.332Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5a/e238c108eb65a726d75184439377a87d532050036b54e718e4c789b26d1a/opentelemetry_instrumentation_fastapi-0.60b0-py3-none-any.whl", hash = "sha256:415c6602db01ee339276ea4cabe3e80177c9e955631c087f2ef60a75e31bfaee", size = 13478, upload-time = "2025-12-03T13:21:16.804Z" }, ] [[package]] name = "opentelemetry-instrumentation-flask" -version = "0.57b0" +version = "0.60b0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, @@ -2593,9 +2088,9 @@ dependencies = [ { name = "opentelemetry-util-http" }, { name = "packaging" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5f/98/8a8fa41f624069ac2912141b65bd528fd345d65e14a359c4d896fc3dc291/opentelemetry_instrumentation_flask-0.57b0.tar.gz", hash = "sha256:c5244a40b03664db966d844a32f43c900181431b77929be62a68d4907e86ed25", size = 19381, upload-time = "2025-07-29T15:42:59.38Z" } +sdist = { url = "https://files.pythonhosted.org/packages/30/cc/e0758c23d66fd49956169cb24b5b06130373da2ce8d49945abce82003518/opentelemetry_instrumentation_flask-0.60b0.tar.gz", hash = "sha256:560f08598ef40cdcf7ca05bfb2e3ea74fab076e676f4c18bb36bb379bf5c4a1b", size = 20336, upload-time = "2025-12-03T13:22:19.162Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bb/3f/79b6c9a240221f5614a143eab6a0ecacdcb23b93cc35ff2b78234f68804f/opentelemetry_instrumentation_flask-0.57b0-py3-none-any.whl", hash = "sha256:5ecd614f194825725b61ee9ba8e37dcd4d3f9b5d40fef759df8650d6a91b1cb9", size = 14688, upload-time = "2025-07-29T15:42:04.162Z" }, + { url = "https://files.pythonhosted.org/packages/9b/b5/387ce11f59e5ce65b890adc3f9c457877143b8a6d107a3a0b305397933a1/opentelemetry_instrumentation_flask-0.60b0-py3-none-any.whl", hash = "sha256:106e5774f79ac9b86dd0d949c1b8f46c807a8af16184301e10d24fc94e680d04", size = 15189, upload-time = "2025-12-03T13:21:18.672Z" }, ] [[package]] @@ -2615,21 +2110,21 @@ wheels = [ [[package]] name = "opentelemetry-instrumentation-psycopg2" -version = "0.57b0" +version = "0.60b0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, { name = "opentelemetry-instrumentation" }, { name = "opentelemetry-instrumentation-dbapi" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a8/66/f2004cde131663810e62b47bb48b684660632876f120c6b1d400a04ccb06/opentelemetry_instrumentation_psycopg2-0.57b0.tar.gz", hash = "sha256:4e9d05d661c50985f0a5d7f090a7f399d453b467c9912c7611fcef693d15b038", size = 10722, upload-time = "2025-07-29T15:43:05.644Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/68/5ae8a3b9a28c2fdf8d3d050e451ddb2612ca963679b08a2959f01f6dda4b/opentelemetry_instrumentation_psycopg2-0.60b0.tar.gz", hash = "sha256:59e527fd97739440380634ffcf9431aa7f2965d939d8d5829790886e2b54ede9", size = 11266, upload-time = "2025-12-03T13:22:26.025Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/02/40/00f9c1334fb0c9d74c99d37c4a730cbe6dc941eea5fae6f9bc36e5a53d19/opentelemetry_instrumentation_psycopg2-0.57b0-py3-none-any.whl", hash = "sha256:94fdde02b7451c8e85d43b4b9dd13a34fee96ffd43324d1b3567f47d2903b99f", size = 10721, upload-time = "2025-07-29T15:42:15.698Z" }, + { url = "https://files.pythonhosted.org/packages/d4/24/66b5a41a2b0d1d07cc9b0fbd80f8b5c66b46a4d4731743505891da8b3cbe/opentelemetry_instrumentation_psycopg2-0.60b0-py3-none-any.whl", hash = "sha256:ea136a32babd559aa717c04dddf6aa78aa94b816fb4e10dfe06751727ef306d4", size = 11284, upload-time = "2025-12-03T13:21:31.23Z" }, ] [[package]] name = "opentelemetry-instrumentation-requests" -version = "0.57b0" +version = "0.60b0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, @@ -2637,14 +2132,14 @@ dependencies = [ { name = "opentelemetry-semantic-conventions" }, { name = "opentelemetry-util-http" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0d/e1/01f5c28a60ffbc4c04946ad35bc8bf16382d333e41afaa042b31c35364b9/opentelemetry_instrumentation_requests-0.57b0.tar.gz", hash = "sha256:193bd3fd1f14737721876fb1952dffc7d43795586118df633a91ecd9057446ff", size = 15182, upload-time = "2025-07-29T15:43:11.812Z" } +sdist = { url = "https://files.pythonhosted.org/packages/26/0f/94c6181e95c867f559715887c418170a9eadd92ea6090122d464e375ff56/opentelemetry_instrumentation_requests-0.60b0.tar.gz", hash = "sha256:5079ed8df96d01dab915a0766cd28a49be7c33439ce43d6d39843ed6dee3204f", size = 16173, upload-time = "2025-12-03T13:22:31.458Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/7d/40144701fa22521e3b3fce23e2f0a5684a9385c90b119b70e7598b3cb607/opentelemetry_instrumentation_requests-0.57b0-py3-none-any.whl", hash = "sha256:66a576ac8080724ddc8a14c39d16bb5f430991bd504fdbea844c7a063f555971", size = 12966, upload-time = "2025-07-29T15:42:24.608Z" }, + { url = "https://files.pythonhosted.org/packages/f1/e1/2f13b41c5679243ba8eae651170c4ce2f532349877819566ae4a89a2b47f/opentelemetry_instrumentation_requests-0.60b0-py3-none-any.whl", hash = "sha256:e9957f3a650ae55502fa227b29ff985b37d63e41c85e6e1555d48039f092ea83", size = 13122, upload-time = "2025-12-03T13:21:38.983Z" }, ] [[package]] name = "opentelemetry-instrumentation-urllib" -version = "0.57b0" +version = "0.60b0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, @@ -2652,14 +2147,14 @@ dependencies = [ { name = "opentelemetry-semantic-conventions" }, { name = "opentelemetry-util-http" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/86/a5/9d400dd978ac5e81356fe8435ca264e140a7d4cf77a88db43791d62311d5/opentelemetry_instrumentation_urllib-0.57b0.tar.gz", hash = "sha256:657225ceae8bb52b67bd5c26dcb8a33f0efb041f1baea4c59dbd1adbc63a4162", size = 13929, upload-time = "2025-07-29T15:43:16.498Z" } +sdist = { url = "https://files.pythonhosted.org/packages/95/db/be895de04bd56d7a2b2ef6d267a4c52f6cd325b6647d1c15ae888b1b0f6a/opentelemetry_instrumentation_urllib-0.60b0.tar.gz", hash = "sha256:89b8796f9ab64d0ea0833cfea98745963baa0d7e4a775b3d2a77791aa97cf3f9", size = 13931, upload-time = "2025-12-03T13:22:37.44Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/79/47/3c9535a68b9dd125eb6a25c086984e5cee7285e4f36bfa37eeb40e95d2b5/opentelemetry_instrumentation_urllib-0.57b0-py3-none-any.whl", hash = "sha256:bb3a01172109a6f56bfcc38ea83b9d4a61c4c2cac6b9a190e757063daadf545c", size = 12671, upload-time = "2025-07-29T15:42:34.561Z" }, + { url = "https://files.pythonhosted.org/packages/2b/e0/178914d5cec77baef797c6d47412da478ff871b05eb8732d64037b87c868/opentelemetry_instrumentation_urllib-0.60b0-py3-none-any.whl", hash = "sha256:80e3545d02505dc0ea61b3a0a141ec2828e11bee6b7dedfd3ee7ed9a7adbf862", size = 12673, upload-time = "2025-12-03T13:21:48.139Z" }, ] [[package]] name = "opentelemetry-instrumentation-urllib3" -version = "0.57b0" +version = "0.60b0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, @@ -2668,14 +2163,14 @@ dependencies = [ { name = "opentelemetry-util-http" }, { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9a/2d/c241e9716c94704dbddf64e2c7367b57642425455befdbc622936bec78e9/opentelemetry_instrumentation_urllib3-0.57b0.tar.gz", hash = "sha256:f49d8c3d1d81ae56304a08b14a7f564d250733ed75cd2210ccef815b5af2eea1", size = 15790, upload-time = "2025-07-29T15:43:17.05Z" } +sdist = { url = "https://files.pythonhosted.org/packages/25/a8/16a32239e84741fae1a2932badeade5e72b73bfc331b53f7049a648ca00b/opentelemetry_instrumentation_urllib3-0.60b0.tar.gz", hash = "sha256:6ae1640a993901bae8eda5496d8b1440fb326a29e4ba1db342738b8868174aad", size = 15789, upload-time = "2025-12-03T13:22:38.073Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/06/0e/a5467ab57d815caa58cbabb3a7f3906c3718c599221ac770482d13187306/opentelemetry_instrumentation_urllib3-0.57b0-py3-none-any.whl", hash = "sha256:337ecac6df3ff92026b51c64df7dd4a3fff52f2dc96036ea9371670243bf83c6", size = 13186, upload-time = "2025-07-29T15:42:35.775Z" }, + { url = "https://files.pythonhosted.org/packages/16/b2/ca27479eaf1f3f4825481769eb0cb200cad839040b8d5f42662d0398a256/opentelemetry_instrumentation_urllib3-0.60b0-py3-none-any.whl", hash = "sha256:9a07504560feae650a9205b3e2a579a835819bb1d55498d26a5db477fe04bba0", size = 13187, upload-time = "2025-12-03T13:21:49.482Z" }, ] [[package]] name = "opentelemetry-instrumentation-wsgi" -version = "0.57b0" +version = "0.60b0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, @@ -2683,21 +2178,21 @@ dependencies = [ { name = "opentelemetry-semantic-conventions" }, { name = "opentelemetry-util-http" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f8/3f/d1ab49d68f2f6ebbe3c2fa5ff609ee5603a9cc68915203c454afb3a38d5b/opentelemetry_instrumentation_wsgi-0.57b0.tar.gz", hash = "sha256:d7e16b3b87930c30fc4c1bbc8b58c5dd6eefade493a3a5e7343bc24d572bc5b7", size = 18376, upload-time = "2025-07-29T15:43:17.683Z" } +sdist = { url = "https://files.pythonhosted.org/packages/10/ad/ae04e35f3b96d9c20d5d3df94a4c296eabf7a54d35d6c831179471128270/opentelemetry_instrumentation_wsgi-0.60b0.tar.gz", hash = "sha256:5815195b1b9890f55c4baafec94ff98591579a7d9b16256064adea8ee5784651", size = 19104, upload-time = "2025-12-03T13:22:38.733Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1f/0c/7760f9e14f4f8128e4880b4fd5f232ef4eb00cb29ee560c972dbf7801369/opentelemetry_instrumentation_wsgi-0.57b0-py3-none-any.whl", hash = "sha256:b9cf0c6e61489f7503fc17ef04d169bd214e7a825650ee492f5d2b4d73b17b54", size = 14450, upload-time = "2025-07-29T15:42:37.351Z" }, + { url = "https://files.pythonhosted.org/packages/73/0e/1ed4d3cdce7b2e00a24f79933b3472e642d4db98aaccc09769be5cbe5296/opentelemetry_instrumentation_wsgi-0.60b0-py3-none-any.whl", hash = "sha256:0ff80614c1e73f7e94a5860c7e6222a51195eebab3dc5f50d89013db3d5d2f13", size = 14553, upload-time = "2025-12-03T13:21:50.491Z" }, ] [[package]] name = "opentelemetry-proto" -version = "1.36.0" +version = "1.39.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fd/02/f6556142301d136e3b7e95ab8ea6a5d9dc28d879a99f3dd673b5f97dca06/opentelemetry_proto-1.36.0.tar.gz", hash = "sha256:0f10b3c72f74c91e0764a5ec88fd8f1c368ea5d9c64639fb455e2854ef87dd2f", size = 46152, upload-time = "2025-07-29T15:12:15.717Z" } +sdist = { url = "https://files.pythonhosted.org/packages/48/b5/64d2f8c3393cd13ea2092106118f7b98461ba09333d40179a31444c6f176/opentelemetry_proto-1.39.0.tar.gz", hash = "sha256:c1fa48678ad1a1624258698e59be73f990b7fc1f39e73e16a9d08eef65dd838c", size = 46153, upload-time = "2025-12-03T13:20:08.729Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/57/3361e06136225be8180e879199caea520f38026f8071366241ac458beb8d/opentelemetry_proto-1.36.0-py3-none-any.whl", hash = "sha256:151b3bf73a09f94afc658497cf77d45a565606f62ce0c17acb08cd9937ca206e", size = 72537, upload-time = "2025-07-29T15:12:02.243Z" }, + { url = "https://files.pythonhosted.org/packages/e3/4d/d500e1862beed68318705732d1976c390f4a72ca8009c4983ff627acff20/opentelemetry_proto-1.39.0-py3-none-any.whl", hash = "sha256:1e086552ac79acb501485ff0ce75533f70f3382d43d0a30728eeee594f7bf818", size = 72534, upload-time = "2025-12-03T13:19:50.251Z" }, ] [[package]] @@ -2714,29 +2209,29 @@ wheels = [ [[package]] name = "opentelemetry-sdk" -version = "1.36.0" +version = "1.39.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, { name = "opentelemetry-semantic-conventions" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4c/85/8567a966b85a2d3f971c4d42f781c305b2b91c043724fa08fd37d158e9dc/opentelemetry_sdk-1.36.0.tar.gz", hash = "sha256:19c8c81599f51b71670661ff7495c905d8fdf6976e41622d5245b791b06fa581", size = 162557, upload-time = "2025-07-29T15:12:16.76Z" } +sdist = { url = "https://files.pythonhosted.org/packages/51/e3/7cd989003e7cde72e0becfe830abff0df55c69d237ee7961a541e0167833/opentelemetry_sdk-1.39.0.tar.gz", hash = "sha256:c22204f12a0529e07aa4d985f1bca9d6b0e7b29fe7f03e923548ae52e0e15dde", size = 171322, upload-time = "2025-12-03T13:20:09.651Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/59/7bed362ad1137ba5886dac8439e84cd2df6d087be7c09574ece47ae9b22c/opentelemetry_sdk-1.36.0-py3-none-any.whl", hash = "sha256:19fe048b42e98c5c1ffe85b569b7073576ad4ce0bcb6e9b4c6a39e890a6c45fb", size = 119995, upload-time = "2025-07-29T15:12:03.181Z" }, + { url = "https://files.pythonhosted.org/packages/a4/b4/2adc8bc83eb1055ecb592708efb6f0c520cc2eb68970b02b0f6ecda149cf/opentelemetry_sdk-1.39.0-py3-none-any.whl", hash = "sha256:90cfb07600dfc0d2de26120cebc0c8f27e69bf77cd80ef96645232372709a514", size = 132413, upload-time = "2025-12-03T13:19:51.364Z" }, ] [[package]] name = "opentelemetry-semantic-conventions" -version = "0.57b0" +version = "0.60b0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7e/31/67dfa252ee88476a29200b0255bda8dfc2cf07b56ad66dc9a6221f7dc787/opentelemetry_semantic_conventions-0.57b0.tar.gz", hash = "sha256:609a4a79c7891b4620d64c7aac6898f872d790d75f22019913a660756f27ff32", size = 124225, upload-time = "2025-07-29T15:12:17.873Z" } +sdist = { url = "https://files.pythonhosted.org/packages/71/0e/176a7844fe4e3cb5de604212094dffaed4e18b32f1c56b5258bcbcba85c2/opentelemetry_semantic_conventions-0.60b0.tar.gz", hash = "sha256:227d7aa73cbb8a2e418029d6b6465553aa01cf7e78ec9d0bc3255c7b3ac5bf8f", size = 137935, upload-time = "2025-12-03T13:20:12.395Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/05/75/7d591371c6c39c73de5ce5da5a2cc7b72d1d1cd3f8f4638f553c01c37b11/opentelemetry_semantic_conventions-0.57b0-py3-none-any.whl", hash = "sha256:757f7e76293294f124c827e514c2a3144f191ef175b069ce8d1211e1e38e9e78", size = 201627, upload-time = "2025-07-29T15:12:04.174Z" }, + { url = "https://files.pythonhosted.org/packages/d0/56/af0306666f91bae47db14d620775604688361f0f76a872e0005277311131/opentelemetry_semantic_conventions-0.60b0-py3-none-any.whl", hash = "sha256:069530852691136018087b52688857d97bba61cd641d0f8628d2d92788c4f78a", size = 219981, upload-time = "2025-12-03T13:19:53.585Z" }, ] [[package]] @@ -2750,11 +2245,11 @@ wheels = [ [[package]] name = "opentelemetry-util-http" -version = "0.57b0" +version = "0.60b0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9b/1b/6229c45445e08e798fa825f5376f6d6a4211d29052a4088eed6d577fa653/opentelemetry_util_http-0.57b0.tar.gz", hash = "sha256:f7417595ead0eb42ed1863ec9b2f839fc740368cd7bbbfc1d0a47bc1ab0aba11", size = 9405, upload-time = "2025-07-29T15:43:19.916Z" } +sdist = { url = "https://files.pythonhosted.org/packages/38/0d/786a713445cf338131fef3a84fab1378e4b2ef3c3ea348eeb0c915eb804a/opentelemetry_util_http-0.60b0.tar.gz", hash = "sha256:e42b7bb49bba43b6f34390327d97e5016eb1c47949ceaf37c4795472a4e3a82d", size = 10576, upload-time = "2025-12-03T13:22:41.224Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/a6/b98d508d189b9c208f5978d0906141747d7e6df7c7cafec03657ed1ed559/opentelemetry_util_http-0.57b0-py3-none-any.whl", hash = "sha256:e54c0df5543951e471c3d694f85474977cd5765a3b7654398c83bab3d2ffb8e9", size = 7643, upload-time = "2025-07-29T15:42:41.744Z" }, + { url = "https://files.pythonhosted.org/packages/53/5d/a448862f6d10c95685ed0e703596b6bd1784074e7ad90bffdc550abb7b68/opentelemetry_util_http-0.60b0-py3-none-any.whl", hash = "sha256:4f366f1a48adb74ffa6f80aee26f96882e767e01b03cd1cfb948b6e1020341fe", size = 8742, upload-time = "2025-12-03T13:21:54.553Z" }, ] [[package]] @@ -2868,44 +2363,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] -[[package]] -name = "ply" -version = "3.11" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e5/69/882ee5c9d017149285cab114ebeab373308ef0f874fcdac9beb90e0ac4da/ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3", size = 159130, upload-time = "2018-02-15T19:01:31.097Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/58/35da89ee790598a0700ea49b2a66594140f44dec458c07e8e3d4979137fc/ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce", size = 49567, upload-time = "2018-02-15T19:01:27.172Z" }, -] - -[[package]] -name = "portalocker" -version = "3.2.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pywin32", marker = "sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/5e/77/65b857a69ed876e1951e88aaba60f5ce6120c33703f7cb61a3c894b8c1b6/portalocker-3.2.0.tar.gz", hash = "sha256:1f3002956a54a8c3730586c5c77bf18fae4149e07eaf1c29fc3faf4d5a3f89ac", size = 95644, upload-time = "2025-06-14T13:20:40.03Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4b/a6/38c8e2f318bf67d338f4d629e93b0b4b9af331f455f0390ea8ce4a099b26/portalocker-3.2.0-py3-none-any.whl", hash = "sha256:3cdc5f565312224bc570c49337bd21428bba0ef363bbcf58b9ef4a9f11779968", size = 22424, upload-time = "2025-06-14T13:20:38.083Z" }, -] - -[[package]] -name = "posthog" -version = "6.9.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "backoff" }, - { name = "distro" }, - { name = "python-dateutil" }, - { name = "requests" }, - { name = "six" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/36/5e/137aaf1d45cc6fafa5573d24dfae795ceae75fdf3232d298828f2e54d688/posthog-6.9.1.tar.gz", hash = "sha256:0bf1115261369b76e2f643d04805cec434236f23fb69972ed5d1bd49b5a9a6fe", size = 126229, upload-time = "2025-11-07T15:57:26.347Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/91/72/ad1961cc3423f679bceb6c098ec67c5db7ab55dbafc71c5a4faf4ec99d68/posthog-6.9.1-py3-none-any.whl", hash = "sha256:a8e33fef54275c32077afea4b2a0e2ca554b226b63d6fcd319447c81154faa1f", size = 144481, upload-time = "2025-11-07T15:57:25.183Z" }, -] - [[package]] name = "prance" version = "25.4.8.0" @@ -3020,18 +2477,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5b/5a/bc7b4a4ef808fa59a816c17b20c4bef6884daebbdf627ff2a161da67da19/propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237", size = 13305, upload-time = "2025-10-08T19:49:00.792Z" }, ] -[[package]] -name = "proto-plus" -version = "1.26.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "protobuf" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f4/ac/87285f15f7cce6d4a008f33f1757fb5a13611ea8914eb58c3d0d26243468/proto_plus-1.26.1.tar.gz", hash = "sha256:21a515a4c4c0088a773899e23c7bbade3d18f9c66c73edd4c7ee3816bc96a012", size = 56142, upload-time = "2025-03-10T15:54:38.843Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/6d/280c4c2ce28b1593a19ad5239c8b826871fc6ec275c21afc8e1820108039/proto_plus-1.26.1-py3-none-any.whl", hash = "sha256:13285478c2dcf2abb829db158e1047e2f1e8d63a077d94263c2b88b043c75a66", size = 50163, upload-time = "2025-03-10T15:54:37.335Z" }, -] - [[package]] name = "protobuf" version = "5.29.5" @@ -3081,27 +2526,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" }, ] -[[package]] -name = "pyasn1" -version = "0.6.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ba/e9/01f1a64245b89f039897cb0130016d79f77d52669aae6ee7b159a6c4c018/pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034", size = 145322, upload-time = "2024-09-10T22:41:42.55Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629", size = 83135, upload-time = "2024-09-11T16:00:36.122Z" }, -] - -[[package]] -name = "pyasn1-modules" -version = "0.4.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pyasn1" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892, upload-time = "2025-03-28T02:41:22.17Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259, upload-time = "2025-03-28T02:41:19.028Z" }, -] - [[package]] name = "pybars4" version = "0.9.13" @@ -3404,15 +2828,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546, upload-time = "2024-12-16T19:45:44.423Z" }, ] -[[package]] -name = "python-ulid" -version = "3.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/40/7e/0d6c82b5ccc71e7c833aed43d9e8468e1f2ff0be1b3f657a6fcafbb8433d/python_ulid-3.1.0.tar.gz", hash = "sha256:ff0410a598bc5f6b01b602851a3296ede6f91389f913a5d5f8c496003836f636", size = 93175, upload-time = "2025-08-18T16:09:26.305Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6c/a0/4ed6632b70a52de845df056654162acdebaf97c20e3212c559ac43e7216e/python_ulid-3.1.0-py3-none-any.whl", hash = "sha256:e2cdc979c8c877029b4b7a38a6fba3bc4578e4f109a308419ff4d3ccf0a46619", size = 11577, upload-time = "2025-08-18T16:09:25.047Z" }, -] - [[package]] name = "pytz" version = "2025.2" @@ -3496,55 +2911,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, ] -[[package]] -name = "qdrant-client" -version = "1.15.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "grpcio" }, - { name = "httpx", extra = ["http2"] }, - { name = "numpy" }, - { name = "portalocker" }, - { name = "protobuf" }, - { name = "pydantic" }, - { name = "urllib3" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/79/8b/76c7d325e11d97cb8eb5e261c3759e9ed6664735afbf32fdded5b580690c/qdrant_client-1.15.1.tar.gz", hash = "sha256:631f1f3caebfad0fd0c1fba98f41be81d9962b7bf3ca653bed3b727c0e0cbe0e", size = 295297, upload-time = "2025-07-31T19:35:19.627Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/33/d8df6a2b214ffbe4138db9a1efe3248f67dc3c671f82308bea1582ecbbb7/qdrant_client-1.15.1-py3-none-any.whl", hash = "sha256:2b975099b378382f6ca1cfb43f0d59e541be6e16a5892f282a4b8de7eff5cb63", size = 337331, upload-time = "2025-07-31T19:35:17.539Z" }, -] - -[[package]] -name = "redis" -version = "6.4.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "async-timeout", marker = "python_full_version < '3.11.3'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/0d/d6/e8b92798a5bd67d659d51a18170e91c16ac3b59738d91894651ee255ed49/redis-6.4.0.tar.gz", hash = "sha256:b01bc7282b8444e28ec36b261df5375183bb47a07eb9c603f284e89cbc5ef010", size = 4647399, upload-time = "2025-08-07T08:10:11.441Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/02/89e2ed7e85db6c93dfa9e8f691c5087df4e3551ab39081a4d7c6d1f90e05/redis-6.4.0-py3-none-any.whl", hash = "sha256:f0544fa9604264e9464cdf4814e7d4830f74b165d52f2a330a760a88dd248b7f", size = 279847, upload-time = "2025-08-07T08:10:09.84Z" }, -] - -[[package]] -name = "redisvl" -version = "0.11.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jsonpath-ng" }, - { name = "ml-dtypes" }, - { name = "numpy" }, - { name = "pydantic" }, - { name = "python-ulid" }, - { name = "pyyaml" }, - { name = "redis" }, - { name = "tenacity" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f5/dc/72f69eca73c31d6df705ba8a2c25a541248f34d1bd03dd9baef6d9e14fce/redisvl-0.11.0.tar.gz", hash = "sha256:8bd52e059a805756160320f547b04372fe00517596364431f813107d96c6cbf8", size = 670173, upload-time = "2025-11-07T23:55:47.566Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/36/cc/db92f58766f1dfc0472961044d94c755430afa2312967ab8eb411660414c/redisvl-0.11.0-py3-none-any.whl", hash = "sha256:7e2029fd5fc73baf5f024415002d91cdce88168e51113afc1dbc4fcd0f8a210a", size = 172269, upload-time = "2025-11-07T23:55:45.831Z" }, -] - [[package]] name = "referencing" version = "0.36.2" @@ -3799,18 +3165,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ed/d2/4a73b18821fd4669762c855fd1f4e80ceb66fb72d71162d14da58444a763/rpds_py-0.28.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:5d0145edba8abd3db0ab22b5300c99dc152f5c9021fab861be0f0544dc3cbc5f", size = 552199, upload-time = "2025-10-22T22:24:26.54Z" }, ] -[[package]] -name = "rsa" -version = "4.9.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pyasn1" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/da/8a/22b7beea3ee0d44b1916c0c1cb0ee3af23b700b6da9f04991899d0c555d4/rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75", size = 29034, upload-time = "2025-04-16T09:51:18.218Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/64/8d/0133e4eb4beed9e425d9a98ed6e081a55d195481b7632472be1af08d2f6b/rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", size = 34696, upload-time = "2025-04-16T09:51:17.142Z" }, -] - [[package]] name = "ruamel-yaml" version = "0.18.16" @@ -3863,6 +3217,8 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6b/fa/3234f913fe9a6525a7b97c6dad1f51e72b917e6872e051a5e2ffd8b16fbb/ruamel.yaml.clib-0.2.14-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:70eda7703b8126f5e52fcf276e6c0f40b0d314674f896fc58c47b0aef2b9ae83", size = 137970, upload-time = "2025-09-22T19:51:09.472Z" }, { url = "https://files.pythonhosted.org/packages/ef/ec/4edbf17ac2c87fa0845dd366ef8d5852b96eb58fcd65fc1ecf5fe27b4641/ruamel.yaml.clib-0.2.14-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a0cb71ccc6ef9ce36eecb6272c81afdc2f565950cdcec33ae8e6cd8f7fc86f27", size = 739639, upload-time = "2025-09-22T19:51:10.566Z" }, { url = "https://files.pythonhosted.org/packages/15/18/b0e1fafe59051de9e79cdd431863b03593ecfa8341c110affad7c8121efc/ruamel.yaml.clib-0.2.14-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e7cb9ad1d525d40f7d87b6df7c0ff916a66bc52cb61b66ac1b2a16d0c1b07640", size = 764456, upload-time = "2025-09-22T19:51:11.736Z" }, + { url = "https://files.pythonhosted.org/packages/e7/cd/150fdb96b8fab27fe08d8a59fe67554568727981806e6bc2677a16081ec7/ruamel_yaml_clib-0.2.14-cp314-cp314-win32.whl", hash = "sha256:9b4104bf43ca0cd4e6f738cb86326a3b2f6eef00f417bd1e7efb7bdffe74c539", size = 102394, upload-time = "2025-11-14T21:57:36.703Z" }, + { url = "https://files.pythonhosted.org/packages/bd/e6/a3fa40084558c7e1dc9546385f22a93949c890a8b2e445b2ba43935f51da/ruamel_yaml_clib-0.2.14-cp314-cp314-win_amd64.whl", hash = "sha256:13997d7d354a9890ea1ec5937a219817464e5cc344805b37671562a401ca3008", size = 122673, upload-time = "2025-11-14T21:57:38.177Z" }, ] [[package]] @@ -3987,43 +3343,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, ] -[[package]] -name = "sqlalchemy" -version = "2.0.44" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "greenlet", marker = "platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64'" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f0/f2/840d7b9496825333f532d2e3976b8eadbf52034178aac53630d09fe6e1ef/sqlalchemy-2.0.44.tar.gz", hash = "sha256:0ae7454e1ab1d780aee69fd2aae7d6b8670a581d8847f2d1e0f7ddfbf47e5a22", size = 9819830, upload-time = "2025-10-10T14:39:12.935Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e3/81/15d7c161c9ddf0900b076b55345872ed04ff1ed6a0666e5e94ab44b0163c/sqlalchemy-2.0.44-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fe3917059c7ab2ee3f35e77757062b1bea10a0b6ca633c58391e3f3c6c488dd", size = 2140517, upload-time = "2025-10-10T15:36:15.64Z" }, - { url = "https://files.pythonhosted.org/packages/d4/d5/4abd13b245c7d91bdf131d4916fd9e96a584dac74215f8b5bc945206a974/sqlalchemy-2.0.44-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:de4387a354ff230bc979b46b2207af841dc8bf29847b6c7dbe60af186d97aefa", size = 2130738, upload-time = "2025-10-10T15:36:16.91Z" }, - { url = "https://files.pythonhosted.org/packages/cb/3c/8418969879c26522019c1025171cefbb2a8586b6789ea13254ac602986c0/sqlalchemy-2.0.44-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3678a0fb72c8a6a29422b2732fe423db3ce119c34421b5f9955873eb9b62c1e", size = 3304145, upload-time = "2025-10-10T15:34:19.569Z" }, - { url = "https://files.pythonhosted.org/packages/94/2d/fdb9246d9d32518bda5d90f4b65030b9bf403a935cfe4c36a474846517cb/sqlalchemy-2.0.44-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cf6872a23601672d61a68f390e44703442639a12ee9dd5a88bbce52a695e46e", size = 3304511, upload-time = "2025-10-10T15:47:05.088Z" }, - { url = "https://files.pythonhosted.org/packages/7d/fb/40f2ad1da97d5c83f6c1269664678293d3fe28e90ad17a1093b735420549/sqlalchemy-2.0.44-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:329aa42d1be9929603f406186630135be1e7a42569540577ba2c69952b7cf399", size = 3235161, upload-time = "2025-10-10T15:34:21.193Z" }, - { url = "https://files.pythonhosted.org/packages/95/cb/7cf4078b46752dca917d18cf31910d4eff6076e5b513c2d66100c4293d83/sqlalchemy-2.0.44-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:70e03833faca7166e6a9927fbee7c27e6ecde436774cd0b24bbcc96353bce06b", size = 3261426, upload-time = "2025-10-10T15:47:07.196Z" }, - { url = "https://files.pythonhosted.org/packages/f8/3b/55c09b285cb2d55bdfa711e778bdffdd0dc3ffa052b0af41f1c5d6e582fa/sqlalchemy-2.0.44-cp311-cp311-win32.whl", hash = "sha256:253e2f29843fb303eca6b2fc645aca91fa7aa0aa70b38b6950da92d44ff267f3", size = 2105392, upload-time = "2025-10-10T15:38:20.051Z" }, - { url = "https://files.pythonhosted.org/packages/c7/23/907193c2f4d680aedbfbdf7bf24c13925e3c7c292e813326c1b84a0b878e/sqlalchemy-2.0.44-cp311-cp311-win_amd64.whl", hash = "sha256:7a8694107eb4308a13b425ca8c0e67112f8134c846b6e1f722698708741215d5", size = 2130293, upload-time = "2025-10-10T15:38:21.601Z" }, - { url = "https://files.pythonhosted.org/packages/62/c4/59c7c9b068e6813c898b771204aad36683c96318ed12d4233e1b18762164/sqlalchemy-2.0.44-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:72fea91746b5890f9e5e0997f16cbf3d53550580d76355ba2d998311b17b2250", size = 2139675, upload-time = "2025-10-10T16:03:31.064Z" }, - { url = "https://files.pythonhosted.org/packages/d6/ae/eeb0920537a6f9c5a3708e4a5fc55af25900216bdb4847ec29cfddf3bf3a/sqlalchemy-2.0.44-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:585c0c852a891450edbb1eaca8648408a3cc125f18cf433941fa6babcc359e29", size = 2127726, upload-time = "2025-10-10T16:03:35.934Z" }, - { url = "https://files.pythonhosted.org/packages/d8/d5/2ebbabe0379418eda8041c06b0b551f213576bfe4c2f09d77c06c07c8cc5/sqlalchemy-2.0.44-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b94843a102efa9ac68a7a30cd46df3ff1ed9c658100d30a725d10d9c60a2f44", size = 3327603, upload-time = "2025-10-10T15:35:28.322Z" }, - { url = "https://files.pythonhosted.org/packages/45/e5/5aa65852dadc24b7d8ae75b7efb8d19303ed6ac93482e60c44a585930ea5/sqlalchemy-2.0.44-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:119dc41e7a7defcefc57189cfa0e61b1bf9c228211aba432b53fb71ef367fda1", size = 3337842, upload-time = "2025-10-10T15:43:45.431Z" }, - { url = "https://files.pythonhosted.org/packages/41/92/648f1afd3f20b71e880ca797a960f638d39d243e233a7082c93093c22378/sqlalchemy-2.0.44-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0765e318ee9179b3718c4fd7ba35c434f4dd20332fbc6857a5e8df17719c24d7", size = 3264558, upload-time = "2025-10-10T15:35:29.93Z" }, - { url = "https://files.pythonhosted.org/packages/40/cf/e27d7ee61a10f74b17740918e23cbc5bc62011b48282170dc4c66da8ec0f/sqlalchemy-2.0.44-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2e7b5b079055e02d06a4308d0481658e4f06bc7ef211567edc8f7d5dce52018d", size = 3301570, upload-time = "2025-10-10T15:43:48.407Z" }, - { url = "https://files.pythonhosted.org/packages/3b/3d/3116a9a7b63e780fb402799b6da227435be878b6846b192f076d2f838654/sqlalchemy-2.0.44-cp312-cp312-win32.whl", hash = "sha256:846541e58b9a81cce7dee8329f352c318de25aa2f2bbe1e31587eb1f057448b4", size = 2103447, upload-time = "2025-10-10T15:03:21.678Z" }, - { url = "https://files.pythonhosted.org/packages/25/83/24690e9dfc241e6ab062df82cc0df7f4231c79ba98b273fa496fb3dd78ed/sqlalchemy-2.0.44-cp312-cp312-win_amd64.whl", hash = "sha256:7cbcb47fd66ab294703e1644f78971f6f2f1126424d2b300678f419aa73c7b6e", size = 2130912, upload-time = "2025-10-10T15:03:24.656Z" }, - { url = "https://files.pythonhosted.org/packages/45/d3/c67077a2249fdb455246e6853166360054c331db4613cda3e31ab1cadbef/sqlalchemy-2.0.44-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ff486e183d151e51b1d694c7aa1695747599bb00b9f5f604092b54b74c64a8e1", size = 2135479, upload-time = "2025-10-10T16:03:37.671Z" }, - { url = "https://files.pythonhosted.org/packages/2b/91/eabd0688330d6fd114f5f12c4f89b0d02929f525e6bf7ff80aa17ca802af/sqlalchemy-2.0.44-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0b1af8392eb27b372ddb783b317dea0f650241cea5bd29199b22235299ca2e45", size = 2123212, upload-time = "2025-10-10T16:03:41.755Z" }, - { url = "https://files.pythonhosted.org/packages/b0/bb/43e246cfe0e81c018076a16036d9b548c4cc649de241fa27d8d9ca6f85ab/sqlalchemy-2.0.44-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b61188657e3a2b9ac4e8f04d6cf8e51046e28175f79464c67f2fd35bceb0976", size = 3255353, upload-time = "2025-10-10T15:35:31.221Z" }, - { url = "https://files.pythonhosted.org/packages/b9/96/c6105ed9a880abe346b64d3b6ddef269ddfcab04f7f3d90a0bf3c5a88e82/sqlalchemy-2.0.44-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b87e7b91a5d5973dda5f00cd61ef72ad75a1db73a386b62877d4875a8840959c", size = 3260222, upload-time = "2025-10-10T15:43:50.124Z" }, - { url = "https://files.pythonhosted.org/packages/44/16/1857e35a47155b5ad927272fee81ae49d398959cb749edca6eaa399b582f/sqlalchemy-2.0.44-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:15f3326f7f0b2bfe406ee562e17f43f36e16167af99c4c0df61db668de20002d", size = 3189614, upload-time = "2025-10-10T15:35:32.578Z" }, - { url = "https://files.pythonhosted.org/packages/88/ee/4afb39a8ee4fc786e2d716c20ab87b5b1fb33d4ac4129a1aaa574ae8a585/sqlalchemy-2.0.44-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1e77faf6ff919aa8cd63f1c4e561cac1d9a454a191bb864d5dd5e545935e5a40", size = 3226248, upload-time = "2025-10-10T15:43:51.862Z" }, - { url = "https://files.pythonhosted.org/packages/32/d5/0e66097fc64fa266f29a7963296b40a80d6a997b7ac13806183700676f86/sqlalchemy-2.0.44-cp313-cp313-win32.whl", hash = "sha256:ee51625c2d51f8baadf2829fae817ad0b66b140573939dd69284d2ba3553ae73", size = 2101275, upload-time = "2025-10-10T15:03:26.096Z" }, - { url = "https://files.pythonhosted.org/packages/03/51/665617fe4f8c6450f42a6d8d69243f9420f5677395572c2fe9d21b493b7b/sqlalchemy-2.0.44-cp313-cp313-win_amd64.whl", hash = "sha256:c1c80faaee1a6c3428cecf40d16a2365bcf56c424c92c2b6f0f9ad204b899e9e", size = 2127901, upload-time = "2025-10-10T15:03:27.548Z" }, - { url = "https://files.pythonhosted.org/packages/9c/5e/6a29fa884d9fb7ddadf6b69490a9d45fded3b38541713010dad16b77d015/sqlalchemy-2.0.44-py3-none-any.whl", hash = "sha256:19de7ca1246fbef9f9d1bff8f1ab25641569df226364a0e40457dc5457c54b05", size = 1928718, upload-time = "2025-10-10T15:29:45.32Z" }, -] - [[package]] name = "sse-starlette" version = "3.0.3" @@ -4049,15 +3368,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ce/fd/901cfa59aaa5b30a99e16876f11abe38b59a1a2c51ffb3d7142bb6089069/starlette-0.47.3-py3-none-any.whl", hash = "sha256:89c0778ca62a76b826101e7c709e70680a1699ca7da6b44d38eb0a7e61fe4b51", size = 72991, upload-time = "2025-08-24T13:36:40.887Z" }, ] -[[package]] -name = "tenacity" -version = "9.1.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036, upload-time = "2025-04-02T08:25:09.966Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248, upload-time = "2025-04-02T08:25:07.678Z" }, -] - [[package]] name = "tomli" version = "2.3.0" @@ -4180,142 +3490,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d2/e2/dc81b1bd1dcfe91735810265e9d26bc8ec5da45b4c0f6237e286819194c3/uvicorn-0.35.0-py3-none-any.whl", hash = "sha256:197535216b25ff9b785e29a0b79199f55222193d47f820816e7da751e9bc8d4a", size = 66406, upload-time = "2025-06-28T16:15:44.816Z" }, ] -[package.optional-dependencies] -standard = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "httptools" }, - { name = "python-dotenv" }, - { name = "pyyaml" }, - { name = "uvloop", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'" }, - { name = "watchfiles" }, - { name = "websockets" }, -] - -[[package]] -name = "uvloop" -version = "0.22.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/06/f0/18d39dbd1971d6d62c4629cc7fa67f74821b0dc1f5a77af43719de7936a7/uvloop-0.22.1.tar.gz", hash = "sha256:6c84bae345b9147082b17371e3dd5d42775bddce91f885499017f4607fdaf39f", size = 2443250, upload-time = "2025-10-16T22:17:19.342Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/d5/69900f7883235562f1f50d8184bb7dd84a2fb61e9ec63f3782546fdbd057/uvloop-0.22.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c60ebcd36f7b240b30788554b6f0782454826a0ed765d8430652621b5de674b9", size = 1352420, upload-time = "2025-10-16T22:16:21.187Z" }, - { url = "https://files.pythonhosted.org/packages/a8/73/c4e271b3bce59724e291465cc936c37758886a4868787da0278b3b56b905/uvloop-0.22.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b7f102bf3cb1995cfeaee9321105e8f5da76fdb104cdad8986f85461a1b7b77", size = 748677, upload-time = "2025-10-16T22:16:22.558Z" }, - { url = "https://files.pythonhosted.org/packages/86/94/9fb7fad2f824d25f8ecac0d70b94d0d48107ad5ece03769a9c543444f78a/uvloop-0.22.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53c85520781d84a4b8b230e24a5af5b0778efdb39142b424990ff1ef7c48ba21", size = 3753819, upload-time = "2025-10-16T22:16:23.903Z" }, - { url = "https://files.pythonhosted.org/packages/74/4f/256aca690709e9b008b7108bc85fba619a2bc37c6d80743d18abad16ee09/uvloop-0.22.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:56a2d1fae65fd82197cb8c53c367310b3eabe1bbb9fb5a04d28e3e3520e4f702", size = 3804529, upload-time = "2025-10-16T22:16:25.246Z" }, - { url = "https://files.pythonhosted.org/packages/7f/74/03c05ae4737e871923d21a76fe28b6aad57f5c03b6e6bfcfa5ad616013e4/uvloop-0.22.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40631b049d5972c6755b06d0bfe8233b1bd9a8a6392d9d1c45c10b6f9e9b2733", size = 3621267, upload-time = "2025-10-16T22:16:26.819Z" }, - { url = "https://files.pythonhosted.org/packages/75/be/f8e590fe61d18b4a92070905497aec4c0e64ae1761498cad09023f3f4b3e/uvloop-0.22.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:535cc37b3a04f6cd2c1ef65fa1d370c9a35b6695df735fcff5427323f2cd5473", size = 3723105, upload-time = "2025-10-16T22:16:28.252Z" }, - { url = "https://files.pythonhosted.org/packages/3d/ff/7f72e8170be527b4977b033239a83a68d5c881cc4775fca255c677f7ac5d/uvloop-0.22.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fe94b4564e865d968414598eea1a6de60adba0c040ba4ed05ac1300de402cd42", size = 1359936, upload-time = "2025-10-16T22:16:29.436Z" }, - { url = "https://files.pythonhosted.org/packages/c3/c6/e5d433f88fd54d81ef4be58b2b7b0cea13c442454a1db703a1eea0db1a59/uvloop-0.22.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:51eb9bd88391483410daad430813d982010f9c9c89512321f5b60e2cddbdddd6", size = 752769, upload-time = "2025-10-16T22:16:30.493Z" }, - { url = "https://files.pythonhosted.org/packages/24/68/a6ac446820273e71aa762fa21cdcc09861edd3536ff47c5cd3b7afb10eeb/uvloop-0.22.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:700e674a166ca5778255e0e1dc4e9d79ab2acc57b9171b79e65feba7184b3370", size = 4317413, upload-time = "2025-10-16T22:16:31.644Z" }, - { url = "https://files.pythonhosted.org/packages/5f/6f/e62b4dfc7ad6518e7eff2516f680d02a0f6eb62c0c212e152ca708a0085e/uvloop-0.22.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b5b1ac819a3f946d3b2ee07f09149578ae76066d70b44df3fa990add49a82e4", size = 4426307, upload-time = "2025-10-16T22:16:32.917Z" }, - { url = "https://files.pythonhosted.org/packages/90/60/97362554ac21e20e81bcef1150cb2a7e4ffdaf8ea1e5b2e8bf7a053caa18/uvloop-0.22.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e047cc068570bac9866237739607d1313b9253c3051ad84738cbb095be0537b2", size = 4131970, upload-time = "2025-10-16T22:16:34.015Z" }, - { url = "https://files.pythonhosted.org/packages/99/39/6b3f7d234ba3964c428a6e40006340f53ba37993f46ed6e111c6e9141d18/uvloop-0.22.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:512fec6815e2dd45161054592441ef76c830eddaad55c8aa30952e6fe1ed07c0", size = 4296343, upload-time = "2025-10-16T22:16:35.149Z" }, - { url = "https://files.pythonhosted.org/packages/89/8c/182a2a593195bfd39842ea68ebc084e20c850806117213f5a299dfc513d9/uvloop-0.22.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:561577354eb94200d75aca23fbde86ee11be36b00e52a4eaf8f50fb0c86b7705", size = 1358611, upload-time = "2025-10-16T22:16:36.833Z" }, - { url = "https://files.pythonhosted.org/packages/d2/14/e301ee96a6dc95224b6f1162cd3312f6d1217be3907b79173b06785f2fe7/uvloop-0.22.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cdf5192ab3e674ca26da2eada35b288d2fa49fdd0f357a19f0e7c4e7d5077c8", size = 751811, upload-time = "2025-10-16T22:16:38.275Z" }, - { url = "https://files.pythonhosted.org/packages/b7/02/654426ce265ac19e2980bfd9ea6590ca96a56f10c76e63801a2df01c0486/uvloop-0.22.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e2ea3d6190a2968f4a14a23019d3b16870dd2190cd69c8180f7c632d21de68d", size = 4288562, upload-time = "2025-10-16T22:16:39.375Z" }, - { url = "https://files.pythonhosted.org/packages/15/c0/0be24758891ef825f2065cd5db8741aaddabe3e248ee6acc5e8a80f04005/uvloop-0.22.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0530a5fbad9c9e4ee3f2b33b148c6a64d47bbad8000ea63704fa8260f4cf728e", size = 4366890, upload-time = "2025-10-16T22:16:40.547Z" }, - { url = "https://files.pythonhosted.org/packages/d2/53/8369e5219a5855869bcee5f4d317f6da0e2c669aecf0ef7d371e3d084449/uvloop-0.22.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bc5ef13bbc10b5335792360623cc378d52d7e62c2de64660616478c32cd0598e", size = 4119472, upload-time = "2025-10-16T22:16:41.694Z" }, - { url = "https://files.pythonhosted.org/packages/f8/ba/d69adbe699b768f6b29a5eec7b47dd610bd17a69de51b251126a801369ea/uvloop-0.22.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1f38ec5e3f18c8a10ded09742f7fb8de0108796eb673f30ce7762ce1b8550cad", size = 4239051, upload-time = "2025-10-16T22:16:43.224Z" }, - { url = "https://files.pythonhosted.org/packages/90/cd/b62bdeaa429758aee8de8b00ac0dd26593a9de93d302bff3d21439e9791d/uvloop-0.22.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3879b88423ec7e97cd4eba2a443aa26ed4e59b45e6b76aabf13fe2f27023a142", size = 1362067, upload-time = "2025-10-16T22:16:44.503Z" }, - { url = "https://files.pythonhosted.org/packages/0d/f8/a132124dfda0777e489ca86732e85e69afcd1ff7686647000050ba670689/uvloop-0.22.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4baa86acedf1d62115c1dc6ad1e17134476688f08c6efd8a2ab076e815665c74", size = 752423, upload-time = "2025-10-16T22:16:45.968Z" }, - { url = "https://files.pythonhosted.org/packages/a3/94/94af78c156f88da4b3a733773ad5ba0b164393e357cc4bd0ab2e2677a7d6/uvloop-0.22.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:297c27d8003520596236bdb2335e6b3f649480bd09e00d1e3a99144b691d2a35", size = 4272437, upload-time = "2025-10-16T22:16:47.451Z" }, - { url = "https://files.pythonhosted.org/packages/b5/35/60249e9fd07b32c665192cec7af29e06c7cd96fa1d08b84f012a56a0b38e/uvloop-0.22.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c1955d5a1dd43198244d47664a5858082a3239766a839b2102a269aaff7a4e25", size = 4292101, upload-time = "2025-10-16T22:16:49.318Z" }, - { url = "https://files.pythonhosted.org/packages/02/62/67d382dfcb25d0a98ce73c11ed1a6fba5037a1a1d533dcbb7cab033a2636/uvloop-0.22.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b31dc2fccbd42adc73bc4e7cdbae4fc5086cf378979e53ca5d0301838c5682c6", size = 4114158, upload-time = "2025-10-16T22:16:50.517Z" }, - { url = "https://files.pythonhosted.org/packages/f0/7a/f1171b4a882a5d13c8b7576f348acfe6074d72eaf52cccef752f748d4a9f/uvloop-0.22.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:93f617675b2d03af4e72a5333ef89450dfaa5321303ede6e67ba9c9d26878079", size = 4177360, upload-time = "2025-10-16T22:16:52.646Z" }, - { url = "https://files.pythonhosted.org/packages/79/7b/b01414f31546caf0919da80ad57cbfe24c56b151d12af68cee1b04922ca8/uvloop-0.22.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:37554f70528f60cad66945b885eb01f1bb514f132d92b6eeed1c90fd54ed6289", size = 1454790, upload-time = "2025-10-16T22:16:54.355Z" }, - { url = "https://files.pythonhosted.org/packages/d4/31/0bb232318dd838cad3fa8fb0c68c8b40e1145b32025581975e18b11fab40/uvloop-0.22.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b76324e2dc033a0b2f435f33eb88ff9913c156ef78e153fb210e03c13da746b3", size = 796783, upload-time = "2025-10-16T22:16:55.906Z" }, - { url = "https://files.pythonhosted.org/packages/42/38/c9b09f3271a7a723a5de69f8e237ab8e7803183131bc57c890db0b6bb872/uvloop-0.22.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:badb4d8e58ee08dad957002027830d5c3b06aea446a6a3744483c2b3b745345c", size = 4647548, upload-time = "2025-10-16T22:16:57.008Z" }, - { url = "https://files.pythonhosted.org/packages/c1/37/945b4ca0ac27e3dc4952642d4c900edd030b3da6c9634875af6e13ae80e5/uvloop-0.22.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b91328c72635f6f9e0282e4a57da7470c7350ab1c9f48546c0f2866205349d21", size = 4467065, upload-time = "2025-10-16T22:16:58.206Z" }, - { url = "https://files.pythonhosted.org/packages/97/cc/48d232f33d60e2e2e0b42f4e73455b146b76ebe216487e862700457fbf3c/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:daf620c2995d193449393d6c62131b3fbd40a63bf7b307a1527856ace637fe88", size = 4328384, upload-time = "2025-10-16T22:16:59.36Z" }, - { url = "https://files.pythonhosted.org/packages/e4/16/c1fd27e9549f3c4baf1dc9c20c456cd2f822dbf8de9f463824b0c0357e06/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6cde23eeda1a25c75b2e07d39970f3374105d5eafbaab2a4482be82f272d5a5e", size = 4296730, upload-time = "2025-10-16T22:17:00.744Z" }, -] - -[[package]] -name = "watchfiles" -version = "1.1.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c2/c9/8869df9b2a2d6c59d79220a4db37679e74f807c559ffe5265e08b227a210/watchfiles-1.1.1.tar.gz", hash = "sha256:a173cb5c16c4f40ab19cecf48a534c409f7ea983ab8fed0741304a1c0a31b3f2", size = 94440, upload-time = "2025-10-14T15:06:21.08Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1f/f8/2c5f479fb531ce2f0564eda479faecf253d886b1ab3630a39b7bf7362d46/watchfiles-1.1.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f57b396167a2565a4e8b5e56a5a1c537571733992b226f4f1197d79e94cf0ae5", size = 406529, upload-time = "2025-10-14T15:04:32.899Z" }, - { url = "https://files.pythonhosted.org/packages/fe/cd/f515660b1f32f65df671ddf6f85bfaca621aee177712874dc30a97397977/watchfiles-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:421e29339983e1bebc281fab40d812742268ad057db4aee8c4d2bce0af43b741", size = 394384, upload-time = "2025-10-14T15:04:33.761Z" }, - { url = "https://files.pythonhosted.org/packages/7b/c3/28b7dc99733eab43fca2d10f55c86e03bd6ab11ca31b802abac26b23d161/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e43d39a741e972bab5d8100b5cdacf69db64e34eb19b6e9af162bccf63c5cc6", size = 448789, upload-time = "2025-10-14T15:04:34.679Z" }, - { url = "https://files.pythonhosted.org/packages/4a/24/33e71113b320030011c8e4316ccca04194bf0cbbaeee207f00cbc7d6b9f5/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f537afb3276d12814082a2e9b242bdcf416c2e8fd9f799a737990a1dbe906e5b", size = 460521, upload-time = "2025-10-14T15:04:35.963Z" }, - { url = "https://files.pythonhosted.org/packages/f4/c3/3c9a55f255aa57b91579ae9e98c88704955fa9dac3e5614fb378291155df/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2cd9e04277e756a2e2d2543d65d1e2166d6fd4c9b183f8808634fda23f17b14", size = 488722, upload-time = "2025-10-14T15:04:37.091Z" }, - { url = "https://files.pythonhosted.org/packages/49/36/506447b73eb46c120169dc1717fe2eff07c234bb3232a7200b5f5bd816e9/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f3f58818dc0b07f7d9aa7fe9eb1037aecb9700e63e1f6acfed13e9fef648f5d", size = 596088, upload-time = "2025-10-14T15:04:38.39Z" }, - { url = "https://files.pythonhosted.org/packages/82/ab/5f39e752a9838ec4d52e9b87c1e80f1ee3ccdbe92e183c15b6577ab9de16/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bb9f66367023ae783551042d31b1d7fd422e8289eedd91f26754a66f44d5cff", size = 472923, upload-time = "2025-10-14T15:04:39.666Z" }, - { url = "https://files.pythonhosted.org/packages/af/b9/a419292f05e302dea372fa7e6fda5178a92998411f8581b9830d28fb9edb/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aebfd0861a83e6c3d1110b78ad54704486555246e542be3e2bb94195eabb2606", size = 456080, upload-time = "2025-10-14T15:04:40.643Z" }, - { url = "https://files.pythonhosted.org/packages/b0/c3/d5932fd62bde1a30c36e10c409dc5d54506726f08cb3e1d8d0ba5e2bc8db/watchfiles-1.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5fac835b4ab3c6487b5dbad78c4b3724e26bcc468e886f8ba8cc4306f68f6701", size = 629432, upload-time = "2025-10-14T15:04:41.789Z" }, - { url = "https://files.pythonhosted.org/packages/f7/77/16bddd9779fafb795f1a94319dc965209c5641db5bf1edbbccace6d1b3c0/watchfiles-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:399600947b170270e80134ac854e21b3ccdefa11a9529a3decc1327088180f10", size = 623046, upload-time = "2025-10-14T15:04:42.718Z" }, - { url = "https://files.pythonhosted.org/packages/46/ef/f2ecb9a0f342b4bfad13a2787155c6ee7ce792140eac63a34676a2feeef2/watchfiles-1.1.1-cp311-cp311-win32.whl", hash = "sha256:de6da501c883f58ad50db3a32ad397b09ad29865b5f26f64c24d3e3281685849", size = 271473, upload-time = "2025-10-14T15:04:43.624Z" }, - { url = "https://files.pythonhosted.org/packages/94/bc/f42d71125f19731ea435c3948cad148d31a64fccde3867e5ba4edee901f9/watchfiles-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:35c53bd62a0b885bf653ebf6b700d1bf05debb78ad9292cf2a942b23513dc4c4", size = 287598, upload-time = "2025-10-14T15:04:44.516Z" }, - { url = "https://files.pythonhosted.org/packages/57/c9/a30f897351f95bbbfb6abcadafbaca711ce1162f4db95fc908c98a9165f3/watchfiles-1.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:57ca5281a8b5e27593cb7d82c2ac927ad88a96ed406aa446f6344e4328208e9e", size = 277210, upload-time = "2025-10-14T15:04:45.883Z" }, - { url = "https://files.pythonhosted.org/packages/74/d5/f039e7e3c639d9b1d09b07ea412a6806d38123f0508e5f9b48a87b0a76cc/watchfiles-1.1.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:8c89f9f2f740a6b7dcc753140dd5e1ab9215966f7a3530d0c0705c83b401bd7d", size = 404745, upload-time = "2025-10-14T15:04:46.731Z" }, - { url = "https://files.pythonhosted.org/packages/a5/96/a881a13aa1349827490dab2d363c8039527060cfcc2c92cc6d13d1b1049e/watchfiles-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd404be08018c37350f0d6e34676bd1e2889990117a2b90070b3007f172d0610", size = 391769, upload-time = "2025-10-14T15:04:48.003Z" }, - { url = "https://files.pythonhosted.org/packages/4b/5b/d3b460364aeb8da471c1989238ea0e56bec24b6042a68046adf3d9ddb01c/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8526e8f916bb5b9a0a777c8317c23ce65de259422bba5b31325a6fa6029d33af", size = 449374, upload-time = "2025-10-14T15:04:49.179Z" }, - { url = "https://files.pythonhosted.org/packages/b9/44/5769cb62d4ed055cb17417c0a109a92f007114a4e07f30812a73a4efdb11/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2edc3553362b1c38d9f06242416a5d8e9fe235c204a4072e988ce2e5bb1f69f6", size = 459485, upload-time = "2025-10-14T15:04:50.155Z" }, - { url = "https://files.pythonhosted.org/packages/19/0c/286b6301ded2eccd4ffd0041a1b726afda999926cf720aab63adb68a1e36/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30f7da3fb3f2844259cba4720c3fc7138eb0f7b659c38f3bfa65084c7fc7abce", size = 488813, upload-time = "2025-10-14T15:04:51.059Z" }, - { url = "https://files.pythonhosted.org/packages/c7/2b/8530ed41112dd4a22f4dcfdb5ccf6a1baad1ff6eed8dc5a5f09e7e8c41c7/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8979280bdafff686ba5e4d8f97840f929a87ed9cdf133cbbd42f7766774d2aa", size = 594816, upload-time = "2025-10-14T15:04:52.031Z" }, - { url = "https://files.pythonhosted.org/packages/ce/d2/f5f9fb49489f184f18470d4f99f4e862a4b3e9ac2865688eb2099e3d837a/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcc5c24523771db3a294c77d94771abcfcb82a0e0ee8efd910c37c59ec1b31bb", size = 475186, upload-time = "2025-10-14T15:04:53.064Z" }, - { url = "https://files.pythonhosted.org/packages/cf/68/5707da262a119fb06fbe214d82dd1fe4a6f4af32d2d14de368d0349eb52a/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db5d7ae38ff20153d542460752ff397fcf5c96090c1230803713cf3147a6803", size = 456812, upload-time = "2025-10-14T15:04:55.174Z" }, - { url = "https://files.pythonhosted.org/packages/66/ab/3cbb8756323e8f9b6f9acb9ef4ec26d42b2109bce830cc1f3468df20511d/watchfiles-1.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:28475ddbde92df1874b6c5c8aaeb24ad5be47a11f87cde5a28ef3835932e3e94", size = 630196, upload-time = "2025-10-14T15:04:56.22Z" }, - { url = "https://files.pythonhosted.org/packages/78/46/7152ec29b8335f80167928944a94955015a345440f524d2dfe63fc2f437b/watchfiles-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:36193ed342f5b9842edd3532729a2ad55c4160ffcfa3700e0d54be496b70dd43", size = 622657, upload-time = "2025-10-14T15:04:57.521Z" }, - { url = "https://files.pythonhosted.org/packages/0a/bf/95895e78dd75efe9a7f31733607f384b42eb5feb54bd2eb6ed57cc2e94f4/watchfiles-1.1.1-cp312-cp312-win32.whl", hash = "sha256:859e43a1951717cc8de7f4c77674a6d389b106361585951d9e69572823f311d9", size = 272042, upload-time = "2025-10-14T15:04:59.046Z" }, - { url = "https://files.pythonhosted.org/packages/87/0a/90eb755f568de2688cb220171c4191df932232c20946966c27a59c400850/watchfiles-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:91d4c9a823a8c987cce8fa2690923b069966dabb196dd8d137ea2cede885fde9", size = 288410, upload-time = "2025-10-14T15:05:00.081Z" }, - { url = "https://files.pythonhosted.org/packages/36/76/f322701530586922fbd6723c4f91ace21364924822a8772c549483abed13/watchfiles-1.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:a625815d4a2bdca61953dbba5a39d60164451ef34c88d751f6c368c3ea73d404", size = 278209, upload-time = "2025-10-14T15:05:01.168Z" }, - { url = "https://files.pythonhosted.org/packages/bb/f4/f750b29225fe77139f7ae5de89d4949f5a99f934c65a1f1c0b248f26f747/watchfiles-1.1.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:130e4876309e8686a5e37dba7d5e9bc77e6ed908266996ca26572437a5271e18", size = 404321, upload-time = "2025-10-14T15:05:02.063Z" }, - { url = "https://files.pythonhosted.org/packages/2b/f9/f07a295cde762644aa4c4bb0f88921d2d141af45e735b965fb2e87858328/watchfiles-1.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5f3bde70f157f84ece3765b42b4a52c6ac1a50334903c6eaf765362f6ccca88a", size = 391783, upload-time = "2025-10-14T15:05:03.052Z" }, - { url = "https://files.pythonhosted.org/packages/bc/11/fc2502457e0bea39a5c958d86d2cb69e407a4d00b85735ca724bfa6e0d1a/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14e0b1fe858430fc0251737ef3824c54027bedb8c37c38114488b8e131cf8219", size = 449279, upload-time = "2025-10-14T15:05:04.004Z" }, - { url = "https://files.pythonhosted.org/packages/e3/1f/d66bc15ea0b728df3ed96a539c777acfcad0eb78555ad9efcaa1274688f0/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f27db948078f3823a6bb3b465180db8ebecf26dd5dae6f6180bd87383b6b4428", size = 459405, upload-time = "2025-10-14T15:05:04.942Z" }, - { url = "https://files.pythonhosted.org/packages/be/90/9f4a65c0aec3ccf032703e6db02d89a157462fbb2cf20dd415128251cac0/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:059098c3a429f62fc98e8ec62b982230ef2c8df68c79e826e37b895bc359a9c0", size = 488976, upload-time = "2025-10-14T15:05:05.905Z" }, - { url = "https://files.pythonhosted.org/packages/37/57/ee347af605d867f712be7029bb94c8c071732a4b44792e3176fa3c612d39/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfb5862016acc9b869bb57284e6cb35fdf8e22fe59f7548858e2f971d045f150", size = 595506, upload-time = "2025-10-14T15:05:06.906Z" }, - { url = "https://files.pythonhosted.org/packages/a8/78/cc5ab0b86c122047f75e8fc471c67a04dee395daf847d3e59381996c8707/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:319b27255aacd9923b8a276bb14d21a5f7ff82564c744235fc5eae58d95422ae", size = 474936, upload-time = "2025-10-14T15:05:07.906Z" }, - { url = "https://files.pythonhosted.org/packages/62/da/def65b170a3815af7bd40a3e7010bf6ab53089ef1b75d05dd5385b87cf08/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c755367e51db90e75b19454b680903631d41f9e3607fbd941d296a020c2d752d", size = 456147, upload-time = "2025-10-14T15:05:09.138Z" }, - { url = "https://files.pythonhosted.org/packages/57/99/da6573ba71166e82d288d4df0839128004c67d2778d3b566c138695f5c0b/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c22c776292a23bfc7237a98f791b9ad3144b02116ff10d820829ce62dff46d0b", size = 630007, upload-time = "2025-10-14T15:05:10.117Z" }, - { url = "https://files.pythonhosted.org/packages/a8/51/7439c4dd39511368849eb1e53279cd3454b4a4dbace80bab88feeb83c6b5/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:3a476189be23c3686bc2f4321dd501cb329c0a0469e77b7b534ee10129ae6374", size = 622280, upload-time = "2025-10-14T15:05:11.146Z" }, - { url = "https://files.pythonhosted.org/packages/95/9c/8ed97d4bba5db6fdcdb2b298d3898f2dd5c20f6b73aee04eabe56c59677e/watchfiles-1.1.1-cp313-cp313-win32.whl", hash = "sha256:bf0a91bfb5574a2f7fc223cf95eeea79abfefa404bf1ea5e339c0c1560ae99a0", size = 272056, upload-time = "2025-10-14T15:05:12.156Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f3/c14e28429f744a260d8ceae18bf58c1d5fa56b50d006a7a9f80e1882cb0d/watchfiles-1.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:52e06553899e11e8074503c8e716d574adeeb7e68913115c4b3653c53f9bae42", size = 288162, upload-time = "2025-10-14T15:05:13.208Z" }, - { url = "https://files.pythonhosted.org/packages/dc/61/fe0e56c40d5cd29523e398d31153218718c5786b5e636d9ae8ae79453d27/watchfiles-1.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:ac3cc5759570cd02662b15fbcd9d917f7ecd47efe0d6b40474eafd246f91ea18", size = 277909, upload-time = "2025-10-14T15:05:14.49Z" }, - { url = "https://files.pythonhosted.org/packages/79/42/e0a7d749626f1e28c7108a99fb9bf524b501bbbeb9b261ceecde644d5a07/watchfiles-1.1.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:563b116874a9a7ce6f96f87cd0b94f7faf92d08d0021e837796f0a14318ef8da", size = 403389, upload-time = "2025-10-14T15:05:15.777Z" }, - { url = "https://files.pythonhosted.org/packages/15/49/08732f90ce0fbbc13913f9f215c689cfc9ced345fb1bcd8829a50007cc8d/watchfiles-1.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3ad9fe1dae4ab4212d8c91e80b832425e24f421703b5a42ef2e4a1e215aff051", size = 389964, upload-time = "2025-10-14T15:05:16.85Z" }, - { url = "https://files.pythonhosted.org/packages/27/0d/7c315d4bd5f2538910491a0393c56bf70d333d51bc5b34bee8e68e8cea19/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce70f96a46b894b36eba678f153f052967a0d06d5b5a19b336ab0dbbd029f73e", size = 448114, upload-time = "2025-10-14T15:05:17.876Z" }, - { url = "https://files.pythonhosted.org/packages/c3/24/9e096de47a4d11bc4df41e9d1e61776393eac4cb6eb11b3e23315b78b2cc/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cb467c999c2eff23a6417e58d75e5828716f42ed8289fe6b77a7e5a91036ca70", size = 460264, upload-time = "2025-10-14T15:05:18.962Z" }, - { url = "https://files.pythonhosted.org/packages/cc/0f/e8dea6375f1d3ba5fcb0b3583e2b493e77379834c74fd5a22d66d85d6540/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:836398932192dae4146c8f6f737d74baeac8b70ce14831a239bdb1ca882fc261", size = 487877, upload-time = "2025-10-14T15:05:20.094Z" }, - { url = "https://files.pythonhosted.org/packages/ac/5b/df24cfc6424a12deb41503b64d42fbea6b8cb357ec62ca84a5a3476f654a/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:743185e7372b7bc7c389e1badcc606931a827112fbbd37f14c537320fca08620", size = 595176, upload-time = "2025-10-14T15:05:21.134Z" }, - { url = "https://files.pythonhosted.org/packages/8f/b5/853b6757f7347de4e9b37e8cc3289283fb983cba1ab4d2d7144694871d9c/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:afaeff7696e0ad9f02cbb8f56365ff4686ab205fcf9c4c5b6fdfaaa16549dd04", size = 473577, upload-time = "2025-10-14T15:05:22.306Z" }, - { url = "https://files.pythonhosted.org/packages/e1/f7/0a4467be0a56e80447c8529c9fce5b38eab4f513cb3d9bf82e7392a5696b/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7eb7da0eb23aa2ba036d4f616d46906013a68caf61b7fdbe42fc8b25132e77", size = 455425, upload-time = "2025-10-14T15:05:23.348Z" }, - { url = "https://files.pythonhosted.org/packages/8e/e0/82583485ea00137ddf69bc84a2db88bd92ab4a6e3c405e5fb878ead8d0e7/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:831a62658609f0e5c64178211c942ace999517f5770fe9436be4c2faeba0c0ef", size = 628826, upload-time = "2025-10-14T15:05:24.398Z" }, - { url = "https://files.pythonhosted.org/packages/28/9a/a785356fccf9fae84c0cc90570f11702ae9571036fb25932f1242c82191c/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:f9a2ae5c91cecc9edd47e041a930490c31c3afb1f5e6d71de3dc671bfaca02bf", size = 622208, upload-time = "2025-10-14T15:05:25.45Z" }, - { url = "https://files.pythonhosted.org/packages/c3/f4/0872229324ef69b2c3edec35e84bd57a1289e7d3fe74588048ed8947a323/watchfiles-1.1.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:d1715143123baeeaeadec0528bb7441103979a1d5f6fd0e1f915383fea7ea6d5", size = 404315, upload-time = "2025-10-14T15:05:26.501Z" }, - { url = "https://files.pythonhosted.org/packages/7b/22/16d5331eaed1cb107b873f6ae1b69e9ced582fcf0c59a50cd84f403b1c32/watchfiles-1.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:39574d6370c4579d7f5d0ad940ce5b20db0e4117444e39b6d8f99db5676c52fd", size = 390869, upload-time = "2025-10-14T15:05:27.649Z" }, - { url = "https://files.pythonhosted.org/packages/b2/7e/5643bfff5acb6539b18483128fdc0ef2cccc94a5b8fbda130c823e8ed636/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7365b92c2e69ee952902e8f70f3ba6360d0d596d9299d55d7d386df84b6941fb", size = 449919, upload-time = "2025-10-14T15:05:28.701Z" }, - { url = "https://files.pythonhosted.org/packages/51/2e/c410993ba5025a9f9357c376f48976ef0e1b1aefb73b97a5ae01a5972755/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bfff9740c69c0e4ed32416f013f3c45e2ae42ccedd1167ef2d805c000b6c71a5", size = 460845, upload-time = "2025-10-14T15:05:30.064Z" }, - { url = "https://files.pythonhosted.org/packages/8e/a4/2df3b404469122e8680f0fcd06079317e48db58a2da2950fb45020947734/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b27cf2eb1dda37b2089e3907d8ea92922b673c0c427886d4edc6b94d8dfe5db3", size = 489027, upload-time = "2025-10-14T15:05:31.064Z" }, - { url = "https://files.pythonhosted.org/packages/ea/84/4587ba5b1f267167ee715b7f66e6382cca6938e0a4b870adad93e44747e6/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:526e86aced14a65a5b0ec50827c745597c782ff46b571dbfe46192ab9e0b3c33", size = 595615, upload-time = "2025-10-14T15:05:32.074Z" }, - { url = "https://files.pythonhosted.org/packages/6a/0f/c6988c91d06e93cd0bb3d4a808bcf32375ca1904609835c3031799e3ecae/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04e78dd0b6352db95507fd8cb46f39d185cf8c74e4cf1e4fbad1d3df96faf510", size = 474836, upload-time = "2025-10-14T15:05:33.209Z" }, - { url = "https://files.pythonhosted.org/packages/b4/36/ded8aebea91919485b7bbabbd14f5f359326cb5ec218cd67074d1e426d74/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c85794a4cfa094714fb9c08d4a218375b2b95b8ed1666e8677c349906246c05", size = 455099, upload-time = "2025-10-14T15:05:34.189Z" }, - { url = "https://files.pythonhosted.org/packages/98/e0/8c9bdba88af756a2fce230dd365fab2baf927ba42cd47521ee7498fd5211/watchfiles-1.1.1-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:74d5012b7630714b66be7b7b7a78855ef7ad58e8650c73afc4c076a1f480a8d6", size = 630626, upload-time = "2025-10-14T15:05:35.216Z" }, - { url = "https://files.pythonhosted.org/packages/2a/84/a95db05354bf2d19e438520d92a8ca475e578c647f78f53197f5a2f17aaf/watchfiles-1.1.1-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:8fbe85cb3201c7d380d3d0b90e63d520f15d6afe217165d7f98c9c649654db81", size = 622519, upload-time = "2025-10-14T15:05:36.259Z" }, - { url = "https://files.pythonhosted.org/packages/1d/ce/d8acdc8de545de995c339be67711e474c77d643555a9bb74a9334252bd55/watchfiles-1.1.1-cp314-cp314-win32.whl", hash = "sha256:3fa0b59c92278b5a7800d3ee7733da9d096d4aabcfabb9a928918bd276ef9b9b", size = 272078, upload-time = "2025-10-14T15:05:37.63Z" }, - { url = "https://files.pythonhosted.org/packages/c4/c9/a74487f72d0451524be827e8edec251da0cc1fcf111646a511ae752e1a3d/watchfiles-1.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:c2047d0b6cea13b3316bdbafbfa0c4228ae593d995030fda39089d36e64fc03a", size = 287664, upload-time = "2025-10-14T15:05:38.95Z" }, - { url = "https://files.pythonhosted.org/packages/df/b8/8ac000702cdd496cdce998c6f4ee0ca1f15977bba51bdf07d872ebdfc34c/watchfiles-1.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:842178b126593addc05acf6fce960d28bc5fae7afbaa2c6c1b3a7b9460e5be02", size = 277154, upload-time = "2025-10-14T15:05:39.954Z" }, - { url = "https://files.pythonhosted.org/packages/47/a8/e3af2184707c29f0f14b1963c0aace6529f9d1b8582d5b99f31bbf42f59e/watchfiles-1.1.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:88863fbbc1a7312972f1c511f202eb30866370ebb8493aef2812b9ff28156a21", size = 403820, upload-time = "2025-10-14T15:05:40.932Z" }, - { url = "https://files.pythonhosted.org/packages/c0/ec/e47e307c2f4bd75f9f9e8afbe3876679b18e1bcec449beca132a1c5ffb2d/watchfiles-1.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:55c7475190662e202c08c6c0f4d9e345a29367438cf8e8037f3155e10a88d5a5", size = 390510, upload-time = "2025-10-14T15:05:41.945Z" }, - { url = "https://files.pythonhosted.org/packages/d5/a0/ad235642118090f66e7b2f18fd5c42082418404a79205cdfca50b6309c13/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f53fa183d53a1d7a8852277c92b967ae99c2d4dcee2bfacff8868e6e30b15f7", size = 448408, upload-time = "2025-10-14T15:05:43.385Z" }, - { url = "https://files.pythonhosted.org/packages/df/85/97fa10fd5ff3332ae17e7e40e20784e419e28521549780869f1413742e9d/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6aae418a8b323732fa89721d86f39ec8f092fc2af67f4217a2b07fd3e93c6101", size = 458968, upload-time = "2025-10-14T15:05:44.404Z" }, - { url = "https://files.pythonhosted.org/packages/47/c2/9059c2e8966ea5ce678166617a7f75ecba6164375f3b288e50a40dc6d489/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f096076119da54a6080e8920cbdaac3dbee667eb91dcc5e5b78840b87415bd44", size = 488096, upload-time = "2025-10-14T15:05:45.398Z" }, - { url = "https://files.pythonhosted.org/packages/94/44/d90a9ec8ac309bc26db808a13e7bfc0e4e78b6fc051078a554e132e80160/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00485f441d183717038ed2e887a7c868154f216877653121068107b227a2f64c", size = 596040, upload-time = "2025-10-14T15:05:46.502Z" }, - { url = "https://files.pythonhosted.org/packages/95/68/4e3479b20ca305cfc561db3ed207a8a1c745ee32bf24f2026a129d0ddb6e/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a55f3e9e493158d7bfdb60a1165035f1cf7d320914e7b7ea83fe22c6023b58fc", size = 473847, upload-time = "2025-10-14T15:05:47.484Z" }, - { url = "https://files.pythonhosted.org/packages/4f/55/2af26693fd15165c4ff7857e38330e1b61ab8c37d15dc79118cdba115b7a/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c91ed27800188c2ae96d16e3149f199d62f86c7af5f5f4d2c61a3ed8cd3666c", size = 455072, upload-time = "2025-10-14T15:05:48.928Z" }, - { url = "https://files.pythonhosted.org/packages/66/1d/d0d200b10c9311ec25d2273f8aad8c3ef7cc7ea11808022501811208a750/watchfiles-1.1.1-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:311ff15a0bae3714ffb603e6ba6dbfba4065ab60865d15a6ec544133bdb21099", size = 629104, upload-time = "2025-10-14T15:05:49.908Z" }, - { url = "https://files.pythonhosted.org/packages/e3/bd/fa9bb053192491b3867ba07d2343d9f2252e00811567d30ae8d0f78136fe/watchfiles-1.1.1-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:a916a2932da8f8ab582f242c065f5c81bed3462849ca79ee357dd9551b0e9b01", size = 622112, upload-time = "2025-10-14T15:05:50.941Z" }, - { url = "https://files.pythonhosted.org/packages/d3/8e/e500f8b0b77be4ff753ac94dc06b33d8f0d839377fee1b78e8c8d8f031bf/watchfiles-1.1.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:db476ab59b6765134de1d4fe96a1a9c96ddf091683599be0f26147ea1b2e4b88", size = 408250, upload-time = "2025-10-14T15:06:10.264Z" }, - { url = "https://files.pythonhosted.org/packages/bd/95/615e72cd27b85b61eec764a5ca51bd94d40b5adea5ff47567d9ebc4d275a/watchfiles-1.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:89eef07eee5e9d1fda06e38822ad167a044153457e6fd997f8a858ab7564a336", size = 396117, upload-time = "2025-10-14T15:06:11.28Z" }, - { url = "https://files.pythonhosted.org/packages/c9/81/e7fe958ce8a7fb5c73cc9fb07f5aeaf755e6aa72498c57d760af760c91f8/watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce19e06cbda693e9e7686358af9cd6f5d61312ab8b00488bc36f5aabbaf77e24", size = 450493, upload-time = "2025-10-14T15:06:12.321Z" }, - { url = "https://files.pythonhosted.org/packages/6e/d4/ed38dd3b1767193de971e694aa544356e63353c33a85d948166b5ff58b9e/watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e6f39af2eab0118338902798b5aa6664f46ff66bc0280de76fca67a7f262a49", size = 457546, upload-time = "2025-10-14T15:06:13.372Z" }, -] - [[package]] name = "websockets" version = "15.0.1" diff --git a/src/backend/v4/callbacks/response_handlers.py b/src/backend/v4/callbacks/response_handlers.py index 297c8814b..88c6085f5 100644 --- a/src/backend/v4/callbacks/response_handlers.py +++ b/src/backend/v4/callbacks/response_handlers.py @@ -8,10 +8,7 @@ import re from typing import Any -from agent_framework import ChatMessage -# Removed: from agent_framework._content import FunctionCallContent (does not exist) - -from agent_framework._workflows._magentic import AgentRunResponseUpdate # Streaming update type from workflows +from agent_framework import ChatMessage, AgentRunUpdateEvent from v4.config.settings import connection_config from v4.models.messages import ( @@ -111,26 +108,31 @@ def agent_response_callback( async def streaming_agent_response_callback( agent_id: str, - update: AgentRunResponseUpdate, + update, # AgentRunUpdateEvent.data or similar streaming update object is_final: bool, user_id: str | None = None, ) -> None: """ - Streaming callback for incremental agent output (AgentRunResponseUpdate). + Streaming callback for incremental agent output. """ if not user_id: return try: + # Handle both AgentRunUpdateEvent.data and raw text updates chunk_text = getattr(update, "text", None) - if not chunk_text: - contents = getattr(update, "contents", []) or [] - collected = [] - for item in contents: - txt = getattr(item, "text", None) - if txt: - collected.append(str(txt)) - chunk_text = "".join(collected) if collected else "" + + # If text is None, don't fall back to str(update) as that would show object repr + # Just skip if there's no actual text content + if chunk_text is None: + # Check if update is a ChatMessage + if isinstance(update, ChatMessage): + chunk_text = update.text or "" + elif hasattr(update, "content"): + chunk_text = str(update.content) if update.content else "" + else: + # Skip if no text content available + return cleaned = clean_citations(chunk_text or "") diff --git a/src/backend/v4/magentic_agents/common/lifecycle.py b/src/backend/v4/magentic_agents/common/lifecycle.py index bd9382ff2..88fde549b 100644 --- a/src/backend/v4/magentic_agents/common/lifecycle.py +++ b/src/backend/v4/magentic_agents/common/lifecycle.py @@ -10,8 +10,8 @@ MCPStreamableHTTPTool, ) -# from agent_framework.azure import AzureAIAgentClient -from agent_framework_azure_ai import AzureAIAgentClient +# from agent_framework.azure import AzureAIClient +from agent_framework_azure_ai import AzureAIClient from azure.ai.agents.aio import AgentsClient from azure.identity.aio import DefaultAzureCredential from common.database.database_base import DatabaseBase @@ -51,7 +51,7 @@ def __init__( self._agent: ChatAgent | None = None self.team_service: TeamService | None = team_service self.team_config: TeamConfiguration | None = team_config - self.client: Optional[AzureAIAgentClient] = None + self.client: Optional[AzureAIClient] = None self.project_endpoint = project_endpoint self.creds: Optional[DefaultAzureCredential] = None self.memory_store: Optional[DatabaseBase] = memory_store @@ -105,7 +105,7 @@ async def close(self) -> None: # Attempt to close the underlying agent/client if it exposes close() if self._agent and hasattr(self._agent, "close"): try: - await self._agent.close() # AzureAIAgentClient has async close + await self._agent.close() # AzureAIClient has async close except Exception as exc: # Best-effort close; log failure but continue teardown self.logger.warning( @@ -148,24 +148,22 @@ async def _after_open(self) -> None: """Subclasses must build self._agent here.""" raise NotImplementedError - def get_chat_client(self, chat_client) -> AzureAIAgentClient: - """Return the underlying ChatClientProtocol (AzureAIAgentClient).""" + def get_chat_client(self, chat_client) -> AzureAIClient: + """Return the underlying ChatClientProtocol (AzureAIClient).""" if chat_client: return chat_client if ( self._agent and self._agent.chat_client - and self._agent.chat_client.agent_id is not None ): return self._agent.chat_client # type: ignore - chat_client = AzureAIAgentClient( + chat_client = AzureAIClient( project_endpoint=self.project_endpoint, model_deployment_name=self.model_deployment_name, - async_credential=self.creds, + credential=self.creds, ) self.logger.info( - "Created new AzureAIAgentClient for get chat client", - extra={"agent_id": chat_client.agent_id}, + "Created new AzureAIClient for get chat client", ) return chat_client @@ -219,20 +217,17 @@ async def resolve_agent_id(self, agent_id: str) -> Optional[str]: return None def get_agent_id(self, chat_client) -> str: - """Return the underlying agent ID.""" - if chat_client and chat_client.agent_id is not None: - return chat_client.agent_id - if ( - self._agent - and self._agent.chat_client - and self._agent.chat_client.agent_id is not None - ): - return self._agent.chat_client.agent_id # type: ignore + """Return the underlying agent ID or generate a new one. + + Note: The new AzureAIClient doesn't expose agent_id directly. + We generate a new ID if not available. + """ + # Generate a new agent ID since AzureAIClient doesn't expose agent_id id = generate_assistant_id() self.logger.info("Generated new agent ID: %s", id) return id - async def get_database_team_agent(self) -> Optional[AzureAIAgentClient]: + async def get_database_team_agent(self) -> Optional[AzureAIClient]: """Retrieve existing team agent from database, if any.""" chat_client = None try: @@ -258,24 +253,24 @@ async def get_database_team_agent(self) -> Optional[AzureAIAgentClient]: # Create client with resolved ID, preferring project_client for RAI agents if self.agent_name == "RAIAgent" and self.project_client: - chat_client = AzureAIAgentClient( + chat_client = AzureAIClient( project_client=self.project_client, agent_id=resolved, - async_credential=self.creds, + credential=self.creds, ) self.logger.info( - "RAI.AgentReuseSuccess: Created AzureAIAgentClient via Projects SDK (id=%s)", + "RAI.AgentReuseSuccess: Created AzureAIClient via Projects SDK (id=%s)", resolved, ) else: - chat_client = AzureAIAgentClient( + chat_client = AzureAIClient( project_endpoint=self.project_endpoint, agent_id=resolved, model_deployment_name=self.model_deployment_name, - async_credential=self.creds, + credential=self.creds, ) self.logger.info( - "Created AzureAIAgentClient via endpoint (id=%s)", resolved + "Created AzureAIClient via endpoint (id=%s)", resolved ) except Exception as ex: @@ -339,10 +334,10 @@ async def _prepare_mcp_tool(self) -> None: class AzureAgentBase(MCPEnabledBase): """ - Extends MCPEnabledBase with Azure credential + AzureAIAgentClient contexts. + Extends MCPEnabledBase with Azure credential + AzureAIClient contexts. Subclasses: - create or attach an Azure AI Agent definition - - instantiate an AzureAIAgentClient and assign to self._agent + - instantiate an AzureAIClient and assign to self._agent - optionally register themselves via agent_registry """ diff --git a/src/backend/v4/magentic_agents/foundry_agent.py b/src/backend/v4/magentic_agents/foundry_agent.py index df6221699..614904b6d 100644 --- a/src/backend/v4/magentic_agents/foundry_agent.py +++ b/src/backend/v4/magentic_agents/foundry_agent.py @@ -6,7 +6,7 @@ from agent_framework import (ChatAgent, ChatMessage, HostedCodeInterpreterTool, Role) from agent_framework_azure_ai import \ - AzureAIAgentClient # Provided by agent_framework + AzureAIClient # Provided by agent_framework from azure.ai.projects.models import ConnectionType from common.config.app_config import config from common.database.database_base import DatabaseBase @@ -111,7 +111,7 @@ async def _collect_tools(self) -> List: # ------------------------- # Azure Search helper # ------------------------- - async def _create_azure_search_enabled_client(self, chatClient=None) -> Optional[AzureAIAgentClient]: + async def _create_azure_search_enabled_client(self, chatClient=None) -> Optional[AzureAIClient]: """ Create a server-side Azure AI agent with Azure AI Search raw tool. @@ -123,7 +123,7 @@ async def _create_azure_search_enabled_client(self, chatClient=None) -> Optional Returns: - AzureAIAgentClient | None + AzureAIClient | None """ if chatClient: return chatClient @@ -205,10 +205,10 @@ async def _create_azure_search_enabled_client(self, chatClient=None) -> Optional query_type, ) - chat_client = AzureAIAgentClient( + chat_client = AzureAIClient( project_client=self.project_client, agent_id=azure_agent.id, - async_credential=self.creds, + credential=self.creds, ) return chat_client except Exception as ex: @@ -301,8 +301,8 @@ async def invoke(self, prompt: str): agent_saved = False async for update in self._agent.run_stream(messages): - # Save agent ID only once on first update (agent ID won't change during streaming) - if not agent_saved and self._agent.chat_client.agent_id: + # Save agent ID only once on first update + if not agent_saved: await self.save_database_team_agent() agent_saved = True yield update diff --git a/src/backend/v4/magentic_agents/proxy_agent.py b/src/backend/v4/magentic_agents/proxy_agent.py index a6ba9d3c4..79a84492b 100644 --- a/src/backend/v4/magentic_agents/proxy_agent.py +++ b/src/backend/v4/magentic_agents/proxy_agent.py @@ -16,13 +16,12 @@ from typing import Any, AsyncIterable from agent_framework import ( - AgentRunResponse, - AgentRunResponseUpdate, + AgentResponse, + AgentResponseUpdate, BaseAgent, ChatMessage, Role, - TextContent, - UsageContent, + Content, UsageDetails, AgentThread, ) @@ -88,7 +87,7 @@ async def run( *, thread: AgentThread | None = None, **kwargs: Any, - ) -> AgentRunResponse: + ) -> AgentResponse: """ Get complete clarification response (non-streaming). @@ -98,7 +97,7 @@ async def run( kwargs: Additional keyword arguments Returns: - AgentRunResponse with the clarification + AgentResponse with the clarification """ # Collect all streaming updates response_messages: list[ChatMessage] = [] @@ -113,7 +112,7 @@ async def run( ) ) - return AgentRunResponse( + return AgentResponse( messages=response_messages, response_id=response_id, ) @@ -124,7 +123,7 @@ def run_stream( *, thread: AgentThread | None = None, **kwargs: Any, - ) -> AsyncIterable[AgentRunResponseUpdate]: + ) -> AsyncIterable[AgentResponseUpdate]: """ Stream clarification process with human interaction. @@ -143,7 +142,7 @@ async def _invoke_stream_internal( messages: str | ChatMessage | list[str] | list[ChatMessage] | None, thread: AgentThread | None, **kwargs: Any, - ) -> AsyncIterable[AgentRunResponseUpdate]: + ) -> AsyncIterable[AgentResponseUpdate]: """ Internal streaming implementation. @@ -205,9 +204,10 @@ async def _invoke_stream_internal( message_id = str(uuid.uuid4()) # Yield final assistant text update with explicit text content - text_update = AgentRunResponseUpdate( + # New API: use Content.from_text() or pass text directly to AgentResponseUpdate + text_update = AgentResponseUpdate( role=Role.ASSISTANT, - contents=[TextContent(text=synthetic_reply)], + text=synthetic_reply, # New API accepts text directly author_name=self.name, response_id=response_id, message_id=message_id, @@ -218,10 +218,10 @@ async def _invoke_stream_internal( # Yield synthetic usage update for consistency # Use same message_id to indicate this is part of the same message - usage_update = AgentRunResponseUpdate( + usage_update = AgentResponseUpdate( role=Role.ASSISTANT, contents=[ - UsageContent( + Content.from_usage( UsageDetails( input_token_count=len(message_text.split()), output_token_count=len(synthetic_reply.split()), diff --git a/src/backend/v4/orchestration/human_approval_manager.py b/src/backend/v4/orchestration/human_approval_manager.py index 2a3ab5be7..654d72a23 100644 --- a/src/backend/v4/orchestration/human_approval_manager.py +++ b/src/backend/v4/orchestration/human_approval_manager.py @@ -34,11 +34,12 @@ class HumanApprovalMagenticManager(StandardMagenticManager): magentic_plan: Optional[MPlan] = None current_user_id: str # populated in __init__ - def __init__(self, user_id: str, *args, **kwargs): + def __init__(self, user_id: str, agent, *args, **kwargs): """ Initialize the HumanApprovalMagenticManager. Args: user_id: ID of the user to associate with this orchestration instance. + agent: The manager ChatAgent for orchestration (required by new API). *args: Additional positional arguments for the parent StandardMagenticManager. **kwargs: Additional keyword arguments for the parent StandardMagenticManager. """ @@ -76,7 +77,8 @@ def __init__(self, user_id: str, *args, **kwargs): kwargs["final_answer_prompt"] = ORCHESTRATOR_FINAL_ANSWER_PROMPT + final_append self.current_user_id = user_id - super().__init__(*args, **kwargs) + # New API: StandardMagenticManager takes agent as first positional argument + super().__init__(agent, *args, **kwargs) async def plan(self, magentic_context: MagenticContext) -> Any: """ diff --git a/src/backend/v4/orchestration/orchestration_manager.py b/src/backend/v4/orchestration/orchestration_manager.py index e105a34cb..ec4f7aea1 100644 --- a/src/backend/v4/orchestration/orchestration_manager.py +++ b/src/backend/v4/orchestration/orchestration_manager.py @@ -2,20 +2,22 @@ import asyncio import logging +import re import uuid from typing import List, Optional # agent_framework imports -from agent_framework_azure_ai import AzureAIAgentClient +from agent_framework_azure_ai import AzureAIClient from agent_framework import ( + ChatAgent, ChatMessage, WorkflowOutputEvent, MagenticBuilder, InMemoryCheckpointStorage, - MagenticOrchestratorMessageEvent, - MagenticAgentDeltaEvent, - MagenticAgentMessageEvent, - MagenticFinalResultEvent, + AgentRunUpdateEvent, + GroupChatRequestSentEvent, + MagenticOrchestratorEvent, + MagenticProgressLedger, ) from common.config.app_config import config @@ -58,7 +60,7 @@ async def init_orchestration( Initialize a Magentic workflow with: - Provided agents (participants) - HumanApprovalMagenticManager as orchestrator manager - - AzureAIAgentClient as the underlying chat client + - AzureAIClient as the underlying chat client - Event-based callbacks for streaming and final responses - Uses same deployment, endpoint, and credentials - Applies same execution settings (temperature, max_tokens) @@ -72,33 +74,46 @@ async def init_orchestration( # Create Azure AI Agent client for orchestration using config # This replaces AzureChatCompletion from SK - agent_name = team_config.name if team_config.name else "OrchestratorAgent" + # Sanitize agent name: must start/end with alphanumeric, only hyphens allowed, max 63 chars + raw_name = team_config.name if team_config.name else "OrchestratorAgent" + # Replace spaces and invalid chars with hyphens, strip leading/trailing hyphens + sanitized_name = re.sub(r'[^a-zA-Z0-9-]', '-', raw_name) + sanitized_name = re.sub(r'-+', '-', sanitized_name) # Collapse multiple hyphens + sanitized_name = sanitized_name.strip('-')[:63] # Trim and limit length + agent_name = sanitized_name if sanitized_name else "OrchestratorAgent" try: - chat_client = AzureAIAgentClient( + # Create the chat client (AzureAIClient) + chat_client = AzureAIClient( project_endpoint=config.AZURE_AI_PROJECT_ENDPOINT, model_deployment_name=team_config.deployment_name, agent_name=agent_name, - async_credential=credential, + credential=credential, + ) + + # New API: Create a ChatAgent to wrap the chat client for the manager + manager_agent = ChatAgent( + chat_client=chat_client, + name="MagenticManager", + description="Orchestrator that coordinates the team to complete complex tasks efficiently.", + instructions="You coordinate a team to complete complex tasks efficiently.", ) cls.logger.info( - "Created AzureAIAgentClient for orchestration with model '%s' at endpoint '%s'", + "Created AzureAIClient and manager ChatAgent for orchestration with model '%s' at endpoint '%s'", team_config.deployment_name, config.AZURE_AI_PROJECT_ENDPOINT, ) except Exception as e: - cls.logger.error("Failed to create AzureAIAgentClient: %s", e) + cls.logger.error("Failed to create AzureAIClient: %s", e) raise - # Create HumanApprovalMagenticManager with the chat client - # Execution settings (temperature=0.1, max_tokens=4000) are configured via - # orchestration_config.create_execution_settings() which matches old SK version + # Create HumanApprovalMagenticManager with the manager agent + # New API: StandardMagenticManager takes agent as first positional argument try: manager = HumanApprovalMagenticManager( user_id=user_id, - chat_client=chat_client, - instructions=None, # Orchestrator system instructions (optional) + agent=manager_agent, # New API: pass agent instead of chat_client max_round_count=orchestration_config.max_rounds, ) cls.logger.info( @@ -132,13 +147,18 @@ async def init_orchestration( # Assemble workflow with callback storage = InMemoryCheckpointStorage() + + # New API: .participants() accepts a list of agents + participant_list = list(participants.values()) + builder = ( MagenticBuilder() - .participants(**participants) - .with_standard_manager( - manager=manager, + .participants(participant_list) + .with_manager( + manager=manager, # Pass manager instance (extends StandardMagenticManager) max_round_count=orchestration_config.max_rounds, - max_stall_count=0, + max_stall_count=3, + max_reset_count=2, ) .with_checkpointing(storage) ) @@ -204,16 +224,20 @@ async def get_current_or_new_orchestration( raise try: cls.logger.info("Initializing new orchestration for user '%s'", user_id) - orchestration_config.orchestrations[user_id] = ( - await cls.init_orchestration( - agents, team_config, team_service.memory_context, user_id - ) + print(f"[DEBUG] Initializing new orchestration for user '{user_id}'") + workflow = await cls.init_orchestration( + agents, team_config, team_service.memory_context, user_id ) + orchestration_config.orchestrations[user_id] = workflow + print(f"[DEBUG] Stored workflow for user '{user_id}': {workflow is not None}") + print(f"[DEBUG] orchestrations keys: {list(orchestration_config.orchestrations.keys())}") except Exception as e: cls.logger.error( "Failed to initialize orchestration for user '%s': %s", user_id, e ) print(f"Failed to initialize orchestration for user '{user_id}': {e}") + import traceback + traceback.print_exc() raise return orchestration_config.get_current_orchestration(user_id) @@ -229,9 +253,13 @@ async def run_orchestration(self, user_id: str, input_task) -> None: self.logger.info( "Starting orchestration job '%s' for user '%s'", job_id, user_id ) + print(f"[DEBUG] run_orchestration called for user '{user_id}'") + print(f"[DEBUG] orchestrations keys before get: {list(orchestration_config.orchestrations.keys())}") workflow = orchestration_config.get_current_orchestration(user_id) + print(f"[DEBUG] workflow is None: {workflow is None}") if workflow is None: + print(f"[ERROR] Orchestration not initialized for user '{user_id}'") raise ValueError("Orchestration not initialized for user.") # Fresh thread per participant to avoid cross-run state bleed executors = getattr(workflow, "executors", {}) @@ -305,55 +333,71 @@ async def run_orchestration(self, user_id: str, input_task) -> None: final_output: str | None = None self.logger.info("Starting workflow execution...") + last_message_id: str | None = None async for event in workflow.run_stream(task_text): try: - # Handle orchestrator messages (task assignments, coordination) - if isinstance(event, MagenticOrchestratorMessageEvent): - message_text = getattr(event.message, "text", "") - self.logger.info(f"[ORCHESTRATOR:{event.kind}] {message_text}") - - # Handle streaming updates from agents - elif isinstance(event, MagenticAgentDeltaEvent): + # Handle orchestrator events (plan, progress ledger) + if isinstance(event, MagenticOrchestratorEvent): + self.logger.info( + "[Magentic Orchestrator Event] Type: %s", + event.event_type.name + ) + if isinstance(event.data, ChatMessage): + self.logger.info("Plan message: %s", event.data.text[:200] if event.data.text else "") + elif isinstance(event.data, MagenticProgressLedger): + self.logger.info("Progress ledger received") + + # Handle agent streaming/updates (replaces MagenticAgentDeltaEvent and MagenticAgentMessageEvent) + elif isinstance(event, AgentRunUpdateEvent): + message_id = event.data.message_id if hasattr(event.data, 'message_id') else None + executor_id = event.executor_id + + # Stream the update try: await streaming_agent_response_callback( - event.agent_id, - event, # Pass the event itself as the update object - False, # Not final yet (streaming in progress) + executor_id, + event.data, # Pass the data object + False, # Not final yet user_id, ) except Exception as e: self.logger.error( - f"Error in streaming callback for agent {event.agent_id}: {e}" + "Error in streaming callback for agent %s: %s", + executor_id, e ) + + # Track message for formatting + if message_id != last_message_id: + last_message_id = message_id - # Handle final agent messages (complete response) - elif isinstance(event, MagenticAgentMessageEvent): - if event.message: - try: - agent_response_callback( - event.agent_id, event.message, user_id - ) - except Exception as e: - self.logger.error( - f"Error in agent callback for agent {event.agent_id}: {e}" - ) - - # Handle final result from the entire workflow - elif isinstance(event, MagenticFinalResultEvent): - final_text = getattr(event.message, "text", "") + # Handle group chat request sent + elif isinstance(event, GroupChatRequestSentEvent): self.logger.info( - f"[FINAL RESULT] Length: {len(final_text)} chars" + "[REQUEST SENT (round %d)] to agent: %s", + event.round_index, + event.participant_name ) # Handle workflow output event (captures final result) elif isinstance(event, WorkflowOutputEvent): output_data = event.data + # Handle different output formats if isinstance(output_data, ChatMessage): - final_output = getattr(output_data, "text", None) or str( - output_data - ) + final_output = output_data.text or "" + elif isinstance(output_data, list): + # Handle list of ChatMessage objects + texts = [] + for item in output_data: + if isinstance(item, ChatMessage): + if item.text: + texts.append(item.text) + else: + texts.append(str(item)) + final_output = "\n".join(texts) + elif hasattr(output_data, "text"): + final_output = output_data.text or "" else: - final_output = str(output_data) + final_output = str(output_data) if output_data else "" self.logger.debug("Received workflow output event") except Exception as e: From 95b0049c87df66c5927cddd4770ab8201a0acebf Mon Sep 17 00:00:00 2001 From: Abdul-Microsoft Date: Thu, 5 Feb 2026 22:38:09 +0530 Subject: [PATCH 003/225] v2 changes --- .../v4/magentic_agents/foundry_agent.py | 8 +- .../v4/orchestration/orchestration_manager.py | 82 +++++++++++++++++++ 2 files changed, 89 insertions(+), 1 deletion(-) diff --git a/src/backend/v4/magentic_agents/foundry_agent.py b/src/backend/v4/magentic_agents/foundry_agent.py index 614904b6d..9a7c8ebe8 100644 --- a/src/backend/v4/magentic_agents/foundry_agent.py +++ b/src/backend/v4/magentic_agents/foundry_agent.py @@ -125,7 +125,9 @@ async def _create_azure_search_enabled_client(self, chatClient=None) -> Optional Returns: AzureAIClient | None """ + print(f"[DEBUG _create_azure_search_enabled_client] Agent={self.agent_name}, chatClient={chatClient}, search_config={self.search}") if chatClient: + self.logger.info("Reusing existing chatClient for agent '%s' (already has Azure Search configured)", self.agent_name) return chatClient if not self.search: @@ -234,12 +236,16 @@ async def _after_open(self) -> None: try: chatClient = await self.get_database_team_agent() + print(f"[DEBUG _after_open] Agent={self.agent_name}, _use_azure_search={self._use_azure_search}, search_config={self.search}, chatClient={chatClient}") if self._use_azure_search: # Azure Search mode (skip MCP + Code Interpreter due to incompatibility) self.logger.info( - "Initializing agent in Azure AI Search mode (exclusive)." + "Initializing agent '%s' in Azure AI Search mode (exclusive) with index=%s.", + self.agent_name, + getattr(self.search, "index_name", "N/A") if self.search else "N/A" ) + print(f"[DEBUG _after_open] Creating Azure Search client for {self.agent_name}") chat_client = await self._create_azure_search_enabled_client(chatClient) if not chat_client: raise RuntimeError( diff --git a/src/backend/v4/orchestration/orchestration_manager.py b/src/backend/v4/orchestration/orchestration_manager.py index ec4f7aea1..4fc0c209a 100644 --- a/src/backend/v4/orchestration/orchestration_manager.py +++ b/src/backend/v4/orchestration/orchestration_manager.py @@ -16,6 +16,8 @@ InMemoryCheckpointStorage, AgentRunUpdateEvent, GroupChatRequestSentEvent, + GroupChatResponseReceivedEvent, + ExecutorCompletedEvent, MagenticOrchestratorEvent, MagenticProgressLedger, ) @@ -45,6 +47,53 @@ def __init__(self): self.user_id: Optional[str] = None self.logger = self.__class__.logger + def _extract_response_text(self, data) -> str: + """ + Extract text content from various agent_framework response types. + + Handles: + - ChatMessage: Extract .text + - AgentResponse: Extract .text + - AgentExecutorResponse: Extract from agent_response.text or full_conversation[-1].text + - List of any of the above + """ + if data is None: + return "" + + # Direct ChatMessage + if isinstance(data, ChatMessage): + return data.text or "" + + # Has .text attribute directly (AgentResponse, etc.) + if hasattr(data, "text") and data.text: + return data.text + + # AgentExecutorResponse - has agent_response and full_conversation + if hasattr(data, "agent_response"): + # Try to get text from agent_response first + agent_resp = data.agent_response + if agent_resp and hasattr(agent_resp, "text") and agent_resp.text: + return agent_resp.text + # Fallback to last message in full_conversation + if hasattr(data, "full_conversation") and data.full_conversation: + last_msg = data.full_conversation[-1] + if isinstance(last_msg, ChatMessage) and last_msg.text: + return last_msg.text + + # List of items - could be AgentExecutorResponse, ChatMessage, etc. + if isinstance(data, list) and len(data) > 0: + texts = [] + for item in data: + # Recursively extract from each item + item_text = self._extract_response_text(item) + if item_text: + texts.append(item_text) + if texts: + # Return the last non-empty response (most recent) + return texts[-1] + + return "" + # --------------------------- # Orchestration construction # --------------------------- @@ -336,6 +385,11 @@ async def run_orchestration(self, user_id: str, input_task) -> None: last_message_id: str | None = None async for event in workflow.run_stream(task_text): try: + # Only log non-streaming events (reduce noise) + event_type_name = type(event).__name__ + if event_type_name != "AgentRunUpdateEvent": + self.logger.info("[EVENT] %s", event_type_name) + # Handle orchestrator events (plan, progress ledger) if isinstance(event, MagenticOrchestratorEvent): self.logger.info( @@ -378,6 +432,34 @@ async def run_orchestration(self, user_id: str, input_task) -> None: event.participant_name ) + # Handle group chat response received - THIS IS WHERE AGENT RESPONSES COME + elif isinstance(event, GroupChatResponseReceivedEvent): + self.logger.info( + "[RESPONSE RECEIVED (round %d)] from agent: %s", + event.round_index, + event.participant_name + ) + # Send the agent response to the UI + if event.data: + response_text = self._extract_response_text(event.data) + + if response_text: + self.logger.info("Sending agent response to UI from %s", event.participant_name) + agent_response_callback( + event.participant_name, + ChatMessage(role="assistant", text=response_text), + user_id, + ) + + # Handle executor completed - just log, don't send to UI (GroupChatResponseReceivedEvent handles that) + elif isinstance(event, ExecutorCompletedEvent): + self.logger.debug( + "[EXECUTOR COMPLETED] agent: %s", + event.executor_id + ) + # Don't send to UI here - GroupChatResponseReceivedEvent already handles agent messages + # This avoids duplicate messages + # Handle workflow output event (captures final result) elif isinstance(event, WorkflowOutputEvent): output_data = event.data From cdf1c50729ea158499fb6b61170c0bffe798c5f2 Mon Sep 17 00:00:00 2001 From: Kingshuk-Microsoft Date: Mon, 9 Feb 2026 17:02:05 +0530 Subject: [PATCH 004/225] refactor: remove unused imports and clean up test files for better readability --- src/tests/backend/auth/test_auth_utils.py | 2 -- src/tests/backend/common/config/test_app_config.py | 4 +--- src/tests/backend/common/database/test_cosmosdb.py | 5 ++--- .../backend/common/database/test_database_base.py | 4 ++-- .../backend/common/database/test_database_factory.py | 3 +-- src/tests/backend/common/utils/test_event_utils.py | 2 +- src/tests/backend/common/utils/test_otlp_tracing.py | 2 +- src/tests/backend/common/utils/test_utils_af.py | 4 +--- src/tests/backend/common/utils/test_utils_agents.py | 5 +---- src/tests/backend/common/utils/test_utils_date.py | 7 ------- src/tests/backend/middleware/test_health_check.py | 4 +--- src/tests/backend/v4/api/test_router.py | 1 - src/tests/backend/v4/callbacks/test_global_debug.py | 3 +-- .../backend/v4/callbacks/test_response_handlers.py | 5 +---- .../v4/common/services/test_base_api_service.py | 2 +- .../v4/common/services/test_foundry_service.py | 8 ++------ .../backend/v4/common/services/test_mcp_service.py | 7 +++---- .../backend/v4/common/services/test_plan_service.py | 4 ++-- .../backend/v4/common/services/test_team_service.py | 7 ++----- src/tests/backend/v4/config/test_settings.py | 4 ++-- .../v4/magentic_agents/common/test_lifecycle.py | 2 +- .../backend/v4/magentic_agents/test_foundry_agent.py | 5 +---- .../v4/magentic_agents/test_magentic_agent_factory.py | 4 +--- .../backend/v4/magentic_agents/test_proxy_agent.py | 10 ++++------ .../helper/test_plan_to_mplan_converter.py | 1 - .../v4/orchestration/test_human_approval_manager.py | 5 +---- .../v4/orchestration/test_orchestration_manager.py | 11 ++++------- 27 files changed, 37 insertions(+), 84 deletions(-) diff --git a/src/tests/backend/auth/test_auth_utils.py b/src/tests/backend/auth/test_auth_utils.py index 0fdc848bf..01eee62e5 100644 --- a/src/tests/backend/auth/test_auth_utils.py +++ b/src/tests/backend/auth/test_auth_utils.py @@ -5,10 +5,8 @@ import pytest import base64 import json -import logging import sys import os -import importlib.util from unittest.mock import patch, MagicMock # Add the source root directory to the Python path for imports diff --git a/src/tests/backend/common/config/test_app_config.py b/src/tests/backend/common/config/test_app_config.py index 95784031b..0bfb0e2a7 100644 --- a/src/tests/backend/common/config/test_app_config.py +++ b/src/tests/backend/common/config/test_app_config.py @@ -13,9 +13,7 @@ import os import logging from unittest.mock import patch, MagicMock, AsyncMock -from azure.identity import DefaultAzureCredential, ManagedIdentityCredential -from azure.cosmos import CosmosClient -from azure.ai.projects.aio import AIProjectClient +from azure.identity import ManagedIdentityCredential # Add the source root directory to the Python path for imports import sys diff --git a/src/tests/backend/common/database/test_cosmosdb.py b/src/tests/backend/common/database/test_cosmosdb.py index 4a34a5f91..c9096fcb7 100644 --- a/src/tests/backend/common/database/test_cosmosdb.py +++ b/src/tests/backend/common/database/test_cosmosdb.py @@ -4,10 +4,9 @@ import logging import sys import os -from typing import Any, Dict, List, Optional -from unittest.mock import AsyncMock, MagicMock, Mock, patch +from typing import Dict, List, Optional +from unittest.mock import AsyncMock, Mock, patch import pytest -import uuid # Add the backend directory to the Python path sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', '..', '..', '..', 'backend')) diff --git a/src/tests/backend/common/database/test_database_base.py b/src/tests/backend/common/database/test_database_base.py index 9491ed6b8..e966968a1 100644 --- a/src/tests/backend/common/database/test_database_base.py +++ b/src/tests/backend/common/database/test_database_base.py @@ -2,9 +2,9 @@ import sys import os -from abc import ABC, abstractmethod +from abc import ABC from typing import Any, Dict, List, Optional, Type -from unittest.mock import AsyncMock, Mock, patch +from unittest.mock import Mock, patch import pytest # Add the backend directory to the Python path diff --git a/src/tests/backend/common/database/test_database_factory.py b/src/tests/backend/common/database/test_database_factory.py index bb3643322..e58be8672 100644 --- a/src/tests/backend/common/database/test_database_factory.py +++ b/src/tests/backend/common/database/test_database_factory.py @@ -3,8 +3,7 @@ import logging import sys import os -from typing import Optional -from unittest.mock import AsyncMock, Mock, patch, MagicMock +from unittest.mock import AsyncMock, Mock, patch import pytest # Add the backend directory to the Python path diff --git a/src/tests/backend/common/utils/test_event_utils.py b/src/tests/backend/common/utils/test_event_utils.py index 74a23e62e..99613092d 100644 --- a/src/tests/backend/common/utils/test_event_utils.py +++ b/src/tests/backend/common/utils/test_event_utils.py @@ -3,7 +3,7 @@ import logging import sys import os -from unittest.mock import Mock, patch, MagicMock +from unittest.mock import Mock, patch import pytest # Mock external dependencies at module level diff --git a/src/tests/backend/common/utils/test_otlp_tracing.py b/src/tests/backend/common/utils/test_otlp_tracing.py index dbf3ab244..ac7474f1e 100644 --- a/src/tests/backend/common/utils/test_otlp_tracing.py +++ b/src/tests/backend/common/utils/test_otlp_tracing.py @@ -2,7 +2,7 @@ import sys import os -from unittest.mock import Mock, patch, MagicMock, call +from unittest.mock import Mock, patch, call import pytest # Mock external dependencies at module level diff --git a/src/tests/backend/common/utils/test_utils_af.py b/src/tests/backend/common/utils/test_utils_af.py index 815f8c9fd..30307a9f4 100644 --- a/src/tests/backend/common/utils/test_utils_af.py +++ b/src/tests/backend/common/utils/test_utils_af.py @@ -1,10 +1,8 @@ """Unit tests for utils_af module.""" -import logging import sys import os -import uuid -from unittest.mock import Mock, patch, AsyncMock, MagicMock +from unittest.mock import Mock, patch, AsyncMock import pytest # Add the backend directory to the Python path diff --git a/src/tests/backend/common/utils/test_utils_agents.py b/src/tests/backend/common/utils/test_utils_agents.py index 8f4e80891..dd3833a89 100644 --- a/src/tests/backend/common/utils/test_utils_agents.py +++ b/src/tests/backend/common/utils/test_utils_agents.py @@ -4,7 +4,6 @@ This module tests the utility functions for agent ID generation and database operations. """ -import logging import string import sys import unittest @@ -33,10 +32,8 @@ sys.modules['common.models'] = Mock() sys.modules['common.models.messages_af'] = Mock() -import pytest - from backend.common.database.database_base import DatabaseBase -from backend.common.models.messages_af import CurrentTeamAgent, DataType, TeamConfiguration +from backend.common.models.messages_af import CurrentTeamAgent, TeamConfiguration from backend.common.utils.utils_agents import ( generate_assistant_id, get_database_team_agent_id, diff --git a/src/tests/backend/common/utils/test_utils_date.py b/src/tests/backend/common/utils/test_utils_date.py index 377e51757..4018a4429 100644 --- a/src/tests/backend/common/utils/test_utils_date.py +++ b/src/tests/backend/common/utils/test_utils_date.py @@ -7,16 +7,12 @@ import json import locale -import logging import unittest import sys import os from datetime import datetime -from typing import Optional from unittest.mock import Mock, patch -import pytest - # Add the backend directory to the Python path sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', '..', '..', '..', 'backend')) @@ -90,9 +86,6 @@ def mock_parse(date_str): import re as real_re utils_date_module.re = real_re -# Import dateutil.parser after mocking to avoid import errors -from dateutil import parser - class TestFormatDateForUser(unittest.TestCase): """Test cases for format_date_for_user function.""" diff --git a/src/tests/backend/middleware/test_health_check.py b/src/tests/backend/middleware/test_health_check.py index 5cb545b8b..76e88ccd5 100644 --- a/src/tests/backend/middleware/test_health_check.py +++ b/src/tests/backend/middleware/test_health_check.py @@ -1,7 +1,5 @@ """Unit tests for backend.middleware.health_check module.""" -import asyncio -import logging -from unittest.mock import Mock, patch, AsyncMock, MagicMock +from unittest.mock import Mock, patch, AsyncMock import pytest # Import the module under test diff --git a/src/tests/backend/v4/api/test_router.py b/src/tests/backend/v4/api/test_router.py index 9558a59a4..1d1882d71 100644 --- a/src/tests/backend/v4/api/test_router.py +++ b/src/tests/backend/v4/api/test_router.py @@ -7,7 +7,6 @@ import sys import unittest from unittest.mock import Mock, patch -import asyncio # Set up environment sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', '..', '..', 'backend')) diff --git a/src/tests/backend/v4/callbacks/test_global_debug.py b/src/tests/backend/v4/callbacks/test_global_debug.py index f630b605e..3180cf91e 100644 --- a/src/tests/backend/v4/callbacks/test_global_debug.py +++ b/src/tests/backend/v4/callbacks/test_global_debug.py @@ -1,7 +1,6 @@ """Unit tests for backend.v4.callbacks.global_debug module.""" import sys -from unittest.mock import Mock, patch -import pytest +from unittest.mock import Mock # Mock the dependencies before importing the module under test sys.modules['azure'] = Mock() diff --git a/src/tests/backend/v4/callbacks/test_response_handlers.py b/src/tests/backend/v4/callbacks/test_response_handlers.py index 25ed5601f..a74e9c685 100644 --- a/src/tests/backend/v4/callbacks/test_response_handlers.py +++ b/src/tests/backend/v4/callbacks/test_response_handlers.py @@ -1,11 +1,8 @@ """Unit tests for response_handlers module.""" -import asyncio -import logging import sys import os -import time -from unittest.mock import Mock, patch, AsyncMock, MagicMock +from unittest.mock import Mock, patch, AsyncMock import pytest # Add the backend directory to the Python path diff --git a/src/tests/backend/v4/common/services/test_base_api_service.py b/src/tests/backend/v4/common/services/test_base_api_service.py index 37a6f7963..823b26826 100644 --- a/src/tests/backend/v4/common/services/test_base_api_service.py +++ b/src/tests/backend/v4/common/services/test_base_api_service.py @@ -13,7 +13,7 @@ import sys import importlib.util from unittest.mock import patch, MagicMock, AsyncMock, Mock -from typing import Any, Dict, Optional, Union +from typing import Dict, Optional, Union import aiohttp from aiohttp import ClientTimeout, ClientSession diff --git a/src/tests/backend/v4/common/services/test_foundry_service.py b/src/tests/backend/v4/common/services/test_foundry_service.py index 9b71cd28f..ee6b714e4 100644 --- a/src/tests/backend/v4/common/services/test_foundry_service.py +++ b/src/tests/backend/v4/common/services/test_foundry_service.py @@ -11,13 +11,9 @@ import pytest import os -import re -import logging -import aiohttp import sys -import importlib.util -from unittest.mock import patch, MagicMock, AsyncMock, Mock -from typing import Any, Dict, List +from unittest.mock import patch, MagicMock, AsyncMock +from typing import Any, Dict # Add backend directory to sys.path for imports current_dir = os.path.dirname(os.path.abspath(__file__)) diff --git a/src/tests/backend/v4/common/services/test_mcp_service.py b/src/tests/backend/v4/common/services/test_mcp_service.py index ae0b134e6..9c5e410de 100644 --- a/src/tests/backend/v4/common/services/test_mcp_service.py +++ b/src/tests/backend/v4/common/services/test_mcp_service.py @@ -14,10 +14,9 @@ import sys import asyncio import importlib.util -from unittest.mock import patch, MagicMock, AsyncMock, Mock -from typing import Any, Dict, Optional -import aiohttp -from aiohttp import ClientTimeout, ClientSession, ClientError +from unittest.mock import patch, MagicMock, Mock +from typing import Dict, Optional +from aiohttp import ClientTimeout, ClientError # Add the src directory to sys.path for proper import src_path = os.path.join(os.path.dirname(__file__), '..', '..', '..', '..') diff --git a/src/tests/backend/v4/common/services/test_plan_service.py b/src/tests/backend/v4/common/services/test_plan_service.py index 3c6ccc734..a1985f86f 100644 --- a/src/tests/backend/v4/common/services/test_plan_service.py +++ b/src/tests/backend/v4/common/services/test_plan_service.py @@ -17,8 +17,8 @@ import json import logging import importlib.util -from unittest.mock import patch, MagicMock, AsyncMock, Mock -from typing import Any, Dict, Optional, List +from unittest.mock import patch, MagicMock, AsyncMock +from typing import Any, Optional, List from dataclasses import dataclass # Add the src directory to sys.path for proper import diff --git a/src/tests/backend/v4/common/services/test_team_service.py b/src/tests/backend/v4/common/services/test_team_service.py index c8573fe7b..d0aeb39f7 100644 --- a/src/tests/backend/v4/common/services/test_team_service.py +++ b/src/tests/backend/v4/common/services/test_team_service.py @@ -16,13 +16,10 @@ import os import sys import asyncio -import json -import logging import uuid import importlib.util -from unittest.mock import patch, MagicMock, AsyncMock, Mock -from typing import Any, Dict, Optional, List, Tuple -from dataclasses import dataclass +from unittest.mock import patch, MagicMock, AsyncMock +from typing import Dict, Optional, List, Tuple from datetime import datetime, timezone # Add the src directory to sys.path for proper import diff --git a/src/tests/backend/v4/config/test_settings.py b/src/tests/backend/v4/config/test_settings.py index 1a986482e..6a7cf4280 100644 --- a/src/tests/backend/v4/config/test_settings.py +++ b/src/tests/backend/v4/config/test_settings.py @@ -432,7 +432,7 @@ async def cancel_task(): cancel_task_handle = asyncio.create_task(cancel_task()) with self.assertRaises(asyncio.CancelledError): - await task + result = await task await cancel_task_handle @@ -454,7 +454,7 @@ async def cancel_task(): with self.assertRaises(asyncio.CancelledError): await task - await cancel_task_handle + _ = await cancel_task_handle def test_cleanup_approval(self): """Test cleanup approval.""" diff --git a/src/tests/backend/v4/magentic_agents/common/test_lifecycle.py b/src/tests/backend/v4/magentic_agents/common/test_lifecycle.py index c3ee233ce..d30b79654 100644 --- a/src/tests/backend/v4/magentic_agents/common/test_lifecycle.py +++ b/src/tests/backend/v4/magentic_agents/common/test_lifecycle.py @@ -2,7 +2,7 @@ import asyncio import logging import sys -from unittest.mock import Mock, patch, AsyncMock, MagicMock +from unittest.mock import Mock, patch, AsyncMock import pytest # Mock the dependencies before importing the module under test diff --git a/src/tests/backend/v4/magentic_agents/test_foundry_agent.py b/src/tests/backend/v4/magentic_agents/test_foundry_agent.py index 335fc3a33..ea09cc7c7 100644 --- a/src/tests/backend/v4/magentic_agents/test_foundry_agent.py +++ b/src/tests/backend/v4/magentic_agents/test_foundry_agent.py @@ -1,11 +1,8 @@ """Unit tests for backend.v4.magentic_agents.foundry_agent module.""" -import asyncio -import logging import sys import os -import time -from unittest.mock import Mock, patch, AsyncMock, MagicMock, call +from unittest.mock import Mock, patch, AsyncMock, call import pytest # Add the backend directory to the Python path diff --git a/src/tests/backend/v4/magentic_agents/test_magentic_agent_factory.py b/src/tests/backend/v4/magentic_agents/test_magentic_agent_factory.py index bfbece0c3..1e8771b64 100644 --- a/src/tests/backend/v4/magentic_agents/test_magentic_agent_factory.py +++ b/src/tests/backend/v4/magentic_agents/test_magentic_agent_factory.py @@ -1,10 +1,8 @@ """Unit tests for backend.v4.magentic_agents.magentic_agent_factory module.""" -import asyncio -import json import logging import sys from types import SimpleNamespace -from unittest.mock import Mock, patch, AsyncMock, MagicMock +from unittest.mock import Mock, patch, AsyncMock import pytest # Mock the dependencies before importing the module under test diff --git a/src/tests/backend/v4/magentic_agents/test_proxy_agent.py b/src/tests/backend/v4/magentic_agents/test_proxy_agent.py index 2081f35b0..48dd63dce 100644 --- a/src/tests/backend/v4/magentic_agents/test_proxy_agent.py +++ b/src/tests/backend/v4/magentic_agents/test_proxy_agent.py @@ -4,7 +4,7 @@ import sys import time import uuid -from unittest.mock import Mock, patch, AsyncMock, MagicMock +from unittest.mock import Mock, patch, AsyncMock import pytest # Mock the dependencies before importing the module under test @@ -57,7 +57,7 @@ # Now import the module under test -from backend.v4.magentic_agents.proxy_agent import ProxyAgent, create_proxy_agent +from backend.v4.magentic_agents.proxy_agent import create_proxy_agent class TestProxyAgentComplexScenarios: @@ -123,9 +123,8 @@ def test_extract_logic(input_val): def test_timeout_and_error_scenarios(self): """Test timeout and error handling scenarios.""" - import asyncio - - + + # Test that timeout logic would work loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) @@ -880,7 +879,6 @@ async def mock_wait_with_error_handling(request_id): mock_orchestration_config.clarifications = {"test-request": None} # This would test each error path - import asyncio loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) diff --git a/src/tests/backend/v4/orchestration/helper/test_plan_to_mplan_converter.py b/src/tests/backend/v4/orchestration/helper/test_plan_to_mplan_converter.py index d25b97e83..333c2f434 100644 --- a/src/tests/backend/v4/orchestration/helper/test_plan_to_mplan_converter.py +++ b/src/tests/backend/v4/orchestration/helper/test_plan_to_mplan_converter.py @@ -8,7 +8,6 @@ import os import sys import unittest -import re # Set up environment variables (removed manual path modification as pytest config handles it) os.environ.update({ diff --git a/src/tests/backend/v4/orchestration/test_human_approval_manager.py b/src/tests/backend/v4/orchestration/test_human_approval_manager.py index 952cbf166..8b9376cf3 100644 --- a/src/tests/backend/v4/orchestration/test_human_approval_manager.py +++ b/src/tests/backend/v4/orchestration/test_human_approval_manager.py @@ -4,15 +4,12 @@ """ import asyncio -import logging import os import sys import unittest -from typing import Any, Optional +from typing import Optional from unittest.mock import Mock, AsyncMock, patch -import pytest - # Add the backend directory to the Python path sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', '..', '..', '..', 'backend')) diff --git a/src/tests/backend/v4/orchestration/test_orchestration_manager.py b/src/tests/backend/v4/orchestration/test_orchestration_manager.py index 119aa4372..f4163a903 100644 --- a/src/tests/backend/v4/orchestration/test_orchestration_manager.py +++ b/src/tests/backend/v4/orchestration/test_orchestration_manager.py @@ -7,12 +7,9 @@ import logging import os import sys -import uuid -from typing import List, Optional +from typing import List from unittest import IsolatedAsyncioTestCase -from unittest.mock import AsyncMock, Mock, patch, MagicMock - -import pytest +from unittest.mock import AsyncMock, Mock, patch # Add the backend directory to the Python path sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', '..', '..', '..', 'backend')) @@ -442,7 +439,7 @@ async def test_get_current_or_new_orchestration_new(self): mock_workflow = Mock() mock_init.return_value = mock_workflow - result = await OrchestrationManager.get_current_or_new_orchestration( + await OrchestrationManager.get_current_or_new_orchestration( user_id=self.test_user_id, team_config=self.test_team_config, team_switched=False, @@ -466,7 +463,7 @@ async def test_get_current_or_new_orchestration_team_switched(self): mock_new_workflow = Mock() mock_init.return_value = mock_new_workflow - result = await OrchestrationManager.get_current_or_new_orchestration( + await OrchestrationManager.get_current_or_new_orchestration( user_id=self.test_user_id, team_config=self.test_team_config, team_switched=True, From 93ecd36e1de020d2d08ca3ad46da07097c7017d2 Mon Sep 17 00:00:00 2001 From: Kingshuk-Microsoft Date: Mon, 9 Feb 2026 17:06:12 +0530 Subject: [PATCH 005/225] fix: update workflow to include code-quality-fix branch in trigger paths --- .github/workflows/test.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 428882567..80eb33b05 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -6,6 +6,7 @@ on: - main - demo-v4 - dev-v4 + - code-quality-fix paths: - 'src/backend/**/*.py' - 'src/tests/**/*.py' @@ -25,7 +26,7 @@ on: - main - demo-v4 - dev-v4 - paths: + - code-quality-fix - 'src/backend/**/*.py' - 'src/tests/**/*.py' - 'src/mcp_server/**/*.py' From 2b601b373d1d6b8f79902f18116bb60ca900cf5f Mon Sep 17 00:00:00 2001 From: Kingshuk-Microsoft Date: Mon, 9 Feb 2026 17:08:58 +0530 Subject: [PATCH 006/225] fix: remove code-quality-fix branch from workflow trigger paths --- .github/workflows/test.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 80eb33b05..6ff949317 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -6,7 +6,6 @@ on: - main - demo-v4 - dev-v4 - - code-quality-fix paths: - 'src/backend/**/*.py' - 'src/tests/**/*.py' @@ -26,7 +25,6 @@ on: - main - demo-v4 - dev-v4 - - code-quality-fix - 'src/backend/**/*.py' - 'src/tests/**/*.py' - 'src/mcp_server/**/*.py' From 2a5d61c0c33e7c7fc663248add91722915b4eeb6 Mon Sep 17 00:00:00 2001 From: Kingshuk-Microsoft Date: Tue, 10 Feb 2026 13:48:28 +0530 Subject: [PATCH 007/225] refactor: remove unused imports from test files for improved code quality --- src/tests/backend/common/config/test_app_config.py | 1 - src/tests/backend/common/database/test_cosmosdb.py | 1 - src/tests/backend/common/database/test_database_base.py | 2 +- src/tests/backend/v4/common/services/test_base_api_service.py | 1 - src/tests/backend/v4/common/services/test_mcp_service.py | 3 +-- src/tests/backend/v4/common/services/test_team_service.py | 1 - src/tests/backend/v4/config/test_settings.py | 4 ++-- src/tests/backend/v4/magentic_agents/test_foundry_agent.py | 2 +- .../backend/v4/magentic_agents/test_magentic_agent_factory.py | 2 +- .../backend/v4/orchestration/test_human_approval_manager.py | 1 - 10 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/tests/backend/common/config/test_app_config.py b/src/tests/backend/common/config/test_app_config.py index 0bfb0e2a7..2652d4532 100644 --- a/src/tests/backend/common/config/test_app_config.py +++ b/src/tests/backend/common/config/test_app_config.py @@ -13,7 +13,6 @@ import os import logging from unittest.mock import patch, MagicMock, AsyncMock -from azure.identity import ManagedIdentityCredential # Add the source root directory to the Python path for imports import sys diff --git a/src/tests/backend/common/database/test_cosmosdb.py b/src/tests/backend/common/database/test_cosmosdb.py index c9096fcb7..31cfe34ce 100644 --- a/src/tests/backend/common/database/test_cosmosdb.py +++ b/src/tests/backend/common/database/test_cosmosdb.py @@ -4,7 +4,6 @@ import logging import sys import os -from typing import Dict, List, Optional from unittest.mock import AsyncMock, Mock, patch import pytest diff --git a/src/tests/backend/common/database/test_database_base.py b/src/tests/backend/common/database/test_database_base.py index e966968a1..0eba3ba6f 100644 --- a/src/tests/backend/common/database/test_database_base.py +++ b/src/tests/backend/common/database/test_database_base.py @@ -4,7 +4,7 @@ import os from abc import ABC from typing import Any, Dict, List, Optional, Type -from unittest.mock import Mock, patch +from unittest.mock import Mock import pytest # Add the backend directory to the Python path diff --git a/src/tests/backend/v4/common/services/test_base_api_service.py b/src/tests/backend/v4/common/services/test_base_api_service.py index 823b26826..5a45837f4 100644 --- a/src/tests/backend/v4/common/services/test_base_api_service.py +++ b/src/tests/backend/v4/common/services/test_base_api_service.py @@ -13,7 +13,6 @@ import sys import importlib.util from unittest.mock import patch, MagicMock, AsyncMock, Mock -from typing import Dict, Optional, Union import aiohttp from aiohttp import ClientTimeout, ClientSession diff --git a/src/tests/backend/v4/common/services/test_mcp_service.py b/src/tests/backend/v4/common/services/test_mcp_service.py index 9c5e410de..4b1f43270 100644 --- a/src/tests/backend/v4/common/services/test_mcp_service.py +++ b/src/tests/backend/v4/common/services/test_mcp_service.py @@ -14,8 +14,7 @@ import sys import asyncio import importlib.util -from unittest.mock import patch, MagicMock, Mock -from typing import Dict, Optional +from unittest.mock import patch, MagicMock from aiohttp import ClientTimeout, ClientError # Add the src directory to sys.path for proper import diff --git a/src/tests/backend/v4/common/services/test_team_service.py b/src/tests/backend/v4/common/services/test_team_service.py index d0aeb39f7..0fe9d9495 100644 --- a/src/tests/backend/v4/common/services/test_team_service.py +++ b/src/tests/backend/v4/common/services/test_team_service.py @@ -19,7 +19,6 @@ import uuid import importlib.util from unittest.mock import patch, MagicMock, AsyncMock -from typing import Dict, Optional, List, Tuple from datetime import datetime, timezone # Add the src directory to sys.path for proper import diff --git a/src/tests/backend/v4/config/test_settings.py b/src/tests/backend/v4/config/test_settings.py index 6a7cf4280..1a986482e 100644 --- a/src/tests/backend/v4/config/test_settings.py +++ b/src/tests/backend/v4/config/test_settings.py @@ -432,7 +432,7 @@ async def cancel_task(): cancel_task_handle = asyncio.create_task(cancel_task()) with self.assertRaises(asyncio.CancelledError): - result = await task + await task await cancel_task_handle @@ -454,7 +454,7 @@ async def cancel_task(): with self.assertRaises(asyncio.CancelledError): await task - _ = await cancel_task_handle + await cancel_task_handle def test_cleanup_approval(self): """Test cleanup approval.""" diff --git a/src/tests/backend/v4/magentic_agents/test_foundry_agent.py b/src/tests/backend/v4/magentic_agents/test_foundry_agent.py index ea09cc7c7..97da0b31e 100644 --- a/src/tests/backend/v4/magentic_agents/test_foundry_agent.py +++ b/src/tests/backend/v4/magentic_agents/test_foundry_agent.py @@ -2,7 +2,7 @@ import sys import os -from unittest.mock import Mock, patch, AsyncMock, call +from unittest.mock import Mock, patch, AsyncMock import pytest # Add the backend directory to the Python path diff --git a/src/tests/backend/v4/magentic_agents/test_magentic_agent_factory.py b/src/tests/backend/v4/magentic_agents/test_magentic_agent_factory.py index 1e8771b64..23e370f9c 100644 --- a/src/tests/backend/v4/magentic_agents/test_magentic_agent_factory.py +++ b/src/tests/backend/v4/magentic_agents/test_magentic_agent_factory.py @@ -2,7 +2,7 @@ import logging import sys from types import SimpleNamespace -from unittest.mock import Mock, patch, AsyncMock +from unittest.mock import Mock, AsyncMock import pytest # Mock the dependencies before importing the module under test diff --git a/src/tests/backend/v4/orchestration/test_human_approval_manager.py b/src/tests/backend/v4/orchestration/test_human_approval_manager.py index 8b9376cf3..bd1b27fd5 100644 --- a/src/tests/backend/v4/orchestration/test_human_approval_manager.py +++ b/src/tests/backend/v4/orchestration/test_human_approval_manager.py @@ -7,7 +7,6 @@ import os import sys import unittest -from typing import Optional from unittest.mock import Mock, AsyncMock, patch # Add the backend directory to the Python path From d69b7fc360ef628bce63fbd1d0f251b9b61593eb Mon Sep 17 00:00:00 2001 From: Kingshuk-Microsoft Date: Tue, 10 Feb 2026 13:56:07 +0530 Subject: [PATCH 008/225] refactor: remove unused imports from test files for improved code quality --- src/tests/backend/v4/common/services/test_mcp_service.py | 2 +- src/tests/backend/v4/common/services/test_plan_service.py | 2 +- src/tests/backend/v4/magentic_agents/test_proxy_agent.py | 2 +- .../backend/v4/orchestration/test_orchestration_manager.py | 1 - 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/tests/backend/v4/common/services/test_mcp_service.py b/src/tests/backend/v4/common/services/test_mcp_service.py index 4b1f43270..04e0844d8 100644 --- a/src/tests/backend/v4/common/services/test_mcp_service.py +++ b/src/tests/backend/v4/common/services/test_mcp_service.py @@ -15,7 +15,7 @@ import asyncio import importlib.util from unittest.mock import patch, MagicMock -from aiohttp import ClientTimeout, ClientError +from aiohttp import ClientError # Add the src directory to sys.path for proper import src_path = os.path.join(os.path.dirname(__file__), '..', '..', '..', '..') diff --git a/src/tests/backend/v4/common/services/test_plan_service.py b/src/tests/backend/v4/common/services/test_plan_service.py index a1985f86f..455200af7 100644 --- a/src/tests/backend/v4/common/services/test_plan_service.py +++ b/src/tests/backend/v4/common/services/test_plan_service.py @@ -18,7 +18,7 @@ import logging import importlib.util from unittest.mock import patch, MagicMock, AsyncMock -from typing import Any, Optional, List +from typing import Any, List from dataclasses import dataclass # Add the src directory to sys.path for proper import diff --git a/src/tests/backend/v4/magentic_agents/test_proxy_agent.py b/src/tests/backend/v4/magentic_agents/test_proxy_agent.py index 48dd63dce..ca734df44 100644 --- a/src/tests/backend/v4/magentic_agents/test_proxy_agent.py +++ b/src/tests/backend/v4/magentic_agents/test_proxy_agent.py @@ -57,7 +57,7 @@ # Now import the module under test -from backend.v4.magentic_agents.proxy_agent import create_proxy_agent +import backend.v4.magentic_agents.proxy_agent class TestProxyAgentComplexScenarios: diff --git a/src/tests/backend/v4/orchestration/test_orchestration_manager.py b/src/tests/backend/v4/orchestration/test_orchestration_manager.py index f4163a903..dbc0d1fbc 100644 --- a/src/tests/backend/v4/orchestration/test_orchestration_manager.py +++ b/src/tests/backend/v4/orchestration/test_orchestration_manager.py @@ -7,7 +7,6 @@ import logging import os import sys -from typing import List from unittest import IsolatedAsyncioTestCase from unittest.mock import AsyncMock, Mock, patch From 124fcf7f1cf773282996a3b4086574ad286b9781 Mon Sep 17 00:00:00 2001 From: Abdul-Microsoft Date: Tue, 10 Feb 2026 17:34:41 +0530 Subject: [PATCH 009/225] Enhance agent orchestration and configuration for Azure AI Search integration --- src/backend/v4/api/router.py | 11 ++ .../v4/magentic_agents/common/lifecycle.py | 43 +++-- .../v4/magentic_agents/foundry_agent.py | 150 ++++++++++-------- .../v4/magentic_agents/models/agent_models.py | 6 +- .../v4/orchestration/orchestration_manager.py | 11 +- 5 files changed, 144 insertions(+), 77 deletions(-) diff --git a/src/backend/v4/api/router.py b/src/backend/v4/api/router.py index 43f3f9f2f..d9a8e7c10 100644 --- a/src/backend/v4/api/router.py +++ b/src/backend/v4/api/router.py @@ -303,6 +303,17 @@ async def process_request( ) await memory_store.add_plan(plan) + # Ensure orchestration is initialized before running + # Force rebuild for each new task since Magentic workflows cannot be reused after completion + team_service = TeamService(memory_store) + await OrchestrationManager.get_current_or_new_orchestration( + user_id=user_id, + team_config=team, + team_switched=False, + team_service=team_service, + force_rebuild=True, # Always rebuild workflow for new tasks + ) + track_event_if_configured( "PlanCreated", { diff --git a/src/backend/v4/magentic_agents/common/lifecycle.py b/src/backend/v4/magentic_agents/common/lifecycle.py index 88fde549b..e45d733dc 100644 --- a/src/backend/v4/magentic_agents/common/lifecycle.py +++ b/src/backend/v4/magentic_agents/common/lifecycle.py @@ -51,7 +51,7 @@ def __init__( self._agent: ChatAgent | None = None self.team_service: TeamService | None = team_service self.team_config: TeamConfiguration | None = team_config - self.client: Optional[AzureAIClient] = None + self.client: Optional[AgentsClient] = None self.project_endpoint = project_endpoint self.creds: Optional[DefaultAzureCredential] = None self.memory_store: Optional[DatabaseBase] = memory_store @@ -228,7 +228,25 @@ def get_agent_id(self, chat_client) -> str: return id async def get_database_team_agent(self) -> Optional[AzureAIClient]: - """Retrieve existing team agent from database, if any.""" + """Retrieve existing team agent from database, if any. + + NOTE: Agent reuse is currently DISABLED to ensure fresh agents are created + with the correct Azure AI Search configuration. + This prevents issues with stale agents that may not have the search tool configured. + + To re-enable agent reuse, set ENABLE_AGENT_REUSE=true in environment. + """ + import os + + # DISABLED: Always create fresh agents to ensure Azure AI Search tool is configured + enable_reuse = os.environ.get("ENABLE_AGENT_REUSE", "false").lower() == "true" + if not enable_reuse: + self.logger.info( + "Agent reuse DISABLED: Creating fresh agent with search tools (agent_name=%s)", + self.agent_name, + ) + return None + chat_client = None try: agent_id = await get_database_team_agent_id( @@ -251,15 +269,15 @@ async def get_database_team_agent(self) -> Optional[AzureAIClient]: ) return None - # Create client with resolved ID, preferring project_client for RAI agents + # Create client with resolved ID if self.agent_name == "RAIAgent" and self.project_client: chat_client = AzureAIClient( - project_client=self.project_client, + project_endpoint=self.project_endpoint, agent_id=resolved, credential=self.creds, ) self.logger.info( - "RAI.AgentReuseSuccess: Created AzureAIClient via Projects SDK (id=%s)", + "RAI.AgentReuseSuccess: Created AzureAIClient (id=%s)", resolved, ) else: @@ -284,17 +302,20 @@ async def get_database_team_agent(self) -> Optional[AzureAIClient]: async def save_database_team_agent(self) -> None: """Save current team agent to database (only if truly new or changed).""" try: - if self._agent.id is None: - self.logger.error("Cannot save database team agent: agent_id is None") + if self._agent is None or self._agent.id is None: + self.logger.error("Cannot save database team agent: agent or agent_id is None") return + # Use the agent ID from ChatAgent (set during creation) + agent_id = self._agent.id + # Check if stored ID matches current ID stored_id = await get_database_team_agent_id( self.memory_store, self.team_config, self.agent_name ) - if stored_id == self._agent.chat_client.agent_id: + if stored_id == agent_id: self.logger.info( - "RAI reuse: id unchanged (id=%s); skip save.", self._agent.id + "RAI reuse: id unchanged (id=%s); skip save.", agent_id ) return @@ -302,7 +323,7 @@ async def save_database_team_agent(self) -> None: team_id=self.team_config.team_id, team_name=self.team_config.name, agent_name=self.agent_name, - agent_foundry_id=self._agent.chat_client.agent_id, + agent_foundry_id=agent_id, agent_description=self.agent_description, agent_instructions=self.agent_instructions, ) @@ -310,7 +331,7 @@ async def save_database_team_agent(self) -> None: self.logger.info( "Saved team agent to database (agent_name=%s, id=%s)", self.agent_name, - self._agent.id, + agent_id, ) except Exception as ex: diff --git a/src/backend/v4/magentic_agents/foundry_agent.py b/src/backend/v4/magentic_agents/foundry_agent.py index 9a7c8ebe8..d706af865 100644 --- a/src/backend/v4/magentic_agents/foundry_agent.py +++ b/src/backend/v4/magentic_agents/foundry_agent.py @@ -7,7 +7,12 @@ Role) from agent_framework_azure_ai import \ AzureAIClient # Provided by agent_framework -from azure.ai.projects.models import ConnectionType +from azure.ai.projects.models import ( + PromptAgentDefinition, + AzureAISearchAgentTool, + AzureAISearchToolResource, + AISearchIndexResource, +) from common.config.app_config import config from common.database.database_base import DatabaseBase from common.models.messages_af import TeamConfiguration @@ -65,19 +70,23 @@ def __init__( self._use_azure_search = self._is_azure_search_requested() self.use_reasoning = use_reasoning - # Placeholder for server-created Azure AI agent id (if Azure Search path) + # Placeholder for server-created Azure AI agent id/version (if Azure Search path) self._azure_server_agent_id: Optional[str] = None + self._azure_server_agent_version: Optional[str] = None # ------------------------- # Mode detection # ------------------------- def _is_azure_search_requested(self) -> bool: """Determine if Azure AI Search raw tool path should be used.""" + print(f"[DEBUG _is_azure_search_requested] Agent={self.agent_name}, search={self.search}") if not self.search: + print(f"[DEBUG _is_azure_search_requested] Agent={self.agent_name}: No search config, returning False") return False # Minimal heuristic: presence of required attributes has_index = hasattr(self.search, "index_name") and bool(self.search.index_name) + print(f"[DEBUG _is_azure_search_requested] Agent={self.agent_name}: has_index={has_index}, index_name={getattr(self.search, 'index_name', None)}") if has_index: self.logger.info( "Azure AI Search requested (connection_id=%s, index=%s).", @@ -113,14 +122,17 @@ async def _collect_tools(self) -> List: # ------------------------- async def _create_azure_search_enabled_client(self, chatClient=None) -> Optional[AzureAIClient]: """ - Create a server-side Azure AI agent with Azure AI Search raw tool. + Create a server-side Azure AI agent with Azure AI Search tool using create_version. + + This uses the AIProjectClient.agents.create_version() approach with: + - PromptAgentDefinition for agent configuration + - AzureAISearchAgentTool with AzureAISearchToolResource for search capability + - AISearchIndexResource for index configuration with project_connection_id Requirements: - - An Azure AI Project Connection (type=AZURE_AI_SEARCH) that contains either: - a) API key + endpoint, OR - b) Managed Identity (RBAC enabled on the Search service with Search Service Contributor + Search Index Data Reader). + - An Azure AI Project Connection for Azure AI Search - search_config.index_name must exist in the Search service. - + - search_config.connection_name should match the AI Project connection name Returns: AzureAIClient | None @@ -134,9 +146,16 @@ async def _create_azure_search_enabled_client(self, chatClient=None) -> Optional self.logger.error("Search configuration missing.") return None - desired_connection_name = getattr(self.search, "connection_name", None) + # Get connection name - this is used as project_connection_id in create_version + connection_name = getattr(self.search, "connection_name", None) + if not connection_name: + # Fallback to environment variable + connection_name = config.AZURE_AI_SEARCH_CONNECTION_NAME + self.logger.info("Using connection_name from environment: %s", connection_name) + index_name = getattr(self.search, "index_name", "") query_type = getattr(self.search, "search_query_type", "simple") + top_k = getattr(self.search, "top_k", 5) if not index_name: self.logger.error( @@ -144,82 +163,89 @@ async def _create_azure_search_enabled_client(self, chatClient=None) -> Optional ) return None - resolved_connection_id = None - - try: - async for connection in self.project_client.connections.list(): - if connection.type == ConnectionType.AZURE_AI_SEARCH: - - if ( - desired_connection_name - and connection.name == desired_connection_name - ): - resolved_connection_id = connection.id - break - # Fallback: if no specific connection requested and none resolved yet, take the first - if not desired_connection_name and not resolved_connection_id: - resolved_connection_id = connection.id - # Do not break yet; we log but allow chance to find a name match later. If not, this stays. - - if not resolved_connection_id: - self.logger.error( - "No Azure AI Search connection resolved. " "connection_name=%s", - desired_connection_name, - ) - # return None - - self.logger.info( - "Using Azure AI Search connection (id=%s, requested_name=%s).", - resolved_connection_id, - desired_connection_name, + if not connection_name: + self.logger.error( + "connection_name not provided; aborting Azure Search path." ) - except Exception as ex: - self.logger.error("Failed to enumerate connections: %s", ex) return None - # Create agent with raw tool + self.logger.info( + "Creating Azure AI Search agent with create_version: connection_name=%s, index=%s, query_type=%s, top_k=%s", + connection_name, + index_name, + query_type, + top_k, + ) + + # Create agent using create_version with PromptAgentDefinition and AzureAISearchAgentTool + # This approach matches the Knowledge Mining Solution Accelerator pattern try: - azure_agent = await self.client.create_agent( - model=self.model_deployment_name, - name=self.agent_name, - instructions=( - f"{self.agent_instructions} " - "Always use the Azure AI Search tool and configured index for knowledge retrieval." + enhanced_instructions = ( + f"{self.agent_instructions} " + "Always use the Azure AI Search tool and configured index for knowledge retrieval." + ) + + print(f"[DEBUG] Creating agent '{self.agent_name}' with instructions (first 200 chars): {enhanced_instructions[:200]}...") + print(f"[DEBUG] Agent model: {self.model_deployment_name}") + print(f"[DEBUG] Search config: connection={connection_name}, index={index_name}, query_type={query_type}, top_k={top_k}") + + azure_agent = await self.project_client.agents.create_version( + agent_name=self.agent_name, + definition=PromptAgentDefinition( + model=self.model_deployment_name, + instructions=enhanced_instructions, + tools=[ + AzureAISearchAgentTool( + azure_ai_search=AzureAISearchToolResource( + indexes=[ + AISearchIndexResource( + project_connection_id=connection_name, + index_name=index_name, + query_type=query_type, + top_k=top_k, + ) + ] + ) + ) + ], ), - tools=[{"type": "azure_ai_search"}], - tool_resources={ - "azure_ai_search": { - "indexes": [ - { - "index_connection_id": resolved_connection_id, - "index_name": index_name, - "query_type": query_type, - } - ] - } - }, ) + self._azure_server_agent_id = azure_agent.id + self._azure_server_agent_version = azure_agent.version self.logger.info( - "Created Azure server agent with Azure AI Search tool (agent_id=%s, index=%s, query_type=%s).", + "Created Azure AI Search agent via create_version (name=%s, id=%s, version=%s, connection=%s, index=%s, query_type=%s, top_k=%s).", + azure_agent.name, azure_agent.id, + azure_agent.version, + connection_name, index_name, query_type, + top_k, ) + print(f"[DEBUG] Created agent via create_version: name={azure_agent.name}, id={azure_agent.id}, version={azure_agent.version}") + print(f"[DEBUG] Agent definition: {azure_agent.definition}") + print(f"[DEBUG] Agent instructions from definition: {getattr(azure_agent.definition, 'instructions', 'N/A')}") + # Wrap in AzureAIClient using agent_name and agent_version (NOT agent_id) + # AzureAIClient constructor: agent_name, agent_version, project_endpoint, credential chat_client = AzureAIClient( - project_client=self.project_client, - agent_id=azure_agent.id, + project_endpoint=self.project_endpoint, + agent_name=azure_agent.name, + agent_version=azure_agent.version, # Use the specific version we just created credential=self.creds, ) return chat_client + except Exception as ex: self.logger.error( - "Failed to create Azure Search enabled agent (connection_id=%s, index=%s): %s", - resolved_connection_id, + "Failed to create Azure Search enabled agent via create_version (connection=%s, index=%s): %s", + connection_name, index_name, ex, ) + import traceback + traceback.print_exc() return None # ------------------------- diff --git a/src/backend/v4/magentic_agents/models/agent_models.py b/src/backend/v4/magentic_agents/models/agent_models.py index 5c6a3f2f1..4e10270fa 100644 --- a/src/backend/v4/magentic_agents/models/agent_models.py +++ b/src/backend/v4/magentic_agents/models/agent_models.py @@ -43,6 +43,8 @@ class SearchConfig: connection_name: str | None = None endpoint: str | None = None index_name: str | None = None + search_query_type: str = "simple" # Options: "simple", "vector_simple", "vector", "semantic", "hybrid" + top_k: int = 5 # Number of results to return @classmethod def from_env(cls, index_name: str) -> "SearchConfig": @@ -58,5 +60,7 @@ def from_env(cls, index_name: str) -> "SearchConfig": return cls( connection_name=connection_name, endpoint=endpoint, - index_name=index_name + index_name=index_name, + search_query_type="simple", # Use simple query type (keyword search) + top_k=5 ) diff --git a/src/backend/v4/orchestration/orchestration_manager.py b/src/backend/v4/orchestration/orchestration_manager.py index 4fc0c209a..5a27c59b0 100644 --- a/src/backend/v4/orchestration/orchestration_manager.py +++ b/src/backend/v4/orchestration/orchestration_manager.py @@ -231,17 +231,22 @@ async def get_current_or_new_orchestration( team_config: TeamConfiguration, team_switched: bool, team_service: TeamService = None, + force_rebuild: bool = False, ): """ Return an existing workflow for the user or create a new one if: - None exists - Team switched flag is True + - force_rebuild is True (for new tasks after workflow completion) """ current = orchestration_config.get_current_orchestration(user_id) - if current is None or team_switched: - if current is not None and team_switched: + needs_rebuild = current is None or team_switched or force_rebuild + + if needs_rebuild: + if current is not None and (team_switched or force_rebuild): + reason = "team switched" if team_switched else "force rebuild for new task" cls.logger.info( - "Team switched, closing previous agents for user '%s'", user_id + "Rebuilding orchestration for user '%s' (reason: %s)", user_id, reason ) # Close prior agents (same logic as old version) for agent in getattr(current, "_participants", {}).values(): From 1bc5725bd4e0015cc42ebcd13242495b84edef15 Mon Sep 17 00:00:00 2001 From: Abdul-Microsoft Date: Wed, 11 Feb 2026 17:45:02 +0530 Subject: [PATCH 010/225] fix for agent multiple times calling --- .../v4/magentic_agents/foundry_agent.py | 18 ++++------ .../magentic_agents/magentic_agent_factory.py | 1 + .../orchestration/human_approval_manager.py | 20 ++++++++++- .../v4/orchestration/orchestration_manager.py | 34 +++++++++++++++---- 4 files changed, 54 insertions(+), 19 deletions(-) diff --git a/src/backend/v4/magentic_agents/foundry_agent.py b/src/backend/v4/magentic_agents/foundry_agent.py index d706af865..84297ebef 100644 --- a/src/backend/v4/magentic_agents/foundry_agent.py +++ b/src/backend/v4/magentic_agents/foundry_agent.py @@ -185,12 +185,12 @@ async def _create_azure_search_enabled_client(self, chatClient=None) -> Optional "Always use the Azure AI Search tool and configured index for knowledge retrieval." ) - print(f"[DEBUG] Creating agent '{self.agent_name}' with instructions (first 200 chars): {enhanced_instructions[:200]}...") - print(f"[DEBUG] Agent model: {self.model_deployment_name}") - print(f"[DEBUG] Search config: connection={connection_name}, index={index_name}, query_type={query_type}, top_k={top_k}") + print(f"[AGENT CREATE] 🆕 Creating agent in Foundry: '{self.agent_name}'", flush=True) + print(f"[AGENT CREATE] Model: {self.model_deployment_name}", flush=True) + print(f"[AGENT CREATE] Search: connection={connection_name}, index={index_name}", flush=True) azure_agent = await self.project_client.agents.create_version( - agent_name=self.agent_name, + agent_name=self.agent_name, # Use original name definition=PromptAgentDefinition( model=self.model_deployment_name, instructions=enhanced_instructions, @@ -213,19 +213,13 @@ async def _create_azure_search_enabled_client(self, chatClient=None) -> Optional self._azure_server_agent_id = azure_agent.id self._azure_server_agent_version = azure_agent.version + print(f"[AGENT CREATE] ✅ Created agent: name={azure_agent.name}, id={azure_agent.id}, version={azure_agent.version}", flush=True) self.logger.info( - "Created Azure AI Search agent via create_version (name=%s, id=%s, version=%s, connection=%s, index=%s, query_type=%s, top_k=%s).", + "Created Azure AI Search agent via create_version (name=%s, id=%s, version=%s).", azure_agent.name, azure_agent.id, azure_agent.version, - connection_name, - index_name, - query_type, - top_k, ) - print(f"[DEBUG] Created agent via create_version: name={azure_agent.name}, id={azure_agent.id}, version={azure_agent.version}") - print(f"[DEBUG] Agent definition: {azure_agent.definition}") - print(f"[DEBUG] Agent instructions from definition: {getattr(azure_agent.definition, 'instructions', 'N/A')}") # Wrap in AzureAIClient using agent_name and agent_version (NOT agent_id) # AzureAIClient constructor: agent_name, agent_version, project_endpoint, credential diff --git a/src/backend/v4/magentic_agents/magentic_agent_factory.py b/src/backend/v4/magentic_agents/magentic_agent_factory.py index 36544166d..3eafb5831 100644 --- a/src/backend/v4/magentic_agents/magentic_agent_factory.py +++ b/src/backend/v4/magentic_agents/magentic_agent_factory.py @@ -115,6 +115,7 @@ async def create_agent_from_config( index_name, "Reasoning" if use_reasoning else "Foundry", ) + print(f"[FACTORY] 🆕 Creating NEW agent: {agent_obj.name} (id={id(agent_obj)})", flush=True) agent = FoundryAgentTemplate( agent_name=agent_obj.name, diff --git a/src/backend/v4/orchestration/human_approval_manager.py b/src/backend/v4/orchestration/human_approval_manager.py index 654d72a23..39089247a 100644 --- a/src/backend/v4/orchestration/human_approval_manager.py +++ b/src/backend/v4/orchestration/human_approval_manager.py @@ -33,6 +33,7 @@ class HumanApprovalMagenticManager(StandardMagenticManager): approval_enabled: bool = True magentic_plan: Optional[MPlan] = None current_user_id: str # populated in __init__ + _called_agents: set # Track which agents have been called def __init__(self, user_id: str, agent, *args, **kwargs): """ @@ -43,6 +44,9 @@ def __init__(self, user_id: str, agent, *args, **kwargs): *args: Additional positional arguments for the parent StandardMagenticManager. **kwargs: Additional keyword arguments for the parent StandardMagenticManager. """ + + # Initialize called agents tracker + self._called_agents = set() plan_append = """ @@ -55,6 +59,9 @@ def __init__(self, user_id: str, agent, *args, **kwargs): to be taken. If a step involves multiple actions, separate them into distinct steps with an agent included in each step. If the step is taken by an agent that is not part of the team, such as the MagenticManager, please always list the MagenticManager as the agent for that step. At any time, if more information is needed from the user, use the ProxyAgent to request this information. +CRITICAL: Each agent should only be called ONCE to perform their task. Do NOT call the same agent multiple times. +After an agent has provided their response, move on to the next agent in the plan. + Here is an example of a well-structured plan: - **EnhancedResearchAgent** to gather authoritative data on the latest industry trends and best practices in employee onboarding - **EnhancedResearchAgent** to gather authoritative data on Innovative onboarding techniques that enhance new hire engagement and retention. @@ -62,6 +69,13 @@ def __init__(self, user_id: str, agent, *args, **kwargs): - **DocumentCreationAgent** to draft a comprehensive onboarding plan that includes a checklist of resources and materials needed for effective onboarding. - **ProxyAgent** to review the drafted onboarding plan for clarity and completeness. - **MagenticManager** to finalize the onboarding plan and prepare it for presentation to stakeholders. +""" + + # Add progress ledger prompt to prevent re-calling agents + progress_append = """ +CRITICAL RULE: DO NOT call the same agent more than once unless absolutely necessary. +If an agent has already provided a response, consider their task COMPLETE and move to the next agent. +Only re-call an agent if their previous response was explicitly an error or failure. """ final_append = """ @@ -75,6 +89,10 @@ def __init__(self, user_id: str, agent, *args, **kwargs): ORCHESTRATOR_TASK_LEDGER_PLAN_UPDATE_PROMPT + plan_append ) kwargs["final_answer_prompt"] = ORCHESTRATOR_FINAL_ANSWER_PROMPT + final_append + + # Override progress ledger prompt to discourage re-calling agents + from agent_framework._workflows._magentic import ORCHESTRATOR_PROGRESS_LEDGER_PROMPT + kwargs["progress_ledger_prompt"] = ORCHESTRATOR_PROGRESS_LEDGER_PROMPT + progress_append self.current_user_id = user_id # New API: StandardMagenticManager takes agent as first positional argument @@ -305,4 +323,4 @@ def plan_to_obj(self, magentic_context: MagenticContext, ledger) -> MPlan: task=task_text, ) - return return_plan + return return_plan \ No newline at end of file diff --git a/src/backend/v4/orchestration/orchestration_manager.py b/src/backend/v4/orchestration/orchestration_manager.py index 5a27c59b0..58fc507e1 100644 --- a/src/backend/v4/orchestration/orchestration_manager.py +++ b/src/backend/v4/orchestration/orchestration_manager.py @@ -197,17 +197,19 @@ async def init_orchestration( # Assemble workflow with callback storage = InMemoryCheckpointStorage() - # New API: .participants() accepts a list of agents + # New SDK: participants() accepts a Sequence (list) of agents + # The orchestrator uses agent.name to identify them participant_list = list(participants.values()) + cls.logger.info("Participants for workflow: %s", list(participants.keys())) + print(f"[DEBUG] Participants for workflow: {list(participants.keys())}", flush=True) builder = ( MagenticBuilder() - .participants(participant_list) + .participants(participant_list) # New SDK: pass as list .with_manager( manager=manager, # Pass manager instance (extends StandardMagenticManager) max_round_count=orchestration_config.max_rounds, - max_stall_count=3, - max_reset_count=2, + max_stall_count=0, # CRITICAL: Prevent re-calling agents when stalled (default is 3!) ) .with_checkpointing(storage) ) @@ -381,12 +383,16 @@ async def run_orchestration(self, user_id: str, input_task) -> None: task_text = getattr(input_task, "description", str(input_task)) self.logger.debug("Task: %s", task_text) + # Track how many times each agent is called (for debugging duplicate calls) + agent_call_counts: dict = {} + try: # Execute workflow using run_stream with task as positional parameter # The execution settings are configured in the manager/client final_output: str | None = None self.logger.info("Starting workflow execution...") + print(f"[ORCHESTRATOR] 🚀 Starting workflow with max_rounds={orchestration_config.max_rounds}", flush=True) last_message_id: str | None = None async for event in workflow.run_stream(task_text): try: @@ -431,11 +437,20 @@ async def run_orchestration(self, user_id: str, input_task) -> None: # Handle group chat request sent elif isinstance(event, GroupChatRequestSentEvent): + agent_name = event.participant_name + agent_call_counts[agent_name] = agent_call_counts.get(agent_name, 0) + 1 + call_num = agent_call_counts[agent_name] + self.logger.info( - "[REQUEST SENT (round %d)] to agent: %s", + "[REQUEST SENT (round %d)] to agent: %s (call #%d)", event.round_index, - event.participant_name + agent_name, + call_num ) + print(f"[ORCHESTRATOR] 📤 REQUEST SENT round={event.round_index} to agent={agent_name} (call #{call_num})", flush=True) + + if call_num > 1: + print(f"[ORCHESTRATOR] ⚠️ WARNING: Agent '{agent_name}' called {call_num} times!", flush=True) # Handle group chat response received - THIS IS WHERE AGENT RESPONSES COME elif isinstance(event, GroupChatResponseReceivedEvent): @@ -496,6 +511,13 @@ async def run_orchestration(self, user_id: str, input_task) -> None: # Extract final result final_text = final_output if final_output else "" + # Log agent call summary + print(f"\n[ORCHESTRATOR] 📊 AGENT CALL SUMMARY:", flush=True) + for agent_name, count in agent_call_counts.items(): + status = "✅" if count == 1 else "⚠️ DUPLICATE" + print(f" {status} {agent_name}: called {count} time(s)", flush=True) + self.logger.info("Agent call counts: %s", agent_call_counts) + # Log results self.logger.info("\nAgent responses:") self.logger.info( From 45582e15fedbfb6e850a554329800b138ebe4272 Mon Sep 17 00:00:00 2001 From: Abdul-Microsoft Date: Fri, 13 Feb 2026 09:15:56 +0530 Subject: [PATCH 011/225] Enhance get_chat_client to use latest agent version and log agent name --- src/backend/v4/magentic_agents/common/lifecycle.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/backend/v4/magentic_agents/common/lifecycle.py b/src/backend/v4/magentic_agents/common/lifecycle.py index e45d733dc..af9dcb846 100644 --- a/src/backend/v4/magentic_agents/common/lifecycle.py +++ b/src/backend/v4/magentic_agents/common/lifecycle.py @@ -149,7 +149,10 @@ async def _after_open(self) -> None: raise NotImplementedError def get_chat_client(self, chat_client) -> AzureAIClient: - """Return the underlying ChatClientProtocol (AzureAIClient).""" + """Return the underlying ChatClientProtocol (AzureAIClient). + + Uses agent_name with use_latest_version=True to get the latest agent version + """ if chat_client: return chat_client if ( @@ -159,11 +162,14 @@ def get_chat_client(self, chat_client) -> AzureAIClient: return self._agent.chat_client # type: ignore chat_client = AzureAIClient( project_endpoint=self.project_endpoint, + agent_name=self.agent_name, model_deployment_name=self.model_deployment_name, credential=self.creds, + use_latest_version=True, ) self.logger.info( - "Created new AzureAIClient for get chat client", + "Created new AzureAIClient (agent_name=%s, use_latest_version=True)", + self.agent_name, ) return chat_client From 3a4dfbb3bf0e2a0bab58968f0c0000fa46c13423 Mon Sep 17 00:00:00 2001 From: Abdul-Microsoft Date: Fri, 13 Feb 2026 11:36:18 +0530 Subject: [PATCH 012/225] Update dependency versions in pyproject.toml and uv.lock for consistency --- src/backend/pyproject.toml | 18 +++++++++--------- src/backend/uv.lock | 18 +++++++++--------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/backend/pyproject.toml b/src/backend/pyproject.toml index 7750638dd..f5bd8fc6f 100644 --- a/src/backend/pyproject.toml +++ b/src/backend/pyproject.toml @@ -11,16 +11,16 @@ dependencies = [ "azure-cosmos==4.9.0", "azure-identity==1.24.0", "azure-monitor-events-extension==0.1.0", - "azure-monitor-opentelemetry>=1.8.0", + "azure-monitor-opentelemetry==1.8.5", "azure-search-documents==11.5.3", "fastapi==0.116.1", - "openai>=2.8.0", - "opentelemetry-api>=1.39.0", - "opentelemetry-exporter-otlp-proto-grpc>=1.39.0", - "opentelemetry-exporter-otlp-proto-http>=1.39.0", - "opentelemetry-instrumentation-fastapi>=0.57b0", - "opentelemetry-instrumentation-openai>=0.46.2", - "opentelemetry-sdk>=1.39.0", + "openai==2.16.0", + "opentelemetry-api==1.39.0", + "opentelemetry-exporter-otlp-proto-grpc==1.39.0", + "opentelemetry-exporter-otlp-proto-http==1.39.0", + "opentelemetry-instrumentation-fastapi==0.60b0", + "opentelemetry-instrumentation-openai==0.46.2", + "opentelemetry-sdk==1.39.0", "pytest==8.4.1", "pytest-asyncio==0.24.0", "pytest-cov==5.0.0", @@ -30,7 +30,7 @@ dependencies = [ "uvicorn==0.35.0", "pylint-pydantic==0.3.5", "pexpect==4.9.0", - "mcp>=1.24.0,<2", + "mcp==1.26.0", "agent-framework-azure-ai==1.0.0b260130", "agent-framework-core==1.0.0b260130" ] \ No newline at end of file diff --git a/src/backend/uv.lock b/src/backend/uv.lock index 526fe789a..3e7bbae7e 100644 --- a/src/backend/uv.lock +++ b/src/backend/uv.lock @@ -557,17 +557,17 @@ requires-dist = [ { name = "azure-cosmos", specifier = "==4.9.0" }, { name = "azure-identity", specifier = "==1.24.0" }, { name = "azure-monitor-events-extension", specifier = "==0.1.0" }, - { name = "azure-monitor-opentelemetry", specifier = ">=1.8.0" }, + { name = "azure-monitor-opentelemetry", specifier = "==1.8.5" }, { name = "azure-search-documents", specifier = "==11.5.3" }, { name = "fastapi", specifier = "==0.116.1" }, - { name = "mcp", specifier = ">=1.24.0,<2" }, - { name = "openai", specifier = ">=2.8.0" }, - { name = "opentelemetry-api", specifier = ">=1.39.0" }, - { name = "opentelemetry-exporter-otlp-proto-grpc", specifier = ">=1.39.0" }, - { name = "opentelemetry-exporter-otlp-proto-http", specifier = ">=1.39.0" }, - { name = "opentelemetry-instrumentation-fastapi", specifier = ">=0.57b0" }, - { name = "opentelemetry-instrumentation-openai", specifier = ">=0.46.2" }, - { name = "opentelemetry-sdk", specifier = ">=1.39.0" }, + { name = "mcp", specifier = "==1.26.0" }, + { name = "openai", specifier = "==2.16.0" }, + { name = "opentelemetry-api", specifier = "==1.39.0" }, + { name = "opentelemetry-exporter-otlp-proto-grpc", specifier = "==1.39.0" }, + { name = "opentelemetry-exporter-otlp-proto-http", specifier = "==1.39.0" }, + { name = "opentelemetry-instrumentation-fastapi", specifier = "==0.60b0" }, + { name = "opentelemetry-instrumentation-openai", specifier = "==0.46.2" }, + { name = "opentelemetry-sdk", specifier = "==1.39.0" }, { name = "pexpect", specifier = "==4.9.0" }, { name = "pylint-pydantic", specifier = "==0.3.5" }, { name = "pytest", specifier = "==8.4.1" }, From c513f4bde39bc162312a31fbb21b349df010d640 Mon Sep 17 00:00:00 2001 From: Abdul-Microsoft Date: Fri, 13 Feb 2026 17:14:32 +0530 Subject: [PATCH 013/225] Add user state cleanup and enhance AzureAIClient initialization with deployment name fallback --- src/backend/v4/config/settings.py | 20 ++++++ .../v4/magentic_agents/common/lifecycle.py | 15 ++++- .../v4/magentic_agents/foundry_agent.py | 4 +- .../v4/orchestration/orchestration_manager.py | 65 +++++++++---------- 4 files changed, 64 insertions(+), 40 deletions(-) diff --git a/src/backend/v4/config/settings.py b/src/backend/v4/config/settings.py index fa112fcd9..2a9687272 100644 --- a/src/backend/v4/config/settings.py +++ b/src/backend/v4/config/settings.py @@ -220,6 +220,26 @@ def cleanup_clarification(self, request_id: str) -> None: self.clarifications.pop(request_id, None) self._clarification_events.pop(request_id, None) + def cleanup_user_state(self, user_id: str) -> None: + """Clean up all state for a user to prevent cross-scenario leakage. + + This removes any pending approvals, clarifications, and plans + associated with the user to ensure fresh state for new runs. + """ + # Clean up any plans associated with this user + plans_to_remove = [ + plan_id for plan_id, plan in self.plans.items() + if getattr(plan, 'user_id', None) == user_id + ] + for plan_id in plans_to_remove: + self.plans.pop(plan_id, None) + self.cleanup_approval(plan_id) + + # Clean up any pending approvals/clarifications for this user + # Note: We can't easily map approvals to users without plan context, + # so this primarily clears the plans and their associated approvals + logger.debug("Cleaned up state for user %s (removed %d plans)", user_id, len(plans_to_remove)) + class ConnectionConfig: """Connection manager for WebSocket connections.""" diff --git a/src/backend/v4/magentic_agents/common/lifecycle.py b/src/backend/v4/magentic_agents/common/lifecycle.py index af9dcb846..c143d0c45 100644 --- a/src/backend/v4/magentic_agents/common/lifecycle.py +++ b/src/backend/v4/magentic_agents/common/lifecycle.py @@ -14,6 +14,7 @@ from agent_framework_azure_ai import AzureAIClient from azure.ai.agents.aio import AgentsClient from azure.identity.aio import DefaultAzureCredential +from common.config.app_config import config from common.database.database_base import DatabaseBase from common.models.messages_af import CurrentTeamAgent, TeamConfiguration from common.utils.utils_agents import ( @@ -160,10 +161,12 @@ def get_chat_client(self, chat_client) -> AzureAIClient: and self._agent.chat_client ): return self._agent.chat_client # type: ignore + # Use model_deployment_name with fallback to default model if empty + deployment_name = self.model_deployment_name or config.AZURE_OPENAI_DEPLOYMENT_NAME chat_client = AzureAIClient( project_endpoint=self.project_endpoint, agent_name=self.agent_name, - model_deployment_name=self.model_deployment_name, + model_deployment_name=deployment_name, credential=self.creds, use_latest_version=True, ) @@ -277,20 +280,26 @@ async def get_database_team_agent(self) -> Optional[AzureAIClient]: # Create client with resolved ID if self.agent_name == "RAIAgent" and self.project_client: + # Use RAI deployment name for RAI agents + rai_deployment = config.AZURE_OPENAI_RAI_DEPLOYMENT_NAME chat_client = AzureAIClient( project_endpoint=self.project_endpoint, agent_id=resolved, + model_deployment_name=rai_deployment, credential=self.creds, ) self.logger.info( - "RAI.AgentReuseSuccess: Created AzureAIClient (id=%s)", + "RAI.AgentReuseSuccess: Created AzureAIClient (id=%s, model=%s)", resolved, + rai_deployment, ) else: + # Use model_deployment_name with fallback to default model if empty + deployment_name = self.model_deployment_name or config.AZURE_OPENAI_DEPLOYMENT_NAME chat_client = AzureAIClient( project_endpoint=self.project_endpoint, agent_id=resolved, - model_deployment_name=self.model_deployment_name, + model_deployment_name=deployment_name, credential=self.creds, ) self.logger.info( diff --git a/src/backend/v4/magentic_agents/foundry_agent.py b/src/backend/v4/magentic_agents/foundry_agent.py index 84297ebef..3a95ea210 100644 --- a/src/backend/v4/magentic_agents/foundry_agent.py +++ b/src/backend/v4/magentic_agents/foundry_agent.py @@ -222,11 +222,13 @@ async def _create_azure_search_enabled_client(self, chatClient=None) -> Optional ) # Wrap in AzureAIClient using agent_name and agent_version (NOT agent_id) - # AzureAIClient constructor: agent_name, agent_version, project_endpoint, credential + # Include model_deployment_name to ensure SDK has model info for streaming + deployment_name = self.model_deployment_name or config.AZURE_OPENAI_DEPLOYMENT_NAME chat_client = AzureAIClient( project_endpoint=self.project_endpoint, agent_name=azure_agent.name, agent_version=azure_agent.version, # Use the specific version we just created + model_deployment_name=deployment_name, credential=self.creds, ) return chat_client diff --git a/src/backend/v4/orchestration/orchestration_manager.py b/src/backend/v4/orchestration/orchestration_manager.py index 58fc507e1..12bd70ec8 100644 --- a/src/backend/v4/orchestration/orchestration_manager.py +++ b/src/backend/v4/orchestration/orchestration_manager.py @@ -133,9 +133,11 @@ async def init_orchestration( try: # Create the chat client (AzureAIClient) + # Use team deployment_name with fallback to default model if empty + deployment_name = team_config.deployment_name or config.AZURE_OPENAI_DEPLOYMENT_NAME chat_client = AzureAIClient( project_endpoint=config.AZURE_AI_PROJECT_ENDPOINT, - model_deployment_name=team_config.deployment_name, + model_deployment_name=deployment_name, agent_name=agent_name, credential=credential, ) @@ -150,7 +152,7 @@ async def init_orchestration( cls.logger.info( "Created AzureAIClient and manager ChatAgent for orchestration with model '%s' at endpoint '%s'", - team_config.deployment_name, + deployment_name, config.AZURE_AI_PROJECT_ENDPOINT, ) except Exception as e: @@ -197,19 +199,17 @@ async def init_orchestration( # Assemble workflow with callback storage = InMemoryCheckpointStorage() - # New SDK: participants() accepts a Sequence (list) of agents - # The orchestrator uses agent.name to identify them + # New API: .participants() accepts a list of agents participant_list = list(participants.values()) - cls.logger.info("Participants for workflow: %s", list(participants.keys())) - print(f"[DEBUG] Participants for workflow: {list(participants.keys())}", flush=True) builder = ( MagenticBuilder() - .participants(participant_list) # New SDK: pass as list + .participants(participant_list) .with_manager( manager=manager, # Pass manager instance (extends StandardMagenticManager) max_round_count=orchestration_config.max_rounds, - max_stall_count=0, # CRITICAL: Prevent re-calling agents when stalled (default is 3!) + max_stall_count=3, + max_reset_count=2, ) .with_checkpointing(storage) ) @@ -239,16 +239,14 @@ async def get_current_or_new_orchestration( Return an existing workflow for the user or create a new one if: - None exists - Team switched flag is True - - force_rebuild is True (for new tasks after workflow completion) + - force_rebuild is True (for new tasks that need fresh workflow) """ current = orchestration_config.get_current_orchestration(user_id) - needs_rebuild = current is None or team_switched or force_rebuild - - if needs_rebuild: + if current is None or team_switched or force_rebuild: if current is not None and (team_switched or force_rebuild): - reason = "team switched" if team_switched else "force rebuild for new task" + reason = "team switched" if team_switched else "force rebuild" cls.logger.info( - "Rebuilding orchestration for user '%s' (reason: %s)", user_id, reason + "Closing previous agents for user '%s' (reason: %s)", user_id, reason ) # Close prior agents (same logic as old version) for agent in getattr(current, "_participants", {}).values(): @@ -305,6 +303,11 @@ async def run_orchestration(self, user_id: str, input_task) -> None: Execute the Magentic workflow for the provided user and task description. """ job_id = str(uuid.uuid4()) + + # Clean up any accumulated state from previous runs (cancelled plans, etc.) + # This prevents cross-scenario leakage + orchestration_config.cleanup_user_state(user_id) + orchestration_config.set_approval_pending(job_id) self.logger.info( "Starting orchestration job '%s' for user '%s'", job_id, user_id @@ -317,6 +320,16 @@ async def run_orchestration(self, user_id: str, input_task) -> None: if workflow is None: print(f"[ERROR] Orchestration not initialized for user '{user_id}'") raise ValueError("Orchestration not initialized for user.") + + # Reset manager's plan state to prevent leakage from cancelled plans + manager = getattr(workflow, "_manager", None) + if manager and hasattr(manager, "magentic_plan"): + manager.magentic_plan = None + self.logger.debug("Reset manager's magentic_plan for fresh run") + if manager and hasattr(manager, "task_ledger"): + manager.task_ledger = None + self.logger.debug("Reset manager's task_ledger for fresh run") + # Fresh thread per participant to avoid cross-run state bleed executors = getattr(workflow, "executors", {}) self.logger.debug("Executor keys at run start: %s", list(executors.keys())) @@ -383,16 +396,12 @@ async def run_orchestration(self, user_id: str, input_task) -> None: task_text = getattr(input_task, "description", str(input_task)) self.logger.debug("Task: %s", task_text) - # Track how many times each agent is called (for debugging duplicate calls) - agent_call_counts: dict = {} - try: # Execute workflow using run_stream with task as positional parameter # The execution settings are configured in the manager/client final_output: str | None = None self.logger.info("Starting workflow execution...") - print(f"[ORCHESTRATOR] 🚀 Starting workflow with max_rounds={orchestration_config.max_rounds}", flush=True) last_message_id: str | None = None async for event in workflow.run_stream(task_text): try: @@ -437,20 +446,11 @@ async def run_orchestration(self, user_id: str, input_task) -> None: # Handle group chat request sent elif isinstance(event, GroupChatRequestSentEvent): - agent_name = event.participant_name - agent_call_counts[agent_name] = agent_call_counts.get(agent_name, 0) + 1 - call_num = agent_call_counts[agent_name] - self.logger.info( - "[REQUEST SENT (round %d)] to agent: %s (call #%d)", + "[REQUEST SENT (round %d)] to agent: %s", event.round_index, - agent_name, - call_num + event.participant_name ) - print(f"[ORCHESTRATOR] 📤 REQUEST SENT round={event.round_index} to agent={agent_name} (call #{call_num})", flush=True) - - if call_num > 1: - print(f"[ORCHESTRATOR] ⚠️ WARNING: Agent '{agent_name}' called {call_num} times!", flush=True) # Handle group chat response received - THIS IS WHERE AGENT RESPONSES COME elif isinstance(event, GroupChatResponseReceivedEvent): @@ -511,13 +511,6 @@ async def run_orchestration(self, user_id: str, input_task) -> None: # Extract final result final_text = final_output if final_output else "" - # Log agent call summary - print(f"\n[ORCHESTRATOR] 📊 AGENT CALL SUMMARY:", flush=True) - for agent_name, count in agent_call_counts.items(): - status = "✅" if count == 1 else "⚠️ DUPLICATE" - print(f" {status} {agent_name}: called {count} time(s)", flush=True) - self.logger.info("Agent call counts: %s", agent_call_counts) - # Log results self.logger.info("\nAgent responses:") self.logger.info( From f2eb8e38c892faf8966804d0629ea11f2b79f753 Mon Sep 17 00:00:00 2001 From: Abdul-Microsoft Date: Fri, 13 Feb 2026 17:31:46 +0530 Subject: [PATCH 014/225] Revert "Add user state cleanup and enhance AzureAIClient initialization with deployment name fallback" This reverts commit c513f4bde39bc162312a31fbb21b349df010d640. --- src/backend/v4/config/settings.py | 20 ------ .../v4/magentic_agents/common/lifecycle.py | 15 +---- .../v4/magentic_agents/foundry_agent.py | 4 +- .../v4/orchestration/orchestration_manager.py | 65 ++++++++++--------- 4 files changed, 40 insertions(+), 64 deletions(-) diff --git a/src/backend/v4/config/settings.py b/src/backend/v4/config/settings.py index 2a9687272..fa112fcd9 100644 --- a/src/backend/v4/config/settings.py +++ b/src/backend/v4/config/settings.py @@ -220,26 +220,6 @@ def cleanup_clarification(self, request_id: str) -> None: self.clarifications.pop(request_id, None) self._clarification_events.pop(request_id, None) - def cleanup_user_state(self, user_id: str) -> None: - """Clean up all state for a user to prevent cross-scenario leakage. - - This removes any pending approvals, clarifications, and plans - associated with the user to ensure fresh state for new runs. - """ - # Clean up any plans associated with this user - plans_to_remove = [ - plan_id for plan_id, plan in self.plans.items() - if getattr(plan, 'user_id', None) == user_id - ] - for plan_id in plans_to_remove: - self.plans.pop(plan_id, None) - self.cleanup_approval(plan_id) - - # Clean up any pending approvals/clarifications for this user - # Note: We can't easily map approvals to users without plan context, - # so this primarily clears the plans and their associated approvals - logger.debug("Cleaned up state for user %s (removed %d plans)", user_id, len(plans_to_remove)) - class ConnectionConfig: """Connection manager for WebSocket connections.""" diff --git a/src/backend/v4/magentic_agents/common/lifecycle.py b/src/backend/v4/magentic_agents/common/lifecycle.py index c143d0c45..af9dcb846 100644 --- a/src/backend/v4/magentic_agents/common/lifecycle.py +++ b/src/backend/v4/magentic_agents/common/lifecycle.py @@ -14,7 +14,6 @@ from agent_framework_azure_ai import AzureAIClient from azure.ai.agents.aio import AgentsClient from azure.identity.aio import DefaultAzureCredential -from common.config.app_config import config from common.database.database_base import DatabaseBase from common.models.messages_af import CurrentTeamAgent, TeamConfiguration from common.utils.utils_agents import ( @@ -161,12 +160,10 @@ def get_chat_client(self, chat_client) -> AzureAIClient: and self._agent.chat_client ): return self._agent.chat_client # type: ignore - # Use model_deployment_name with fallback to default model if empty - deployment_name = self.model_deployment_name or config.AZURE_OPENAI_DEPLOYMENT_NAME chat_client = AzureAIClient( project_endpoint=self.project_endpoint, agent_name=self.agent_name, - model_deployment_name=deployment_name, + model_deployment_name=self.model_deployment_name, credential=self.creds, use_latest_version=True, ) @@ -280,26 +277,20 @@ async def get_database_team_agent(self) -> Optional[AzureAIClient]: # Create client with resolved ID if self.agent_name == "RAIAgent" and self.project_client: - # Use RAI deployment name for RAI agents - rai_deployment = config.AZURE_OPENAI_RAI_DEPLOYMENT_NAME chat_client = AzureAIClient( project_endpoint=self.project_endpoint, agent_id=resolved, - model_deployment_name=rai_deployment, credential=self.creds, ) self.logger.info( - "RAI.AgentReuseSuccess: Created AzureAIClient (id=%s, model=%s)", + "RAI.AgentReuseSuccess: Created AzureAIClient (id=%s)", resolved, - rai_deployment, ) else: - # Use model_deployment_name with fallback to default model if empty - deployment_name = self.model_deployment_name or config.AZURE_OPENAI_DEPLOYMENT_NAME chat_client = AzureAIClient( project_endpoint=self.project_endpoint, agent_id=resolved, - model_deployment_name=deployment_name, + model_deployment_name=self.model_deployment_name, credential=self.creds, ) self.logger.info( diff --git a/src/backend/v4/magentic_agents/foundry_agent.py b/src/backend/v4/magentic_agents/foundry_agent.py index 3a95ea210..84297ebef 100644 --- a/src/backend/v4/magentic_agents/foundry_agent.py +++ b/src/backend/v4/magentic_agents/foundry_agent.py @@ -222,13 +222,11 @@ async def _create_azure_search_enabled_client(self, chatClient=None) -> Optional ) # Wrap in AzureAIClient using agent_name and agent_version (NOT agent_id) - # Include model_deployment_name to ensure SDK has model info for streaming - deployment_name = self.model_deployment_name or config.AZURE_OPENAI_DEPLOYMENT_NAME + # AzureAIClient constructor: agent_name, agent_version, project_endpoint, credential chat_client = AzureAIClient( project_endpoint=self.project_endpoint, agent_name=azure_agent.name, agent_version=azure_agent.version, # Use the specific version we just created - model_deployment_name=deployment_name, credential=self.creds, ) return chat_client diff --git a/src/backend/v4/orchestration/orchestration_manager.py b/src/backend/v4/orchestration/orchestration_manager.py index 12bd70ec8..58fc507e1 100644 --- a/src/backend/v4/orchestration/orchestration_manager.py +++ b/src/backend/v4/orchestration/orchestration_manager.py @@ -133,11 +133,9 @@ async def init_orchestration( try: # Create the chat client (AzureAIClient) - # Use team deployment_name with fallback to default model if empty - deployment_name = team_config.deployment_name or config.AZURE_OPENAI_DEPLOYMENT_NAME chat_client = AzureAIClient( project_endpoint=config.AZURE_AI_PROJECT_ENDPOINT, - model_deployment_name=deployment_name, + model_deployment_name=team_config.deployment_name, agent_name=agent_name, credential=credential, ) @@ -152,7 +150,7 @@ async def init_orchestration( cls.logger.info( "Created AzureAIClient and manager ChatAgent for orchestration with model '%s' at endpoint '%s'", - deployment_name, + team_config.deployment_name, config.AZURE_AI_PROJECT_ENDPOINT, ) except Exception as e: @@ -199,17 +197,19 @@ async def init_orchestration( # Assemble workflow with callback storage = InMemoryCheckpointStorage() - # New API: .participants() accepts a list of agents + # New SDK: participants() accepts a Sequence (list) of agents + # The orchestrator uses agent.name to identify them participant_list = list(participants.values()) + cls.logger.info("Participants for workflow: %s", list(participants.keys())) + print(f"[DEBUG] Participants for workflow: {list(participants.keys())}", flush=True) builder = ( MagenticBuilder() - .participants(participant_list) + .participants(participant_list) # New SDK: pass as list .with_manager( manager=manager, # Pass manager instance (extends StandardMagenticManager) max_round_count=orchestration_config.max_rounds, - max_stall_count=3, - max_reset_count=2, + max_stall_count=0, # CRITICAL: Prevent re-calling agents when stalled (default is 3!) ) .with_checkpointing(storage) ) @@ -239,14 +239,16 @@ async def get_current_or_new_orchestration( Return an existing workflow for the user or create a new one if: - None exists - Team switched flag is True - - force_rebuild is True (for new tasks that need fresh workflow) + - force_rebuild is True (for new tasks after workflow completion) """ current = orchestration_config.get_current_orchestration(user_id) - if current is None or team_switched or force_rebuild: + needs_rebuild = current is None or team_switched or force_rebuild + + if needs_rebuild: if current is not None and (team_switched or force_rebuild): - reason = "team switched" if team_switched else "force rebuild" + reason = "team switched" if team_switched else "force rebuild for new task" cls.logger.info( - "Closing previous agents for user '%s' (reason: %s)", user_id, reason + "Rebuilding orchestration for user '%s' (reason: %s)", user_id, reason ) # Close prior agents (same logic as old version) for agent in getattr(current, "_participants", {}).values(): @@ -303,11 +305,6 @@ async def run_orchestration(self, user_id: str, input_task) -> None: Execute the Magentic workflow for the provided user and task description. """ job_id = str(uuid.uuid4()) - - # Clean up any accumulated state from previous runs (cancelled plans, etc.) - # This prevents cross-scenario leakage - orchestration_config.cleanup_user_state(user_id) - orchestration_config.set_approval_pending(job_id) self.logger.info( "Starting orchestration job '%s' for user '%s'", job_id, user_id @@ -320,16 +317,6 @@ async def run_orchestration(self, user_id: str, input_task) -> None: if workflow is None: print(f"[ERROR] Orchestration not initialized for user '{user_id}'") raise ValueError("Orchestration not initialized for user.") - - # Reset manager's plan state to prevent leakage from cancelled plans - manager = getattr(workflow, "_manager", None) - if manager and hasattr(manager, "magentic_plan"): - manager.magentic_plan = None - self.logger.debug("Reset manager's magentic_plan for fresh run") - if manager and hasattr(manager, "task_ledger"): - manager.task_ledger = None - self.logger.debug("Reset manager's task_ledger for fresh run") - # Fresh thread per participant to avoid cross-run state bleed executors = getattr(workflow, "executors", {}) self.logger.debug("Executor keys at run start: %s", list(executors.keys())) @@ -396,12 +383,16 @@ async def run_orchestration(self, user_id: str, input_task) -> None: task_text = getattr(input_task, "description", str(input_task)) self.logger.debug("Task: %s", task_text) + # Track how many times each agent is called (for debugging duplicate calls) + agent_call_counts: dict = {} + try: # Execute workflow using run_stream with task as positional parameter # The execution settings are configured in the manager/client final_output: str | None = None self.logger.info("Starting workflow execution...") + print(f"[ORCHESTRATOR] 🚀 Starting workflow with max_rounds={orchestration_config.max_rounds}", flush=True) last_message_id: str | None = None async for event in workflow.run_stream(task_text): try: @@ -446,11 +437,20 @@ async def run_orchestration(self, user_id: str, input_task) -> None: # Handle group chat request sent elif isinstance(event, GroupChatRequestSentEvent): + agent_name = event.participant_name + agent_call_counts[agent_name] = agent_call_counts.get(agent_name, 0) + 1 + call_num = agent_call_counts[agent_name] + self.logger.info( - "[REQUEST SENT (round %d)] to agent: %s", + "[REQUEST SENT (round %d)] to agent: %s (call #%d)", event.round_index, - event.participant_name + agent_name, + call_num ) + print(f"[ORCHESTRATOR] 📤 REQUEST SENT round={event.round_index} to agent={agent_name} (call #{call_num})", flush=True) + + if call_num > 1: + print(f"[ORCHESTRATOR] ⚠️ WARNING: Agent '{agent_name}' called {call_num} times!", flush=True) # Handle group chat response received - THIS IS WHERE AGENT RESPONSES COME elif isinstance(event, GroupChatResponseReceivedEvent): @@ -511,6 +511,13 @@ async def run_orchestration(self, user_id: str, input_task) -> None: # Extract final result final_text = final_output if final_output else "" + # Log agent call summary + print(f"\n[ORCHESTRATOR] 📊 AGENT CALL SUMMARY:", flush=True) + for agent_name, count in agent_call_counts.items(): + status = "✅" if count == 1 else "⚠️ DUPLICATE" + print(f" {status} {agent_name}: called {count} time(s)", flush=True) + self.logger.info("Agent call counts: %s", agent_call_counts) + # Log results self.logger.info("\nAgent responses:") self.logger.info( From 3b8654f85f55f5f77b48b21970fea202b7cc5380 Mon Sep 17 00:00:00 2001 From: Kingshuk-Microsoft Date: Fri, 13 Feb 2026 17:44:44 +0530 Subject: [PATCH 015/225] fix: add missing paths section for pull request trigger in workflow --- .github/workflows/test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 6ff949317..428882567 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -25,6 +25,7 @@ on: - main - demo-v4 - dev-v4 + paths: - 'src/backend/**/*.py' - 'src/tests/**/*.py' - 'src/mcp_server/**/*.py' From 643306f29f676432365bf8cb71218a0fdf037c3b Mon Sep 17 00:00:00 2001 From: Dhruvkumar-Microsoft Date: Fri, 13 Feb 2026 17:45:34 +0530 Subject: [PATCH 016/225] updated the logging and resolved the HR scenario issue --- src/backend/app.py | 11 +++++++++-- src/backend/v4/magentic_agents/foundry_agent.py | 3 +++ src/backend/v4/orchestration/orchestration_manager.py | 1 + 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/backend/app.py b/src/backend/app.py index 35e4e47af..65381236a 100644 --- a/src/backend/app.py +++ b/src/backend/app.py @@ -3,9 +3,14 @@ from contextlib import asynccontextmanager +from common.config.app_config import config + +# Configure logging levels FIRST, before any logging calls +logging.basicConfig(level=getattr(logging, config.AZURE_BASIC_LOGGING_LEVEL.upper(), logging.INFO)) + from azure.monitor.opentelemetry import configure_azure_monitor -from common.config.app_config import config +#from common.config.app_config import config from common.models.messages_af import UserLanguage # FastAPI imports @@ -61,7 +66,7 @@ async def lifespan(app: FastAPI): ) # Configure logging levels from environment variables -logging.basicConfig(level=getattr(logging, config.AZURE_BASIC_LOGGING_LEVEL.upper(), logging.INFO)) +#logging.basicConfig(level=getattr(logging, config.AZURE_BASIC_LOGGING_LEVEL.upper(), logging.INFO)) # Configure Azure package logging levels azure_level = getattr(logging, config.AZURE_PACKAGE_LOGGING_LEVEL.upper(), logging.WARNING) @@ -73,6 +78,8 @@ async def lifespan(app: FastAPI): logging.getLogger("opentelemetry.sdk").setLevel(logging.ERROR) +logging.getLogger("azure.core.pipeline.policies.http_logging_policy").setLevel(logging.WARNING) + # Initialize the FastAPI app app = FastAPI(lifespan=lifespan) diff --git a/src/backend/v4/magentic_agents/foundry_agent.py b/src/backend/v4/magentic_agents/foundry_agent.py index 84297ebef..b686a2aeb 100644 --- a/src/backend/v4/magentic_agents/foundry_agent.py +++ b/src/backend/v4/magentic_agents/foundry_agent.py @@ -227,6 +227,7 @@ async def _create_azure_search_enabled_client(self, chatClient=None) -> Optional project_endpoint=self.project_endpoint, agent_name=azure_agent.name, agent_version=azure_agent.version, # Use the specific version we just created + model_deployment_name=self.model_deployment_name, credential=self.creds, ) return chat_client @@ -282,6 +283,7 @@ async def _after_open(self) -> None: tool_choice="required", # Force usage temperature=temp, model_id=self.model_deployment_name, + default_options={"store": False}, # Client-managed conversation to avoid stale tool call IDs across rounds ) else: # use MCP path @@ -297,6 +299,7 @@ async def _after_open(self) -> None: tool_choice="auto" if tools else "none", temperature=temp, model_id=self.model_deployment_name, + default_options={"store": False}, # Client-managed conversation to avoid stale tool call IDs across rounds ) self.logger.info("Initialized ChatAgent '%s'", self.agent_name) diff --git a/src/backend/v4/orchestration/orchestration_manager.py b/src/backend/v4/orchestration/orchestration_manager.py index 58fc507e1..3e89c61ac 100644 --- a/src/backend/v4/orchestration/orchestration_manager.py +++ b/src/backend/v4/orchestration/orchestration_manager.py @@ -146,6 +146,7 @@ async def init_orchestration( name="MagenticManager", description="Orchestrator that coordinates the team to complete complex tasks efficiently.", instructions="You coordinate a team to complete complex tasks efficiently.", + default_options={"store": False}, # Client-managed conversation to avoid stale tool call IDs across rounds ) cls.logger.info( From 303c8667e21a3e8c37be0131e657c8b24293760c Mon Sep 17 00:00:00 2001 From: Abdul-Microsoft Date: Mon, 16 Feb 2026 12:56:23 +0530 Subject: [PATCH 017/225] Refactor FoundryAgentTemplate and MagenticAgentFactory to remove debug print statements and streamline logging --- .../v4/magentic_agents/foundry_agent.py | 18 ++-------------- .../magentic_agents/magentic_agent_factory.py | 1 - .../orchestration/human_approval_manager.py | 4 ---- .../v4/orchestration/orchestration_manager.py | 21 ++----------------- 4 files changed, 4 insertions(+), 40 deletions(-) diff --git a/src/backend/v4/magentic_agents/foundry_agent.py b/src/backend/v4/magentic_agents/foundry_agent.py index b686a2aeb..f44523fa5 100644 --- a/src/backend/v4/magentic_agents/foundry_agent.py +++ b/src/backend/v4/magentic_agents/foundry_agent.py @@ -70,23 +70,18 @@ def __init__( self._use_azure_search = self._is_azure_search_requested() self.use_reasoning = use_reasoning - # Placeholder for server-created Azure AI agent id/version (if Azure Search path) + # Placeholder for server-created Azure AI agent id (if Azure Search path) self._azure_server_agent_id: Optional[str] = None - self._azure_server_agent_version: Optional[str] = None # ------------------------- # Mode detection # ------------------------- def _is_azure_search_requested(self) -> bool: """Determine if Azure AI Search raw tool path should be used.""" - print(f"[DEBUG _is_azure_search_requested] Agent={self.agent_name}, search={self.search}") if not self.search: - print(f"[DEBUG _is_azure_search_requested] Agent={self.agent_name}: No search config, returning False") return False # Minimal heuristic: presence of required attributes - has_index = hasattr(self.search, "index_name") and bool(self.search.index_name) - print(f"[DEBUG _is_azure_search_requested] Agent={self.agent_name}: has_index={has_index}, index_name={getattr(self.search, 'index_name', None)}") if has_index: self.logger.info( "Azure AI Search requested (connection_id=%s, index=%s).", @@ -137,7 +132,6 @@ async def _create_azure_search_enabled_client(self, chatClient=None) -> Optional Returns: AzureAIClient | None """ - print(f"[DEBUG _create_azure_search_enabled_client] Agent={self.agent_name}, chatClient={chatClient}, search_config={self.search}") if chatClient: self.logger.info("Reusing existing chatClient for agent '%s' (already has Azure Search configured)", self.agent_name) return chatClient @@ -185,9 +179,6 @@ async def _create_azure_search_enabled_client(self, chatClient=None) -> Optional "Always use the Azure AI Search tool and configured index for knowledge retrieval." ) - print(f"[AGENT CREATE] 🆕 Creating agent in Foundry: '{self.agent_name}'", flush=True) - print(f"[AGENT CREATE] Model: {self.model_deployment_name}", flush=True) - print(f"[AGENT CREATE] Search: connection={connection_name}, index={index_name}", flush=True) azure_agent = await self.project_client.agents.create_version( agent_name=self.agent_name, # Use original name @@ -212,8 +203,7 @@ async def _create_azure_search_enabled_client(self, chatClient=None) -> Optional ) self._azure_server_agent_id = azure_agent.id - self._azure_server_agent_version = azure_agent.version - print(f"[AGENT CREATE] ✅ Created agent: name={azure_agent.name}, id={azure_agent.id}, version={azure_agent.version}", flush=True) + self.logger.info( "Created Azure AI Search agent via create_version (name=%s, id=%s, version=%s).", azure_agent.name, @@ -239,8 +229,6 @@ async def _create_azure_search_enabled_client(self, chatClient=None) -> Optional index_name, ex, ) - import traceback - traceback.print_exc() return None # ------------------------- @@ -257,7 +245,6 @@ async def _after_open(self) -> None: try: chatClient = await self.get_database_team_agent() - print(f"[DEBUG _after_open] Agent={self.agent_name}, _use_azure_search={self._use_azure_search}, search_config={self.search}, chatClient={chatClient}") if self._use_azure_search: # Azure Search mode (skip MCP + Code Interpreter due to incompatibility) @@ -266,7 +253,6 @@ async def _after_open(self) -> None: self.agent_name, getattr(self.search, "index_name", "N/A") if self.search else "N/A" ) - print(f"[DEBUG _after_open] Creating Azure Search client for {self.agent_name}") chat_client = await self._create_azure_search_enabled_client(chatClient) if not chat_client: raise RuntimeError( diff --git a/src/backend/v4/magentic_agents/magentic_agent_factory.py b/src/backend/v4/magentic_agents/magentic_agent_factory.py index 3eafb5831..36544166d 100644 --- a/src/backend/v4/magentic_agents/magentic_agent_factory.py +++ b/src/backend/v4/magentic_agents/magentic_agent_factory.py @@ -115,7 +115,6 @@ async def create_agent_from_config( index_name, "Reasoning" if use_reasoning else "Foundry", ) - print(f"[FACTORY] 🆕 Creating NEW agent: {agent_obj.name} (id={id(agent_obj)})", flush=True) agent = FoundryAgentTemplate( agent_name=agent_obj.name, diff --git a/src/backend/v4/orchestration/human_approval_manager.py b/src/backend/v4/orchestration/human_approval_manager.py index 39089247a..00850ec26 100644 --- a/src/backend/v4/orchestration/human_approval_manager.py +++ b/src/backend/v4/orchestration/human_approval_manager.py @@ -33,7 +33,6 @@ class HumanApprovalMagenticManager(StandardMagenticManager): approval_enabled: bool = True magentic_plan: Optional[MPlan] = None current_user_id: str # populated in __init__ - _called_agents: set # Track which agents have been called def __init__(self, user_id: str, agent, *args, **kwargs): """ @@ -44,9 +43,6 @@ def __init__(self, user_id: str, agent, *args, **kwargs): *args: Additional positional arguments for the parent StandardMagenticManager. **kwargs: Additional keyword arguments for the parent StandardMagenticManager. """ - - # Initialize called agents tracker - self._called_agents = set() plan_append = """ diff --git a/src/backend/v4/orchestration/orchestration_manager.py b/src/backend/v4/orchestration/orchestration_manager.py index 3e89c61ac..fa5801ae5 100644 --- a/src/backend/v4/orchestration/orchestration_manager.py +++ b/src/backend/v4/orchestration/orchestration_manager.py @@ -202,7 +202,6 @@ async def init_orchestration( # The orchestrator uses agent.name to identify them participant_list = list(participants.values()) cls.logger.info("Participants for workflow: %s", list(participants.keys())) - print(f"[DEBUG] Participants for workflow: {list(participants.keys())}", flush=True) builder = ( MagenticBuilder() @@ -277,24 +276,17 @@ async def get_current_or_new_orchestration( cls.logger.error( "Failed to create agents for user '%s': %s", user_id, e ) - print(f"Failed to create agents for user '{user_id}': {e}") raise try: cls.logger.info("Initializing new orchestration for user '%s'", user_id) - print(f"[DEBUG] Initializing new orchestration for user '{user_id}'") workflow = await cls.init_orchestration( agents, team_config, team_service.memory_context, user_id ) orchestration_config.orchestrations[user_id] = workflow - print(f"[DEBUG] Stored workflow for user '{user_id}': {workflow is not None}") - print(f"[DEBUG] orchestrations keys: {list(orchestration_config.orchestrations.keys())}") except Exception as e: cls.logger.error( "Failed to initialize orchestration for user '%s': %s", user_id, e ) - print(f"Failed to initialize orchestration for user '{user_id}': {e}") - import traceback - traceback.print_exc() raise return orchestration_config.get_current_orchestration(user_id) @@ -310,13 +302,9 @@ async def run_orchestration(self, user_id: str, input_task) -> None: self.logger.info( "Starting orchestration job '%s' for user '%s'", job_id, user_id ) - print(f"[DEBUG] run_orchestration called for user '{user_id}'") - print(f"[DEBUG] orchestrations keys before get: {list(orchestration_config.orchestrations.keys())}") workflow = orchestration_config.get_current_orchestration(user_id) - print(f"[DEBUG] workflow is None: {workflow is None}") if workflow is None: - print(f"[ERROR] Orchestration not initialized for user '{user_id}'") raise ValueError("Orchestration not initialized for user.") # Fresh thread per participant to avoid cross-run state bleed executors = getattr(workflow, "executors", {}) @@ -393,7 +381,7 @@ async def run_orchestration(self, user_id: str, input_task) -> None: final_output: str | None = None self.logger.info("Starting workflow execution...") - print(f"[ORCHESTRATOR] 🚀 Starting workflow with max_rounds={orchestration_config.max_rounds}", flush=True) + last_message_id: str | None = None async for event in workflow.run_stream(task_text): try: @@ -448,10 +436,9 @@ async def run_orchestration(self, user_id: str, input_task) -> None: agent_name, call_num ) - print(f"[ORCHESTRATOR] 📤 REQUEST SENT round={event.round_index} to agent={agent_name} (call #{call_num})", flush=True) if call_num > 1: - print(f"[ORCHESTRATOR] ⚠️ WARNING: Agent '{agent_name}' called {call_num} times!", flush=True) + self.logger.warning("Agent '%s' called %d times", agent_name, call_num) # Handle group chat response received - THIS IS WHERE AGENT RESPONSES COME elif isinstance(event, GroupChatResponseReceivedEvent): @@ -513,10 +500,6 @@ async def run_orchestration(self, user_id: str, input_task) -> None: final_text = final_output if final_output else "" # Log agent call summary - print(f"\n[ORCHESTRATOR] 📊 AGENT CALL SUMMARY:", flush=True) - for agent_name, count in agent_call_counts.items(): - status = "✅" if count == 1 else "⚠️ DUPLICATE" - print(f" {status} {agent_name}: called {count} time(s)", flush=True) self.logger.info("Agent call counts: %s", agent_call_counts) # Log results From bb5331e84b64e32e1f7590fa7bce57822cdb0a42 Mon Sep 17 00:00:00 2001 From: Abdul-Microsoft Date: Fri, 20 Feb 2026 09:45:45 +0530 Subject: [PATCH 018/225] Refactor agent creation and configuration to avoid mutating original team objects and streamline AzureAIClient initialization --- src/backend/common/utils/utils_af.py | 14 +- src/backend/common/utils/utils_agents.py | 24 --- src/backend/v4/callbacks/response_handlers.py | 6 +- .../v4/magentic_agents/common/lifecycle.py | 178 +----------------- .../v4/magentic_agents/foundry_agent.py | 25 +-- 5 files changed, 28 insertions(+), 219 deletions(-) diff --git a/src/backend/common/utils/utils_af.py b/src/backend/common/utils/utils_af.py index 2d1dd794e..a22212144 100644 --- a/src/backend/common/utils/utils_af.py +++ b/src/backend/common/utils/utils_af.py @@ -88,9 +88,15 @@ async def create_RAI_agent( ) model_deployment_name = config.AZURE_OPENAI_RAI_DEPLOYMENT_NAME - team.team_id = "rai_team" # Use a fixed team ID for RAI agent - team.name = "RAI Team" - team.description = "Team responsible for Responsible AI checks" + + # Create a copy to avoid mutating the caller's team config. + # The original team object is reused later (e.g., for orchestration init), + # so mutating it would corrupt the real team name/id. + rai_team = team.model_copy() + rai_team.team_id = "rai_team" + rai_team.name = "RAI Team" + rai_team.description = "Team responsible for Responsible AI checks" + agent = FoundryAgentTemplate( agent_name=agent_name, agent_description=agent_description, @@ -101,7 +107,7 @@ async def create_RAI_agent( project_endpoint=config.AZURE_AI_PROJECT_ENDPOINT, mcp_config=None, search_config=None, - team_config=team, + team_config=rai_team, memory_store=memory_store, ) diff --git a/src/backend/common/utils/utils_agents.py b/src/backend/common/utils/utils_agents.py index 1e164f89c..c679f9f62 100644 --- a/src/backend/common/utils/utils_agents.py +++ b/src/backend/common/utils/utils_agents.py @@ -1,11 +1,6 @@ -import logging import secrets import string -from typing import Optional - -from common.database.database_base import DatabaseBase -from common.models.messages_af import TeamConfiguration def generate_assistant_id(prefix: str = "asst_", length: int = 24) -> str: @@ -21,22 +16,3 @@ def generate_assistant_id(prefix: str = "asst_", length: int = 24) -> str: # cryptographically strong randomness random_part = "".join(secrets.choice(alphabet) for _ in range(length)) return f"{prefix}{random_part}" - - -async def get_database_team_agent_id( - memory_store: DatabaseBase, team_config: TeamConfiguration, agent_name: str -) -> Optional[str]: - """Retrieve existing team agent from database, if any.""" - agent_id = None - try: - currentAgent = await memory_store.get_team_agent( - team_id=team_config.team_id, agent_name=agent_name - ) - if currentAgent and currentAgent.agent_foundry_id: - agent_id = currentAgent.agent_foundry_id - - except ( - Exception - ) as ex: # Consider narrowing this to specific exceptions if possible - logging.error("Failed to initialize Get database team agent: %s", ex) - return agent_id diff --git a/src/backend/v4/callbacks/response_handlers.py b/src/backend/v4/callbacks/response_handlers.py index 88c6085f5..f034e4168 100644 --- a/src/backend/v4/callbacks/response_handlers.py +++ b/src/backend/v4/callbacks/response_handlers.py @@ -8,7 +8,7 @@ import re from typing import Any -from agent_framework import ChatMessage, AgentRunUpdateEvent +from agent_framework import ChatMessage from v4.config.settings import connection_config from v4.models.messages import ( @@ -108,7 +108,7 @@ def agent_response_callback( async def streaming_agent_response_callback( agent_id: str, - update, # AgentRunUpdateEvent.data or similar streaming update object + update, # Streaming update object (e.g. AgentResponseUpdate, ChatMessage) is_final: bool, user_id: str | None = None, ) -> None: @@ -119,7 +119,7 @@ async def streaming_agent_response_callback( return try: - # Handle both AgentRunUpdateEvent.data and raw text updates + # Handle various streaming update object shapes chunk_text = getattr(update, "text", None) # If text is None, don't fall back to str(update) as that would show object repr diff --git a/src/backend/v4/magentic_agents/common/lifecycle.py b/src/backend/v4/magentic_agents/common/lifecycle.py index af9dcb846..c9093c318 100644 --- a/src/backend/v4/magentic_agents/common/lifecycle.py +++ b/src/backend/v4/magentic_agents/common/lifecycle.py @@ -15,10 +15,9 @@ from azure.ai.agents.aio import AgentsClient from azure.identity.aio import DefaultAzureCredential from common.database.database_base import DatabaseBase -from common.models.messages_af import CurrentTeamAgent, TeamConfiguration +from common.models.messages_af import TeamConfiguration from common.utils.utils_agents import ( generate_assistant_id, - get_database_team_agent_id, ) from v4.common.services.team_service import TeamService from v4.config.agent_registry import agent_registry @@ -148,13 +147,12 @@ async def _after_open(self) -> None: """Subclasses must build self._agent here.""" raise NotImplementedError - def get_chat_client(self, chat_client) -> AzureAIClient: + def get_chat_client(self) -> AzureAIClient: """Return the underlying ChatClientProtocol (AzureAIClient). - Uses agent_name with use_latest_version=True to get the latest agent version + Uses agent_name with use_latest_version=True to get the latest agent version. + Agent reuse is handled automatically by the SDK via agent_name. """ - if chat_client: - return chat_client if ( self._agent and self._agent.chat_client @@ -173,176 +171,16 @@ def get_chat_client(self, chat_client) -> AzureAIClient: ) return chat_client - async def resolve_agent_id(self, agent_id: str) -> Optional[str]: - """Resolve agent ID via Projects SDK first (for RAI agents), fallback to AgentsClient. - - Args: - agent_id: The agent ID to resolve - - Returns: - The resolved agent ID if found, None otherwise - """ - # Try Projects SDK first (RAI agents were created via project_client) - try: - if self.project_client: - agent = await self.project_client.agents.get_agent(agent_id) - if agent and agent.id: - self.logger.info( - "RAI.AgentReuseSuccess: Resolved agent via Projects SDK (id=%s)", - agent.id, - ) - return agent.id - except Exception as ex: - self.logger.warning( - "RAI.AgentReuseMiss: Projects SDK get_agent failed (reason=ProjectsGetFailed, id=%s): %s", - agent_id, - ex, - ) - - # Fallback via AgentsClient (endpoint) - try: - if self.client: - agent = await self.client.get_agent(agent_id=agent_id) - if agent and agent.id: - self.logger.info( - "RAI.AgentReuseSuccess: Resolved agent via AgentsClient (id=%s)", - agent.id, - ) - return agent.id - except Exception as ex: - self.logger.warning( - "RAI.AgentReuseMiss: AgentsClient get_agent failed (reason=EndpointGetFailed, id=%s): %s", - agent_id, - ex, - ) - - self.logger.error( - "RAI.AgentReuseMiss: Agent ID not resolvable via any client (reason=ClientMismatch, id=%s)", - agent_id, - ) - return None - - def get_agent_id(self, chat_client) -> str: - """Return the underlying agent ID or generate a new one. + def get_agent_id(self) -> str: + """Generate a local agent ID for the ChatAgent wrapper. - Note: The new AzureAIClient doesn't expose agent_id directly. - We generate a new ID if not available. + The new AzureAIClient identifies agents by name (not ID) on the server side. + This ID is only used locally for the ChatAgent wrapper instance. """ - # Generate a new agent ID since AzureAIClient doesn't expose agent_id id = generate_assistant_id() self.logger.info("Generated new agent ID: %s", id) return id - async def get_database_team_agent(self) -> Optional[AzureAIClient]: - """Retrieve existing team agent from database, if any. - - NOTE: Agent reuse is currently DISABLED to ensure fresh agents are created - with the correct Azure AI Search configuration. - This prevents issues with stale agents that may not have the search tool configured. - - To re-enable agent reuse, set ENABLE_AGENT_REUSE=true in environment. - """ - import os - - # DISABLED: Always create fresh agents to ensure Azure AI Search tool is configured - enable_reuse = os.environ.get("ENABLE_AGENT_REUSE", "false").lower() == "true" - if not enable_reuse: - self.logger.info( - "Agent reuse DISABLED: Creating fresh agent with search tools (agent_name=%s)", - self.agent_name, - ) - return None - - chat_client = None - try: - agent_id = await get_database_team_agent_id( - self.memory_store, self.team_config, self.agent_name - ) - - if not agent_id: - self.logger.info( - "RAI reuse: no stored agent id (agent_name=%s)", self.agent_name - ) - return None - - # Use resolve_agent_id to try Projects SDK first, then AgentsClient - resolved = await self.resolve_agent_id(agent_id) - if not resolved: - self.logger.error( - "RAI.AgentReuseMiss: stored id %s not resolvable (agent_name=%s)", - agent_id, - self.agent_name, - ) - return None - - # Create client with resolved ID - if self.agent_name == "RAIAgent" and self.project_client: - chat_client = AzureAIClient( - project_endpoint=self.project_endpoint, - agent_id=resolved, - credential=self.creds, - ) - self.logger.info( - "RAI.AgentReuseSuccess: Created AzureAIClient (id=%s)", - resolved, - ) - else: - chat_client = AzureAIClient( - project_endpoint=self.project_endpoint, - agent_id=resolved, - model_deployment_name=self.model_deployment_name, - credential=self.creds, - ) - self.logger.info( - "Created AzureAIClient via endpoint (id=%s)", resolved - ) - - except Exception as ex: - self.logger.error( - "Failed to initialize Get database team agent (agent_name=%s): %s", - self.agent_name, - ex, - ) - return chat_client - - async def save_database_team_agent(self) -> None: - """Save current team agent to database (only if truly new or changed).""" - try: - if self._agent is None or self._agent.id is None: - self.logger.error("Cannot save database team agent: agent or agent_id is None") - return - - # Use the agent ID from ChatAgent (set during creation) - agent_id = self._agent.id - - # Check if stored ID matches current ID - stored_id = await get_database_team_agent_id( - self.memory_store, self.team_config, self.agent_name - ) - if stored_id == agent_id: - self.logger.info( - "RAI reuse: id unchanged (id=%s); skip save.", agent_id - ) - return - - currentAgent = CurrentTeamAgent( - team_id=self.team_config.team_id, - team_name=self.team_config.name, - agent_name=self.agent_name, - agent_foundry_id=agent_id, - agent_description=self.agent_description, - agent_instructions=self.agent_instructions, - ) - await self.memory_store.add_team_agent(currentAgent) - self.logger.info( - "Saved team agent to database (agent_name=%s, id=%s)", - self.agent_name, - agent_id, - ) - - except Exception as ex: - self.logger.error("Failed to save database: %s", ex) - async def _prepare_mcp_tool(self) -> None: """Translate MCPConfig to a HostedMCPTool (agent_framework construct).""" if not self.mcp_cfg: diff --git a/src/backend/v4/magentic_agents/foundry_agent.py b/src/backend/v4/magentic_agents/foundry_agent.py index f44523fa5..6d3974010 100644 --- a/src/backend/v4/magentic_agents/foundry_agent.py +++ b/src/backend/v4/magentic_agents/foundry_agent.py @@ -115,7 +115,7 @@ async def _collect_tools(self) -> List: # ------------------------- # Azure Search helper # ------------------------- - async def _create_azure_search_enabled_client(self, chatClient=None) -> Optional[AzureAIClient]: + async def _create_azure_search_enabled_client(self) -> Optional[AzureAIClient]: """ Create a server-side Azure AI agent with Azure AI Search tool using create_version. @@ -132,10 +132,6 @@ async def _create_azure_search_enabled_client(self, chatClient=None) -> Optional Returns: AzureAIClient | None """ - if chatClient: - self.logger.info("Reusing existing chatClient for agent '%s' (already has Azure Search configured)", self.agent_name) - return chatClient - if not self.search: self.logger.error("Search configuration missing.") return None @@ -244,8 +240,6 @@ async def _after_open(self) -> None: temp = 0.1 try: - chatClient = await self.get_database_team_agent() - if self._use_azure_search: # Azure Search mode (skip MCP + Code Interpreter due to incompatibility) self.logger.info( @@ -253,7 +247,7 @@ async def _after_open(self) -> None: self.agent_name, getattr(self.search, "index_name", "N/A") if self.search else "N/A" ) - chat_client = await self._create_azure_search_enabled_client(chatClient) + chat_client = await self._create_azure_search_enabled_client() if not chat_client: raise RuntimeError( "Azure AI Search mode requested but setup failed." @@ -261,8 +255,8 @@ async def _after_open(self) -> None: # In Azure Search raw tool path, tools/tool_choice are handled server-side. self._agent = ChatAgent( - id=self.get_agent_id(chat_client), - chat_client=self.get_chat_client(chat_client), + id=self.get_agent_id(), + chat_client=chat_client, instructions=self.agent_instructions, name=self.agent_name, description=self.agent_description, @@ -272,12 +266,12 @@ async def _after_open(self) -> None: default_options={"store": False}, # Client-managed conversation to avoid stale tool call IDs across rounds ) else: - # use MCP path + # MCP path (also used by RAI agent which has no tools) self.logger.info("Initializing agent in MCP mode.") tools = await self._collect_tools() self._agent = ChatAgent( - id=self.get_agent_id(chatClient), - chat_client=self.get_chat_client(chatClient), + id=self.get_agent_id(), + chat_client=self.get_chat_client(), instructions=self.agent_instructions, name=self.agent_name, description=self.agent_description, @@ -314,12 +308,7 @@ async def invoke(self, prompt: str): messages = [ChatMessage(role=Role.USER, text=prompt)] - agent_saved = False async for update in self._agent.run_stream(messages): - # Save agent ID only once on first update - if not agent_saved: - await self.save_database_team_agent() - agent_saved = True yield update # ------------------------- From 60c894e9bca957647d6d760fd6918c30a164d2bd Mon Sep 17 00:00:00 2001 From: Abdul-Microsoft Date: Fri, 20 Feb 2026 19:59:24 +0530 Subject: [PATCH 019/225] Remove description and instructions from MagenticManager ChatAgent initialization --- src/backend/v4/orchestration/orchestration_manager.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/backend/v4/orchestration/orchestration_manager.py b/src/backend/v4/orchestration/orchestration_manager.py index fa5801ae5..6d6811850 100644 --- a/src/backend/v4/orchestration/orchestration_manager.py +++ b/src/backend/v4/orchestration/orchestration_manager.py @@ -144,8 +144,6 @@ async def init_orchestration( manager_agent = ChatAgent( chat_client=chat_client, name="MagenticManager", - description="Orchestrator that coordinates the team to complete complex tasks efficiently.", - instructions="You coordinate a team to complete complex tasks efficiently.", default_options={"store": False}, # Client-managed conversation to avoid stale tool call IDs across rounds ) From 3b52504809e082b3fec5e34f1e879de9565fda43 Mon Sep 17 00:00:00 2001 From: Harsh-Microsoft Date: Mon, 23 Feb 2026 18:13:11 +0530 Subject: [PATCH 020/225] replace avm module with bicep module for search service for initial provisioning --- infra/main.bicep | 95 +- infra/main.json | 2435 +--------------------------------------------- 2 files changed, 56 insertions(+), 2474 deletions(-) diff --git a/infra/main.bicep b/infra/main.bicep index 1907f1a4a..b25b5a691 100644 --- a/infra/main.bicep +++ b/infra/main.bicep @@ -1288,7 +1288,7 @@ module containerApp 'br/public:avm/res/app/container-app:0.18.1' = { } { name: 'AZURE_AI_SEARCH_ENDPOINT' - value: searchService.outputs.endpoint + value: searchServiceUpdate.outputs.endpoint } { name: 'AZURE_COGNITIVE_SERVICES' @@ -1662,78 +1662,17 @@ var aiSearchIndexNameForRFPSummary = 'macae-rfp-summary-index' var aiSearchIndexNameForRFPRisk = 'macae-rfp-risk-index' var aiSearchIndexNameForRFPCompliance = 'macae-rfp-compliance-index' -module searchService 'br/public:avm/res/search/search-service:0.11.1' = { - name: take('avm.res.search.search-service.${solutionSuffix}', 64) - params: { - name: searchServiceName - authOptions: { - aadOrApiKey: { - aadAuthFailureMode: 'http401WithBearerChallenge' - } - } - disableLocalAuth: false - hostingMode: 'default' - - // Enabled the Public access because other services are not able to connect with search search AVM module when public access is disabled - - // publicNetworkAccess: enablePrivateNetworking ? 'Disabled' : 'Enabled' - publicNetworkAccess: 'Enabled' - networkRuleSet: { - bypass: 'AzureServices' - } - partitionCount: 1 - replicaCount: 1 - sku: enableScalability ? 'standard' : 'basic' - tags: tags - roleAssignments: [ - { - principalId: userAssignedIdentity.outputs.principalId - roleDefinitionIdOrName: 'Search Index Data Contributor' - principalType: 'ServicePrincipal' - } - { - principalId: deployingUserPrincipalId - roleDefinitionIdOrName: 'Search Index Data Contributor' - principalType: deployerPrincipalType - } - { - principalId: aiFoundryAiProjectPrincipalId - roleDefinitionIdOrName: 'Search Index Data Reader' - principalType: 'ServicePrincipal' - } - { - principalId: aiFoundryAiProjectPrincipalId - roleDefinitionIdOrName: 'Search Service Contributor' - principalType: 'ServicePrincipal' - } - ] - - //Removing the Private endpoints as we are facing the issue with connecting to search service while comminicating with agents - - privateEndpoints: [] - // privateEndpoints: enablePrivateNetworking - // ? [ - // { - // name: 'pep-search-${solutionSuffix}' - // customNetworkInterfaceName: 'nic-search-${solutionSuffix}' - // privateDnsZoneGroup: { - // privateDnsZoneGroupConfigs: [ - // { - // privateDnsZoneResourceId: avmPrivateDnsZones[dnsZoneIndex.search]!.outputs.resourceId - // } - // ] - // } - // subnetResourceId: virtualNetwork!.outputs.subnetResourceIds[0] - // service: 'searchService' - // } - // ] - // : [] +resource searchService 'Microsoft.Search/searchServices@2024-06-01-preview' = { + name: searchServiceName + location: location + sku: { + name: enableScalability ? 'standard' : 'basic' } } -// Separate module for Search Service to enable managed identity, as this reduces deployment time -module searchServiceIdentity 'br/public:avm/res/search/search-service:0.11.1' = { - name: take('avm.res.search.identity.${solutionSuffix}', 64) +// Separate module for Search Service to enable managed identity and update other properties, as this reduces deployment time +module searchServiceUpdate 'br/public:avm/res/search/search-service:0.11.1' = { + name: take('avm.res.search.update.${solutionSuffix}', 64) params: { name: searchServiceName authOptions: { @@ -1817,10 +1756,10 @@ module aiSearchFoundryConnection 'modules/aifp-connections.bicep' = { aiFoundryProjectName: aiFoundryAiProjectName aiFoundryName: aiFoundryAiServicesResourceName aifSearchConnectionName: aiSearchConnectionName - searchServiceResourceId: searchService.outputs.resourceId - searchServiceLocation: searchService.outputs.location - searchServiceName: searchService.outputs.name - searchApiKey: searchService.outputs.primaryKey + searchServiceResourceId: searchService.id + searchServiceLocation: searchService.location + searchServiceName: searchService.name + searchApiKey: searchService.listAdminKeys().primaryKey } dependsOn: [ aiFoundryAiServices @@ -1874,7 +1813,7 @@ module keyvault 'br/public:avm/res/key-vault/vault:0.12.1' = { secrets: [ { name: 'AzureAISearchAPIKey' - value: searchService.outputs.primaryKey + value: searchService.listAdminKeys().primaryKey } ] enableTelemetry: enableTelemetry @@ -1893,8 +1832,8 @@ output webSiteDefaultHostname string = webSite.outputs.defaultHostname output AZURE_STORAGE_BLOB_URL string = avmStorageAccount.outputs.serviceEndpoints.blob output AZURE_STORAGE_ACCOUNT_NAME string = storageAccountName -output AZURE_AI_SEARCH_ENDPOINT string = searchService.outputs.endpoint -output AZURE_AI_SEARCH_NAME string = searchService.outputs.name +output AZURE_AI_SEARCH_ENDPOINT string = searchServiceUpdate.outputs.endpoint +output AZURE_AI_SEARCH_NAME string = searchService.name output COSMOSDB_ENDPOINT string = 'https://${cosmosDbResourceName}.documents.azure.com:443/' output COSMOSDB_DATABASE string = cosmosDbDatabaseName @@ -1917,7 +1856,7 @@ output AI_FOUNDRY_RESOURCE_ID string = !useExistingAiFoundryAiProject ? aiFoundryAiServices.outputs.resourceId : existingAiFoundryAiProjectResourceId output COSMOSDB_ACCOUNT_NAME string = cosmosDbResourceName -output AZURE_SEARCH_ENDPOINT string = searchService.outputs.endpoint +output AZURE_SEARCH_ENDPOINT string = searchServiceUpdate.outputs.endpoint output AZURE_CLIENT_ID string = userAssignedIdentity!.outputs.clientId output AZURE_TENANT_ID string = tenant().tenantId output AZURE_AI_SEARCH_CONNECTION_NAME string = aiSearchConnectionName diff --git a/infra/main.json b/infra/main.json index 533d3c15e..a9b8af6b6 100644 --- a/infra/main.json +++ b/infra/main.json @@ -6,7 +6,7 @@ "_generator": { "name": "bicep", "version": "0.40.2.10011", - "templateHash": "15617057279270894392" + "templateHash": "16839096090855786967" }, "name": "Multi-Agent Custom Automation Engine", "description": "This module contains the resources required to deploy the [Multi-Agent Custom Automation Engine solution accelerator](https://github.com/microsoft/Multi-Agent-Custom-Automation-Engine-Solution-Accelerator) for both Sandbox environments and WAF aligned environments.\n\n> **Note:** This module is not intended for broad, generic use, as it was designed by the Commercial Solution Areas CTO team, as a Microsoft Solution Accelerator. Feature requests and bug fix requests are welcome if they support the needs of this organization but may not be incorporated if they aim to make this module more generic than what it needs to be for its primary use case. This module will likely be updated to leverage AVM resource modules in the future. This may result in breaking changes in upcoming versions when these features are implemented.\n" @@ -553,6 +553,15 @@ "resourceGroup": "[variables('aiFoundryAiServicesResourceGroupName')]", "name": "[format('{0}/{1}', variables('aiFoundryAiServicesResourceName'), variables('aiFoundryAiProjectResourceName'))]" }, + "searchService": { + "type": "Microsoft.Search/searchServices", + "apiVersion": "2024-06-01-preview", + "name": "[variables('searchServiceName')]", + "location": "[parameters('location')]", + "sku": { + "name": "[if(parameters('enableScalability'), 'standard', 'basic')]" + } + }, "logAnalyticsWorkspace": { "condition": "[and(parameters('enableMonitoring'), not(variables('useExistingLogAnalytics')))]", "type": "Microsoft.Resources/deployments", @@ -30470,7 +30479,7 @@ }, { "name": "AZURE_AI_SEARCH_ENDPOINT", - "value": "[reference('searchService').outputs.endpoint.value]" + "value": "[reference('searchServiceUpdate').outputs.endpoint.value]" }, { "name": "AZURE_COGNITIVE_SERVICES", @@ -32132,7 +32141,7 @@ "containerAppMcp", "existingAiFoundryAiServicesProject", "keyvault", - "searchService", + "searchServiceUpdate", "userAssignedIdentity" ] }, @@ -42246,10 +42255,10 @@ "virtualNetwork" ] }, - "searchService": { + "searchServiceUpdate": { "type": "Microsoft.Resources/deployments", "apiVersion": "2025-04-01", - "name": "[take(format('avm.res.search.search-service.{0}', variables('solutionSuffix')), 64)]", + "name": "[take(format('avm.res.search.update.{0}', variables('solutionSuffix')), 64)]", "properties": { "expressionEvaluationOptions": { "scope": "inner" @@ -42272,6 +42281,11 @@ "hostingMode": { "value": "default" }, + "managedIdentities": { + "value": { + "systemAssigned": true + } + }, "publicNetworkAccess": { "value": "Enabled" }, @@ -44609,2411 +44623,40 @@ "dependsOn": [ "aiFoundryAiServicesProject", "existingAiFoundryAiServicesProject", + "searchService", "userAssignedIdentity" ] }, - "searchServiceIdentity": { + "aiSearchFoundryConnection": { "type": "Microsoft.Resources/deployments", "apiVersion": "2025-04-01", - "name": "[take(format('avm.res.search.identity.{0}', variables('solutionSuffix')), 64)]", + "name": "[take(format('aifp-srch-connection.{0}', variables('solutionSuffix')), 64)]", + "subscriptionId": "[variables('aiFoundryAiServicesSubscriptionId')]", + "resourceGroup": "[variables('aiFoundryAiServicesResourceGroupName')]", "properties": { "expressionEvaluationOptions": { "scope": "inner" }, "mode": "Incremental", "parameters": { - "name": { - "value": "[variables('searchServiceName')]" - }, - "authOptions": { - "value": { - "aadOrApiKey": { - "aadAuthFailureMode": "http401WithBearerChallenge" - } - } - }, - "disableLocalAuth": { - "value": false - }, - "hostingMode": { - "value": "default" - }, - "managedIdentities": { - "value": { - "systemAssigned": true - } - }, - "publicNetworkAccess": { - "value": "Enabled" - }, - "networkRuleSet": { - "value": { - "bypass": "AzureServices" - } - }, - "partitionCount": { - "value": 1 - }, - "replicaCount": { - "value": 1 + "aiFoundryProjectName": "[if(variables('useExistingAiFoundryAiProject'), createObject('value', variables('aiFoundryAiProjectResourceName')), createObject('value', reference('aiFoundryAiServicesProject').outputs.name.value))]", + "aiFoundryName": { + "value": "[variables('aiFoundryAiServicesResourceName')]" }, - "sku": "[if(parameters('enableScalability'), createObject('value', 'standard'), createObject('value', 'basic'))]", - "tags": { - "value": "[parameters('tags')]" + "aifSearchConnectionName": { + "value": "[variables('aiSearchConnectionName')]" }, - "roleAssignments": { - "value": [ - { - "principalId": "[reference('userAssignedIdentity').outputs.principalId.value]", - "roleDefinitionIdOrName": "Search Index Data Contributor", - "principalType": "ServicePrincipal" - }, - { - "principalId": "[variables('deployingUserPrincipalId')]", - "roleDefinitionIdOrName": "Search Index Data Contributor", - "principalType": "[variables('deployerPrincipalType')]" - }, - { - "principalId": "[if(variables('useExistingAiFoundryAiProject'), reference('existingAiFoundryAiServicesProject', '2025-06-01', 'full').identity.principalId, reference('aiFoundryAiServicesProject').outputs.principalId.value)]", - "roleDefinitionIdOrName": "Search Index Data Reader", - "principalType": "ServicePrincipal" - }, - { - "principalId": "[if(variables('useExistingAiFoundryAiProject'), reference('existingAiFoundryAiServicesProject', '2025-06-01', 'full').identity.principalId, reference('aiFoundryAiServicesProject').outputs.principalId.value)]", - "roleDefinitionIdOrName": "Search Service Contributor", - "principalType": "ServicePrincipal" - } - ] + "searchServiceResourceId": { + "value": "[resourceId('Microsoft.Search/searchServices', variables('searchServiceName'))]" }, - "privateEndpoints": { - "value": [] - } - }, - "template": { - "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", - "languageVersion": "2.0", - "contentVersion": "1.0.0.0", - "metadata": { - "_generator": { - "name": "bicep", - "version": "0.37.4.10188", - "templateHash": "10902281417196168235" - }, - "name": "Search Services", - "description": "This module deploys a Search Service." - }, - "definitions": { - "privateEndpointOutputType": { - "type": "object", - "properties": { - "name": { - "type": "string", - "metadata": { - "description": "The name of the private endpoint." - } - }, - "resourceId": { - "type": "string", - "metadata": { - "description": "The resource ID of the private endpoint." - } - }, - "groupId": { - "type": "string", - "nullable": true, - "metadata": { - "description": "The group Id for the private endpoint Group." - } - }, - "customDnsConfigs": { - "type": "array", - "items": { - "type": "object", - "properties": { - "fqdn": { - "type": "string", - "nullable": true, - "metadata": { - "description": "FQDN that resolves to private endpoint IP address." - } - }, - "ipAddresses": { - "type": "array", - "items": { - "type": "string" - }, - "metadata": { - "description": "A list of private IP addresses of the private endpoint." - } - } - } - }, - "metadata": { - "description": "The custom DNS configurations of the private endpoint." - } - }, - "networkInterfaceResourceIds": { - "type": "array", - "items": { - "type": "string" - }, - "metadata": { - "description": "The IDs of the network interfaces associated with the private endpoint." - } - } - }, - "metadata": { - "__bicep_export!": true - } - }, - "secretsExportConfigurationType": { - "type": "object", - "properties": { - "keyVaultResourceId": { - "type": "string", - "metadata": { - "description": "Required. The key vault name where to store the API Admin keys generated by the modules." - } - }, - "primaryAdminKeyName": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. The primaryAdminKey secret name to create." - } - }, - "secondaryAdminKeyName": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. The secondaryAdminKey secret name to create." - } - } - } - }, - "secretsOutputType": { - "type": "object", - "properties": {}, - "additionalProperties": { - "$ref": "#/definitions/secretSetType", - "metadata": { - "description": "An exported secret's references." - } - } - }, - "authOptionsType": { - "type": "object", - "properties": { - "aadOrApiKey": { - "type": "object", - "properties": { - "aadAuthFailureMode": { - "type": "string", - "allowedValues": [ - "http401WithBearerChallenge", - "http403" - ], - "nullable": true, - "metadata": { - "description": "Optional. Describes what response the data plane API of a search service would send for requests that failed authentication." - } - } - }, - "nullable": true, - "metadata": { - "description": "Optional. Indicates that either the API key or an access token from a Microsoft Entra ID tenant can be used for authentication." - } - }, - "apiKeyOnly": { - "type": "object", - "nullable": true, - "metadata": { - "description": "Optional. Indicates that only the API key can be used for authentication." - } - } - }, - "metadata": { - "__bicep_export!": true - } - }, - "networkRuleSetType": { - "type": "object", - "properties": { - "bypass": { - "type": "string", - "allowedValues": [ - "AzurePortal", - "AzureServices", - "None" - ], - "nullable": true, - "metadata": { - "description": "Optional. Network specific rules that determine how the Azure AI Search service may be reached." - } - }, - "ipRules": { - "type": "array", - "items": { - "$ref": "#/definitions/ipRuleType" - }, - "nullable": true, - "metadata": { - "description": "Optional. A list of IP restriction rules that defines the inbound network(s) with allowing access to the search service endpoint. At the meantime, all other public IP networks are blocked by the firewall. These restriction rules are applied only when the 'publicNetworkAccess' of the search service is 'enabled'; otherwise, traffic over public interface is not allowed even with any public IP rules, and private endpoint connections would be the exclusive access method." - } - } - }, - "metadata": { - "__bicep_export!": true - } - }, - "ipRuleType": { - "type": "object", - "properties": { - "value": { - "type": "string", - "metadata": { - "description": "Required. Value corresponding to a single IPv4 address (eg., 123.1.2.3) or an IP range in CIDR format (eg., 123.1.2.3/24) to be allowed." - } - } - }, - "metadata": { - "__bicep_export!": true - } - }, - "_1.lockType": { - "type": "object", - "properties": { - "name": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. Specify the name of lock." - } - }, - "kind": { - "type": "string", - "allowedValues": [ - "CanNotDelete", - "None", - "ReadOnly" - ], - "nullable": true, - "metadata": { - "description": "Optional. Specify the type of lock." - } - }, - "notes": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. Specify the notes of the lock." - } - } - }, - "metadata": { - "description": "An AVM-aligned type for a lock.", - "__bicep_imported_from!": { - "sourceTemplate": "br:mcr.microsoft.com/bicep/avm/utl/types/avm-common-types:0.6.1" - } - } - }, - "_1.privateEndpointCustomDnsConfigType": { - "type": "object", - "properties": { - "fqdn": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. FQDN that resolves to private endpoint IP address." - } - }, - "ipAddresses": { - "type": "array", - "items": { - "type": "string" - }, - "metadata": { - "description": "Required. A list of private IP addresses of the private endpoint." - } - } - }, - "metadata": { - "__bicep_imported_from!": { - "sourceTemplate": "br:mcr.microsoft.com/bicep/avm/utl/types/avm-common-types:0.6.1" - } - } - }, - "_1.privateEndpointIpConfigurationType": { - "type": "object", - "properties": { - "name": { - "type": "string", - "metadata": { - "description": "Required. The name of the resource that is unique within a resource group." - } - }, - "properties": { - "type": "object", - "properties": { - "groupId": { - "type": "string", - "metadata": { - "description": "Required. The ID of a group obtained from the remote resource that this private endpoint should connect to." - } - }, - "memberName": { - "type": "string", - "metadata": { - "description": "Required. The member name of a group obtained from the remote resource that this private endpoint should connect to." - } - }, - "privateIPAddress": { - "type": "string", - "metadata": { - "description": "Required. A private IP address obtained from the private endpoint's subnet." - } - } - }, - "metadata": { - "description": "Required. Properties of private endpoint IP configurations." - } - } - }, - "metadata": { - "__bicep_imported_from!": { - "sourceTemplate": "br:mcr.microsoft.com/bicep/avm/utl/types/avm-common-types:0.6.1" - } - } - }, - "_1.privateEndpointPrivateDnsZoneGroupType": { - "type": "object", - "properties": { - "name": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. The name of the Private DNS Zone Group." - } - }, - "privateDnsZoneGroupConfigs": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. The name of the private DNS Zone Group config." - } - }, - "privateDnsZoneResourceId": { - "type": "string", - "metadata": { - "description": "Required. The resource id of the private DNS zone." - } - } - } - }, - "metadata": { - "description": "Required. The private DNS Zone Groups to associate the Private Endpoint. A DNS Zone Group can support up to 5 DNS zones." - } - } - }, - "metadata": { - "__bicep_imported_from!": { - "sourceTemplate": "br:mcr.microsoft.com/bicep/avm/utl/types/avm-common-types:0.6.1" - } - } - }, - "_1.roleAssignmentType": { - "type": "object", - "properties": { - "name": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. The name (as GUID) of the role assignment. If not provided, a GUID will be generated." - } - }, - "roleDefinitionIdOrName": { - "type": "string", - "metadata": { - "description": "Required. The role to assign. You can provide either the display name of the role definition, the role definition GUID, or its fully qualified ID in the following format: '/providers/Microsoft.Authorization/roleDefinitions/c2f4ef07-c644-48eb-af81-4b1b4947fb11'." - } - }, - "principalId": { - "type": "string", - "metadata": { - "description": "Required. The principal ID of the principal (user/group/identity) to assign the role to." - } - }, - "principalType": { - "type": "string", - "allowedValues": [ - "Device", - "ForeignGroup", - "Group", - "ServicePrincipal", - "User" - ], - "nullable": true, - "metadata": { - "description": "Optional. The principal type of the assigned principal ID." - } - }, - "description": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. The description of the role assignment." - } - }, - "condition": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. The conditions on the role assignment. This limits the resources it can be assigned to. e.g.: @Resource[Microsoft.Storage/storageAccounts/blobServices/containers:ContainerName] StringEqualsIgnoreCase \"foo_storage_container\"." - } - }, - "conditionVersion": { - "type": "string", - "allowedValues": [ - "2.0" - ], - "nullable": true, - "metadata": { - "description": "Optional. Version of the condition." - } - }, - "delegatedManagedIdentityResourceId": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. The Resource Id of the delegated managed identity resource." - } - } - }, - "metadata": { - "description": "An AVM-aligned type for a role assignment.", - "__bicep_imported_from!": { - "sourceTemplate": "br:mcr.microsoft.com/bicep/avm/utl/types/avm-common-types:0.6.1" - } - } - }, - "diagnosticSettingFullType": { - "type": "object", - "properties": { - "name": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. The name of the diagnostic setting." - } - }, - "logCategoriesAndGroups": { - "type": "array", - "items": { - "type": "object", - "properties": { - "category": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. Name of a Diagnostic Log category for a resource type this setting is applied to. Set the specific logs to collect here." - } - }, - "categoryGroup": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. Name of a Diagnostic Log category group for a resource type this setting is applied to. Set to `allLogs` to collect all logs." - } - }, - "enabled": { - "type": "bool", - "nullable": true, - "metadata": { - "description": "Optional. Enable or disable the category explicitly. Default is `true`." - } - } - } - }, - "nullable": true, - "metadata": { - "description": "Optional. The name of logs that will be streamed. \"allLogs\" includes all possible logs for the resource. Set to `[]` to disable log collection." - } - }, - "metricCategories": { - "type": "array", - "items": { - "type": "object", - "properties": { - "category": { - "type": "string", - "metadata": { - "description": "Required. Name of a Diagnostic Metric category for a resource type this setting is applied to. Set to `AllMetrics` to collect all metrics." - } - }, - "enabled": { - "type": "bool", - "nullable": true, - "metadata": { - "description": "Optional. Enable or disable the category explicitly. Default is `true`." - } - } - } - }, - "nullable": true, - "metadata": { - "description": "Optional. The name of metrics that will be streamed. \"allMetrics\" includes all possible metrics for the resource. Set to `[]` to disable metric collection." - } - }, - "logAnalyticsDestinationType": { - "type": "string", - "allowedValues": [ - "AzureDiagnostics", - "Dedicated" - ], - "nullable": true, - "metadata": { - "description": "Optional. A string indicating whether the export to Log Analytics should use the default destination type, i.e. AzureDiagnostics, or use a destination type." - } - }, - "workspaceResourceId": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. Resource ID of the diagnostic log analytics workspace. For security reasons, it is recommended to set diagnostic settings to send data to either storage account, log analytics workspace or event hub." - } - }, - "storageAccountResourceId": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. Resource ID of the diagnostic storage account. For security reasons, it is recommended to set diagnostic settings to send data to either storage account, log analytics workspace or event hub." - } - }, - "eventHubAuthorizationRuleResourceId": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. Resource ID of the diagnostic event hub authorization rule for the Event Hubs namespace in which the event hub should be created or streamed to." - } - }, - "eventHubName": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. Name of the diagnostic event hub within the namespace to which logs are streamed. Without this, an event hub is created for each log category. For security reasons, it is recommended to set diagnostic settings to send data to either storage account, log analytics workspace or event hub." - } - }, - "marketplacePartnerResourceId": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. The full ARM resource ID of the Marketplace resource to which you would like to send Diagnostic Logs." - } - } - }, - "metadata": { - "description": "An AVM-aligned type for a diagnostic setting. To be used if both logs & metrics are supported by the resource provider.", - "__bicep_imported_from!": { - "sourceTemplate": "br:mcr.microsoft.com/bicep/avm/utl/types/avm-common-types:0.5.1" - } - } - }, - "lockType": { - "type": "object", - "properties": { - "name": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. Specify the name of lock." - } - }, - "kind": { - "type": "string", - "allowedValues": [ - "CanNotDelete", - "None", - "ReadOnly" - ], - "nullable": true, - "metadata": { - "description": "Optional. Specify the type of lock." - } - }, - "notes": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. Specify the notes of the lock." - } - } - }, - "metadata": { - "description": "An AVM-aligned type for a lock.", - "__bicep_imported_from!": { - "sourceTemplate": "br:mcr.microsoft.com/bicep/avm/utl/types/avm-common-types:0.6.0" - } - } - }, - "managedIdentityAllType": { - "type": "object", - "properties": { - "systemAssigned": { - "type": "bool", - "nullable": true, - "metadata": { - "description": "Optional. Enables system assigned managed identity on the resource." - } - }, - "userAssignedResourceIds": { - "type": "array", - "items": { - "type": "string" - }, - "nullable": true, - "metadata": { - "description": "Optional. The resource ID(s) to assign to the resource. Required if a user assigned identity is used for encryption." - } - } - }, - "metadata": { - "description": "An AVM-aligned type for a managed identity configuration. To be used if both a system-assigned & user-assigned identities are supported by the resource provider.", - "__bicep_imported_from!": { - "sourceTemplate": "br:mcr.microsoft.com/bicep/avm/utl/types/avm-common-types:0.5.1" - } - } - }, - "privateEndpointSingleServiceType": { - "type": "object", - "properties": { - "name": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. The name of the Private Endpoint." - } - }, - "location": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. The location to deploy the Private Endpoint to." - } - }, - "privateLinkServiceConnectionName": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. The name of the private link connection to create." - } - }, - "service": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. The subresource to deploy the Private Endpoint for. For example \"vault\" for a Key Vault Private Endpoint." - } - }, - "subnetResourceId": { - "type": "string", - "metadata": { - "description": "Required. Resource ID of the subnet where the endpoint needs to be created." - } - }, - "resourceGroupResourceId": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. The resource ID of the Resource Group the Private Endpoint will be created in. If not specified, the Resource Group of the provided Virtual Network Subnet is used." - } - }, - "privateDnsZoneGroup": { - "$ref": "#/definitions/_1.privateEndpointPrivateDnsZoneGroupType", - "nullable": true, - "metadata": { - "description": "Optional. The private DNS Zone Group to configure for the Private Endpoint." - } - }, - "isManualConnection": { - "type": "bool", - "nullable": true, - "metadata": { - "description": "Optional. If Manual Private Link Connection is required." - } - }, - "manualConnectionRequestMessage": { - "type": "string", - "nullable": true, - "maxLength": 140, - "metadata": { - "description": "Optional. A message passed to the owner of the remote resource with the manual connection request." - } - }, - "customDnsConfigs": { - "type": "array", - "items": { - "$ref": "#/definitions/_1.privateEndpointCustomDnsConfigType" - }, - "nullable": true, - "metadata": { - "description": "Optional. Custom DNS configurations." - } - }, - "ipConfigurations": { - "type": "array", - "items": { - "$ref": "#/definitions/_1.privateEndpointIpConfigurationType" - }, - "nullable": true, - "metadata": { - "description": "Optional. A list of IP configurations of the Private Endpoint. This will be used to map to the first-party Service endpoints." - } - }, - "applicationSecurityGroupResourceIds": { - "type": "array", - "items": { - "type": "string" - }, - "nullable": true, - "metadata": { - "description": "Optional. Application security groups in which the Private Endpoint IP configuration is included." - } - }, - "customNetworkInterfaceName": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. The custom name of the network interface attached to the Private Endpoint." - } - }, - "lock": { - "$ref": "#/definitions/_1.lockType", - "nullable": true, - "metadata": { - "description": "Optional. Specify the type of lock." - } - }, - "roleAssignments": { - "type": "array", - "items": { - "$ref": "#/definitions/_1.roleAssignmentType" - }, - "nullable": true, - "metadata": { - "description": "Optional. Array of role assignments to create." - } - }, - "tags": { - "type": "object", - "nullable": true, - "metadata": { - "__bicep_resource_derived_type!": { - "source": "Microsoft.Network/privateEndpoints@2024-07-01#properties/tags" - }, - "description": "Optional. Tags to be applied on all resources/Resource Groups in this deployment." - } - }, - "enableTelemetry": { - "type": "bool", - "nullable": true, - "metadata": { - "description": "Optional. Enable/Disable usage telemetry for module." - } - } - }, - "metadata": { - "description": "An AVM-aligned type for a private endpoint. To be used if the private endpoint's default service / groupId can be assumed (i.e., for services that only have one Private Endpoint type like 'vault' for key vault).", - "__bicep_imported_from!": { - "sourceTemplate": "br:mcr.microsoft.com/bicep/avm/utl/types/avm-common-types:0.6.1" - } - } - }, - "roleAssignmentType": { - "type": "object", - "properties": { - "name": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. The name (as GUID) of the role assignment. If not provided, a GUID will be generated." - } - }, - "roleDefinitionIdOrName": { - "type": "string", - "metadata": { - "description": "Required. The role to assign. You can provide either the display name of the role definition, the role definition GUID, or its fully qualified ID in the following format: '/providers/Microsoft.Authorization/roleDefinitions/c2f4ef07-c644-48eb-af81-4b1b4947fb11'." - } - }, - "principalId": { - "type": "string", - "metadata": { - "description": "Required. The principal ID of the principal (user/group/identity) to assign the role to." - } - }, - "principalType": { - "type": "string", - "allowedValues": [ - "Device", - "ForeignGroup", - "Group", - "ServicePrincipal", - "User" - ], - "nullable": true, - "metadata": { - "description": "Optional. The principal type of the assigned principal ID." - } - }, - "description": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. The description of the role assignment." - } - }, - "condition": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. The conditions on the role assignment. This limits the resources it can be assigned to. e.g.: @Resource[Microsoft.Storage/storageAccounts/blobServices/containers:ContainerName] StringEqualsIgnoreCase \"foo_storage_container\"." - } - }, - "conditionVersion": { - "type": "string", - "allowedValues": [ - "2.0" - ], - "nullable": true, - "metadata": { - "description": "Optional. Version of the condition." - } - }, - "delegatedManagedIdentityResourceId": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. The Resource Id of the delegated managed identity resource." - } - } - }, - "metadata": { - "description": "An AVM-aligned type for a role assignment.", - "__bicep_imported_from!": { - "sourceTemplate": "br:mcr.microsoft.com/bicep/avm/utl/types/avm-common-types:0.5.1" - } - } - }, - "secretSetType": { - "type": "object", - "properties": { - "secretResourceId": { - "type": "string", - "metadata": { - "description": "The resourceId of the exported secret." - } - }, - "secretUri": { - "type": "string", - "metadata": { - "description": "The secret URI of the exported secret." - } - } - }, - "metadata": { - "__bicep_imported_from!": { - "sourceTemplate": "modules/keyVaultExport.bicep" - } - } - } - }, - "parameters": { - "name": { - "type": "string", - "metadata": { - "description": "Required. The name of the Azure Cognitive Search service to create or update. Search service names must only contain lowercase letters, digits or dashes, cannot use dash as the first two or last one characters, cannot contain consecutive dashes, and must be between 2 and 60 characters in length. Search service names must be globally unique since they are part of the service URI (https://.search.windows.net). You cannot change the service name after the service is created." - } - }, - "authOptions": { - "$ref": "#/definitions/authOptionsType", - "nullable": true, - "metadata": { - "description": "Optional. Defines the options for how the data plane API of a Search service authenticates requests. Must remain an empty object {} if 'disableLocalAuth' is set to true." - } - }, - "disableLocalAuth": { - "type": "bool", - "defaultValue": true, - "metadata": { - "description": "Optional. When set to true, calls to the search service will not be permitted to utilize API keys for authentication. This cannot be set to true if 'authOptions' are defined." - } - }, - "enableTelemetry": { - "type": "bool", - "defaultValue": true, - "metadata": { - "description": "Optional. Enable/Disable usage telemetry for module." - } - }, - "cmkEnforcement": { - "type": "string", - "defaultValue": "Unspecified", - "allowedValues": [ - "Disabled", - "Enabled", - "Unspecified" - ], - "metadata": { - "description": "Optional. Describes a policy that determines how resources within the search service are to be encrypted with Customer Managed Keys." - } - }, - "hostingMode": { - "type": "string", - "defaultValue": "default", - "allowedValues": [ - "default", - "highDensity" - ], - "metadata": { - "description": "Optional. Applicable only for the standard3 SKU. You can set this property to enable up to 3 high density partitions that allow up to 1000 indexes, which is much higher than the maximum indexes allowed for any other SKU. For the standard3 SKU, the value is either 'default' or 'highDensity'. For all other SKUs, this value must be 'default'." - } - }, - "location": { - "type": "string", - "defaultValue": "[resourceGroup().location]", - "metadata": { - "description": "Optional. Location for all Resources." - } - }, - "lock": { - "$ref": "#/definitions/lockType", - "nullable": true, - "metadata": { - "description": "Optional. The lock settings for all Resources in the solution." - } - }, - "networkRuleSet": { - "$ref": "#/definitions/networkRuleSetType", - "nullable": true, - "metadata": { - "description": "Optional. Network specific rules that determine how the Azure Cognitive Search service may be reached." - } - }, - "partitionCount": { - "type": "int", - "defaultValue": 1, - "minValue": 1, - "maxValue": 12, - "metadata": { - "description": "Optional. The number of partitions in the search service; if specified, it can be 1, 2, 3, 4, 6, or 12. Values greater than 1 are only valid for standard SKUs. For 'standard3' services with hostingMode set to 'highDensity', the allowed values are between 1 and 3." - } - }, - "privateEndpoints": { - "type": "array", - "items": { - "$ref": "#/definitions/privateEndpointSingleServiceType" - }, - "nullable": true, - "metadata": { - "description": "Optional. Configuration details for private endpoints. For security reasons, it is recommended to use private endpoints whenever possible." - } - }, - "sharedPrivateLinkResources": { - "type": "array", - "defaultValue": [], - "metadata": { - "description": "Optional. The sharedPrivateLinkResources to create as part of the search Service." - } - }, - "publicNetworkAccess": { - "type": "string", - "defaultValue": "Enabled", - "allowedValues": [ - "Enabled", - "Disabled" - ], - "metadata": { - "description": "Optional. This value can be set to 'Enabled' to avoid breaking changes on existing customer resources and templates. If set to 'Disabled', traffic over public interface is not allowed, and private endpoint connections would be the exclusive access method." - } - }, - "secretsExportConfiguration": { - "$ref": "#/definitions/secretsExportConfigurationType", - "nullable": true, - "metadata": { - "description": "Optional. Key vault reference and secret settings for the module's secrets export." - } - }, - "replicaCount": { - "type": "int", - "defaultValue": 3, - "minValue": 1, - "maxValue": 12, - "metadata": { - "description": "Optional. The number of replicas in the search service. If specified, it must be a value between 1 and 12 inclusive for standard SKUs or between 1 and 3 inclusive for basic SKU." - } - }, - "roleAssignments": { - "type": "array", - "items": { - "$ref": "#/definitions/roleAssignmentType" - }, - "nullable": true, - "metadata": { - "description": "Optional. Array of role assignments to create." - } - }, - "semanticSearch": { - "type": "string", - "nullable": true, - "allowedValues": [ - "disabled", - "free", - "standard" - ], - "metadata": { - "description": "Optional. Sets options that control the availability of semantic search. This configuration is only possible for certain search SKUs in certain locations." - } - }, - "sku": { - "type": "string", - "defaultValue": "standard", - "allowedValues": [ - "basic", - "free", - "standard", - "standard2", - "standard3", - "storage_optimized_l1", - "storage_optimized_l2" - ], - "metadata": { - "description": "Optional. Defines the SKU of an Azure Cognitive Search Service, which determines price tier and capacity limits." - } - }, - "managedIdentities": { - "$ref": "#/definitions/managedIdentityAllType", - "nullable": true, - "metadata": { - "description": "Optional. The managed identity definition for this resource." - } - }, - "diagnosticSettings": { - "type": "array", - "items": { - "$ref": "#/definitions/diagnosticSettingFullType" - }, - "nullable": true, - "metadata": { - "description": "Optional. The diagnostic settings of the service." - } - }, - "tags": { - "type": "object", - "metadata": { - "__bicep_resource_derived_type!": { - "source": "Microsoft.Search/searchServices@2025-02-01-preview#properties/tags" - }, - "description": "Optional. Tags to help categorize the resource in the Azure portal." - }, - "nullable": true - } - }, - "variables": { - "copy": [ - { - "name": "formattedRoleAssignments", - "count": "[length(coalesce(parameters('roleAssignments'), createArray()))]", - "input": "[union(coalesce(parameters('roleAssignments'), createArray())[copyIndex('formattedRoleAssignments')], createObject('roleDefinitionId', coalesce(tryGet(variables('builtInRoleNames'), coalesce(parameters('roleAssignments'), createArray())[copyIndex('formattedRoleAssignments')].roleDefinitionIdOrName), if(contains(coalesce(parameters('roleAssignments'), createArray())[copyIndex('formattedRoleAssignments')].roleDefinitionIdOrName, '/providers/Microsoft.Authorization/roleDefinitions/'), coalesce(parameters('roleAssignments'), createArray())[copyIndex('formattedRoleAssignments')].roleDefinitionIdOrName, subscriptionResourceId('Microsoft.Authorization/roleDefinitions', coalesce(parameters('roleAssignments'), createArray())[copyIndex('formattedRoleAssignments')].roleDefinitionIdOrName)))))]" - } - ], - "enableReferencedModulesTelemetry": false, - "formattedUserAssignedIdentities": "[reduce(map(coalesce(tryGet(parameters('managedIdentities'), 'userAssignedResourceIds'), createArray()), lambda('id', createObject(format('{0}', lambdaVariables('id')), createObject()))), createObject(), lambda('cur', 'next', union(lambdaVariables('cur'), lambdaVariables('next'))))]", - "identity": "[if(not(empty(parameters('managedIdentities'))), createObject('type', if(coalesce(tryGet(parameters('managedIdentities'), 'systemAssigned'), false()), if(not(empty(coalesce(tryGet(parameters('managedIdentities'), 'userAssignedResourceIds'), createObject()))), 'SystemAssigned,UserAssigned', 'SystemAssigned'), if(not(empty(coalesce(tryGet(parameters('managedIdentities'), 'userAssignedResourceIds'), createObject()))), 'UserAssigned', '')), 'userAssignedIdentities', if(not(empty(variables('formattedUserAssignedIdentities'))), variables('formattedUserAssignedIdentities'), null())), null())]", - "builtInRoleNames": { - "Contributor": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]", - "Owner": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '8e3af657-a8ff-443c-a75c-2fe8c4bcb635')]", - "Reader": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]", - "Role Based Access Control Administrator": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'f58310d9-a9f6-439a-9e8d-f62e7b41a168')]", - "Search Index Data Contributor": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '8ebe5a00-799e-43f5-93ac-243d3dce84a7')]", - "Search Index Data Reader": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '1407120a-92aa-4202-b7e9-c0e197c71c8f')]", - "Search Service Contributor": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '7ca78c08-252a-4471-8644-bb5ff32d4ba0')]", - "User Access Administrator": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '18d7d88d-d35e-4fb5-a5c3-7773c20a72d9')]" - } - }, - "resources": { - "avmTelemetry": { - "condition": "[parameters('enableTelemetry')]", - "type": "Microsoft.Resources/deployments", - "apiVersion": "2024-03-01", - "name": "[format('46d3xbcp.res.search-searchservice.{0}.{1}', replace('0.11.1', '.', '-'), substring(uniqueString(deployment().name, parameters('location')), 0, 4))]", - "properties": { - "mode": "Incremental", - "template": { - "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", - "contentVersion": "1.0.0.0", - "resources": [], - "outputs": { - "telemetry": { - "type": "String", - "value": "For more information, see https://aka.ms/avm/TelemetryInfo" - } - } - } - } - }, - "searchService": { - "type": "Microsoft.Search/searchServices", - "apiVersion": "2025-02-01-preview", - "name": "[parameters('name')]", - "location": "[parameters('location')]", - "sku": { - "name": "[parameters('sku')]" - }, - "tags": "[parameters('tags')]", - "identity": "[variables('identity')]", - "properties": { - "authOptions": "[parameters('authOptions')]", - "disableLocalAuth": "[parameters('disableLocalAuth')]", - "encryptionWithCmk": { - "enforcement": "[parameters('cmkEnforcement')]" - }, - "hostingMode": "[parameters('hostingMode')]", - "networkRuleSet": "[parameters('networkRuleSet')]", - "partitionCount": "[parameters('partitionCount')]", - "replicaCount": "[parameters('replicaCount')]", - "publicNetworkAccess": "[toLower(parameters('publicNetworkAccess'))]", - "semanticSearch": "[parameters('semanticSearch')]" - } - }, - "searchService_diagnosticSettings": { - "copy": { - "name": "searchService_diagnosticSettings", - "count": "[length(coalesce(parameters('diagnosticSettings'), createArray()))]" - }, - "type": "Microsoft.Insights/diagnosticSettings", - "apiVersion": "2021-05-01-preview", - "scope": "[format('Microsoft.Search/searchServices/{0}', parameters('name'))]", - "name": "[coalesce(tryGet(coalesce(parameters('diagnosticSettings'), createArray())[copyIndex()], 'name'), format('{0}-diagnosticSettings', parameters('name')))]", - "properties": { - "copy": [ - { - "name": "metrics", - "count": "[length(coalesce(tryGet(coalesce(parameters('diagnosticSettings'), createArray())[copyIndex()], 'metricCategories'), createArray(createObject('category', 'AllMetrics'))))]", - "input": { - "category": "[coalesce(tryGet(coalesce(parameters('diagnosticSettings'), createArray())[copyIndex()], 'metricCategories'), createArray(createObject('category', 'AllMetrics')))[copyIndex('metrics')].category]", - "enabled": "[coalesce(tryGet(coalesce(tryGet(coalesce(parameters('diagnosticSettings'), createArray())[copyIndex()], 'metricCategories'), createArray(createObject('category', 'AllMetrics')))[copyIndex('metrics')], 'enabled'), true())]", - "timeGrain": null - } - }, - { - "name": "logs", - "count": "[length(coalesce(tryGet(coalesce(parameters('diagnosticSettings'), createArray())[copyIndex()], 'logCategoriesAndGroups'), createArray(createObject('categoryGroup', 'allLogs'))))]", - "input": { - "categoryGroup": "[tryGet(coalesce(tryGet(coalesce(parameters('diagnosticSettings'), createArray())[copyIndex()], 'logCategoriesAndGroups'), createArray(createObject('categoryGroup', 'allLogs')))[copyIndex('logs')], 'categoryGroup')]", - "category": "[tryGet(coalesce(tryGet(coalesce(parameters('diagnosticSettings'), createArray())[copyIndex()], 'logCategoriesAndGroups'), createArray(createObject('categoryGroup', 'allLogs')))[copyIndex('logs')], 'category')]", - "enabled": "[coalesce(tryGet(coalesce(tryGet(coalesce(parameters('diagnosticSettings'), createArray())[copyIndex()], 'logCategoriesAndGroups'), createArray(createObject('categoryGroup', 'allLogs')))[copyIndex('logs')], 'enabled'), true())]" - } - } - ], - "storageAccountId": "[tryGet(coalesce(parameters('diagnosticSettings'), createArray())[copyIndex()], 'storageAccountResourceId')]", - "workspaceId": "[tryGet(coalesce(parameters('diagnosticSettings'), createArray())[copyIndex()], 'workspaceResourceId')]", - "eventHubAuthorizationRuleId": "[tryGet(coalesce(parameters('diagnosticSettings'), createArray())[copyIndex()], 'eventHubAuthorizationRuleResourceId')]", - "eventHubName": "[tryGet(coalesce(parameters('diagnosticSettings'), createArray())[copyIndex()], 'eventHubName')]", - "marketplacePartnerId": "[tryGet(coalesce(parameters('diagnosticSettings'), createArray())[copyIndex()], 'marketplacePartnerResourceId')]", - "logAnalyticsDestinationType": "[tryGet(coalesce(parameters('diagnosticSettings'), createArray())[copyIndex()], 'logAnalyticsDestinationType')]" - }, - "dependsOn": [ - "searchService" - ] - }, - "searchService_lock": { - "condition": "[and(not(empty(coalesce(parameters('lock'), createObject()))), not(equals(tryGet(parameters('lock'), 'kind'), 'None')))]", - "type": "Microsoft.Authorization/locks", - "apiVersion": "2020-05-01", - "scope": "[format('Microsoft.Search/searchServices/{0}', parameters('name'))]", - "name": "[coalesce(tryGet(parameters('lock'), 'name'), format('lock-{0}', parameters('name')))]", - "properties": { - "level": "[coalesce(tryGet(parameters('lock'), 'kind'), '')]", - "notes": "[coalesce(tryGet(parameters('lock'), 'notes'), if(equals(tryGet(parameters('lock'), 'kind'), 'CanNotDelete'), 'Cannot delete resource or child resources.', 'Cannot delete or modify the resource or child resources.'))]" - }, - "dependsOn": [ - "searchService" - ] - }, - "searchService_roleAssignments": { - "copy": { - "name": "searchService_roleAssignments", - "count": "[length(coalesce(variables('formattedRoleAssignments'), createArray()))]" - }, - "type": "Microsoft.Authorization/roleAssignments", - "apiVersion": "2022-04-01", - "scope": "[format('Microsoft.Search/searchServices/{0}', parameters('name'))]", - "name": "[coalesce(tryGet(coalesce(variables('formattedRoleAssignments'), createArray())[copyIndex()], 'name'), guid(resourceId('Microsoft.Search/searchServices', parameters('name')), coalesce(variables('formattedRoleAssignments'), createArray())[copyIndex()].principalId, coalesce(variables('formattedRoleAssignments'), createArray())[copyIndex()].roleDefinitionId))]", - "properties": { - "roleDefinitionId": "[coalesce(variables('formattedRoleAssignments'), createArray())[copyIndex()].roleDefinitionId]", - "principalId": "[coalesce(variables('formattedRoleAssignments'), createArray())[copyIndex()].principalId]", - "description": "[tryGet(coalesce(variables('formattedRoleAssignments'), createArray())[copyIndex()], 'description')]", - "principalType": "[tryGet(coalesce(variables('formattedRoleAssignments'), createArray())[copyIndex()], 'principalType')]", - "condition": "[tryGet(coalesce(variables('formattedRoleAssignments'), createArray())[copyIndex()], 'condition')]", - "conditionVersion": "[if(not(empty(tryGet(coalesce(variables('formattedRoleAssignments'), createArray())[copyIndex()], 'condition'))), coalesce(tryGet(coalesce(variables('formattedRoleAssignments'), createArray())[copyIndex()], 'conditionVersion'), '2.0'), null())]", - "delegatedManagedIdentityResourceId": "[tryGet(coalesce(variables('formattedRoleAssignments'), createArray())[copyIndex()], 'delegatedManagedIdentityResourceId')]" - }, - "dependsOn": [ - "searchService" - ] - }, - "searchService_privateEndpoints": { - "copy": { - "name": "searchService_privateEndpoints", - "count": "[length(coalesce(parameters('privateEndpoints'), createArray()))]" - }, - "type": "Microsoft.Resources/deployments", - "apiVersion": "2022-09-01", - "name": "[format('{0}-searchService-PrivateEndpoint-{1}', uniqueString(deployment().name, parameters('location')), copyIndex())]", - "subscriptionId": "[split(coalesce(tryGet(coalesce(parameters('privateEndpoints'), createArray())[copyIndex()], 'resourceGroupResourceId'), resourceGroup().id), '/')[2]]", - "resourceGroup": "[split(coalesce(tryGet(coalesce(parameters('privateEndpoints'), createArray())[copyIndex()], 'resourceGroupResourceId'), resourceGroup().id), '/')[4]]", - "properties": { - "expressionEvaluationOptions": { - "scope": "inner" - }, - "mode": "Incremental", - "parameters": { - "name": { - "value": "[coalesce(tryGet(coalesce(parameters('privateEndpoints'), createArray())[copyIndex()], 'name'), format('pep-{0}-{1}-{2}', last(split(resourceId('Microsoft.Search/searchServices', parameters('name')), '/')), coalesce(tryGet(coalesce(parameters('privateEndpoints'), createArray())[copyIndex()], 'service'), 'searchService'), copyIndex()))]" - }, - "privateLinkServiceConnections": "[if(not(equals(tryGet(coalesce(parameters('privateEndpoints'), createArray())[copyIndex()], 'isManualConnection'), true())), createObject('value', createArray(createObject('name', coalesce(tryGet(coalesce(parameters('privateEndpoints'), createArray())[copyIndex()], 'privateLinkServiceConnectionName'), format('{0}-{1}-{2}', last(split(resourceId('Microsoft.Search/searchServices', parameters('name')), '/')), coalesce(tryGet(coalesce(parameters('privateEndpoints'), createArray())[copyIndex()], 'service'), 'searchService'), copyIndex())), 'properties', createObject('privateLinkServiceId', resourceId('Microsoft.Search/searchServices', parameters('name')), 'groupIds', createArray(coalesce(tryGet(coalesce(parameters('privateEndpoints'), createArray())[copyIndex()], 'service'), 'searchService')))))), createObject('value', null()))]", - "manualPrivateLinkServiceConnections": "[if(equals(tryGet(coalesce(parameters('privateEndpoints'), createArray())[copyIndex()], 'isManualConnection'), true()), createObject('value', createArray(createObject('name', coalesce(tryGet(coalesce(parameters('privateEndpoints'), createArray())[copyIndex()], 'privateLinkServiceConnectionName'), format('{0}-{1}-{2}', last(split(resourceId('Microsoft.Search/searchServices', parameters('name')), '/')), coalesce(tryGet(coalesce(parameters('privateEndpoints'), createArray())[copyIndex()], 'service'), 'searchService'), copyIndex())), 'properties', createObject('privateLinkServiceId', resourceId('Microsoft.Search/searchServices', parameters('name')), 'groupIds', createArray(coalesce(tryGet(coalesce(parameters('privateEndpoints'), createArray())[copyIndex()], 'service'), 'searchService')), 'requestMessage', coalesce(tryGet(coalesce(parameters('privateEndpoints'), createArray())[copyIndex()], 'manualConnectionRequestMessage'), 'Manual approval required.'))))), createObject('value', null()))]", - "subnetResourceId": { - "value": "[coalesce(parameters('privateEndpoints'), createArray())[copyIndex()].subnetResourceId]" - }, - "enableTelemetry": { - "value": "[variables('enableReferencedModulesTelemetry')]" - }, - "location": { - "value": "[coalesce(tryGet(coalesce(parameters('privateEndpoints'), createArray())[copyIndex()], 'location'), reference(split(coalesce(parameters('privateEndpoints'), createArray())[copyIndex()].subnetResourceId, '/subnets/')[0], '2020-06-01', 'Full').location)]" - }, - "lock": { - "value": "[coalesce(tryGet(coalesce(parameters('privateEndpoints'), createArray())[copyIndex()], 'lock'), parameters('lock'))]" - }, - "privateDnsZoneGroup": { - "value": "[tryGet(coalesce(parameters('privateEndpoints'), createArray())[copyIndex()], 'privateDnsZoneGroup')]" - }, - "roleAssignments": { - "value": "[tryGet(coalesce(parameters('privateEndpoints'), createArray())[copyIndex()], 'roleAssignments')]" - }, - "tags": { - "value": "[coalesce(tryGet(coalesce(parameters('privateEndpoints'), createArray())[copyIndex()], 'tags'), parameters('tags'))]" - }, - "customDnsConfigs": { - "value": "[tryGet(coalesce(parameters('privateEndpoints'), createArray())[copyIndex()], 'customDnsConfigs')]" - }, - "ipConfigurations": { - "value": "[tryGet(coalesce(parameters('privateEndpoints'), createArray())[copyIndex()], 'ipConfigurations')]" - }, - "applicationSecurityGroupResourceIds": { - "value": "[tryGet(coalesce(parameters('privateEndpoints'), createArray())[copyIndex()], 'applicationSecurityGroupResourceIds')]" - }, - "customNetworkInterfaceName": { - "value": "[tryGet(coalesce(parameters('privateEndpoints'), createArray())[copyIndex()], 'customNetworkInterfaceName')]" - } - }, - "template": { - "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", - "languageVersion": "2.0", - "contentVersion": "1.0.0.0", - "metadata": { - "_generator": { - "name": "bicep", - "version": "0.34.44.8038", - "templateHash": "12389807800450456797" - }, - "name": "Private Endpoints", - "description": "This module deploys a Private Endpoint." - }, - "definitions": { - "privateDnsZoneGroupType": { - "type": "object", - "properties": { - "name": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. The name of the Private DNS Zone Group." - } - }, - "privateDnsZoneGroupConfigs": { - "type": "array", - "items": { - "$ref": "#/definitions/privateDnsZoneGroupConfigType" - }, - "metadata": { - "description": "Required. The private DNS zone groups to associate the private endpoint. A DNS zone group can support up to 5 DNS zones." - } - } - }, - "metadata": { - "__bicep_export!": true - } - }, - "ipConfigurationType": { - "type": "object", - "properties": { - "name": { - "type": "string", - "metadata": { - "description": "Required. The name of the resource that is unique within a resource group." - } - }, - "properties": { - "type": "object", - "properties": { - "groupId": { - "type": "string", - "metadata": { - "description": "Required. The ID of a group obtained from the remote resource that this private endpoint should connect to. If used with private link service connection, this property must be defined as empty string." - } - }, - "memberName": { - "type": "string", - "metadata": { - "description": "Required. The member name of a group obtained from the remote resource that this private endpoint should connect to. If used with private link service connection, this property must be defined as empty string." - } - }, - "privateIPAddress": { - "type": "string", - "metadata": { - "description": "Required. A private IP address obtained from the private endpoint's subnet." - } - } - }, - "metadata": { - "description": "Required. Properties of private endpoint IP configurations." - } - } - }, - "metadata": { - "__bicep_export!": true - } - }, - "privateLinkServiceConnectionType": { - "type": "object", - "properties": { - "name": { - "type": "string", - "metadata": { - "description": "Required. The name of the private link service connection." - } - }, - "properties": { - "type": "object", - "properties": { - "groupIds": { - "type": "array", - "items": { - "type": "string" - }, - "metadata": { - "description": "Required. The ID of a group obtained from the remote resource that this private endpoint should connect to. If used with private link service connection, this property must be defined as empty string array `[]`." - } - }, - "privateLinkServiceId": { - "type": "string", - "metadata": { - "description": "Required. The resource id of private link service." - } - }, - "requestMessage": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. A message passed to the owner of the remote resource with this connection request. Restricted to 140 chars." - } - } - }, - "metadata": { - "description": "Required. Properties of private link service connection." - } - } - }, - "metadata": { - "__bicep_export!": true - } - }, - "customDnsConfigType": { - "type": "object", - "properties": { - "fqdn": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. FQDN that resolves to private endpoint IP address." - } - }, - "ipAddresses": { - "type": "array", - "items": { - "type": "string" - }, - "metadata": { - "description": "Required. A list of private IP addresses of the private endpoint." - } - } - }, - "metadata": { - "__bicep_export!": true - } - }, - "lockType": { - "type": "object", - "properties": { - "name": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. Specify the name of lock." - } - }, - "kind": { - "type": "string", - "allowedValues": [ - "CanNotDelete", - "None", - "ReadOnly" - ], - "nullable": true, - "metadata": { - "description": "Optional. Specify the type of lock." - } - } - }, - "metadata": { - "description": "An AVM-aligned type for a lock.", - "__bicep_imported_from!": { - "sourceTemplate": "br:mcr.microsoft.com/bicep/avm/utl/types/avm-common-types:0.5.1" - } - } - }, - "privateDnsZoneGroupConfigType": { - "type": "object", - "properties": { - "name": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. The name of the private DNS zone group config." - } - }, - "privateDnsZoneResourceId": { - "type": "string", - "metadata": { - "description": "Required. The resource id of the private DNS zone." - } - } - }, - "metadata": { - "__bicep_imported_from!": { - "sourceTemplate": "private-dns-zone-group/main.bicep" - } - } - }, - "roleAssignmentType": { - "type": "object", - "properties": { - "name": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. The name (as GUID) of the role assignment. If not provided, a GUID will be generated." - } - }, - "roleDefinitionIdOrName": { - "type": "string", - "metadata": { - "description": "Required. The role to assign. You can provide either the display name of the role definition, the role definition GUID, or its fully qualified ID in the following format: '/providers/Microsoft.Authorization/roleDefinitions/c2f4ef07-c644-48eb-af81-4b1b4947fb11'." - } - }, - "principalId": { - "type": "string", - "metadata": { - "description": "Required. The principal ID of the principal (user/group/identity) to assign the role to." - } - }, - "principalType": { - "type": "string", - "allowedValues": [ - "Device", - "ForeignGroup", - "Group", - "ServicePrincipal", - "User" - ], - "nullable": true, - "metadata": { - "description": "Optional. The principal type of the assigned principal ID." - } - }, - "description": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. The description of the role assignment." - } - }, - "condition": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. The conditions on the role assignment. This limits the resources it can be assigned to. e.g.: @Resource[Microsoft.Storage/storageAccounts/blobServices/containers:ContainerName] StringEqualsIgnoreCase \"foo_storage_container\"." - } - }, - "conditionVersion": { - "type": "string", - "allowedValues": [ - "2.0" - ], - "nullable": true, - "metadata": { - "description": "Optional. Version of the condition." - } - }, - "delegatedManagedIdentityResourceId": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. The Resource Id of the delegated managed identity resource." - } - } - }, - "metadata": { - "description": "An AVM-aligned type for a role assignment.", - "__bicep_imported_from!": { - "sourceTemplate": "br:mcr.microsoft.com/bicep/avm/utl/types/avm-common-types:0.5.1" - } - } - } - }, - "parameters": { - "name": { - "type": "string", - "metadata": { - "description": "Required. Name of the private endpoint resource to create." - } - }, - "subnetResourceId": { - "type": "string", - "metadata": { - "description": "Required. Resource ID of the subnet where the endpoint needs to be created." - } - }, - "applicationSecurityGroupResourceIds": { - "type": "array", - "items": { - "type": "string" - }, - "nullable": true, - "metadata": { - "description": "Optional. Application security groups in which the private endpoint IP configuration is included." - } - }, - "customNetworkInterfaceName": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. The custom name of the network interface attached to the private endpoint." - } - }, - "ipConfigurations": { - "type": "array", - "items": { - "$ref": "#/definitions/ipConfigurationType" - }, - "nullable": true, - "metadata": { - "description": "Optional. A list of IP configurations of the private endpoint. This will be used to map to the First Party Service endpoints." - } - }, - "privateDnsZoneGroup": { - "$ref": "#/definitions/privateDnsZoneGroupType", - "nullable": true, - "metadata": { - "description": "Optional. The private DNS zone group to configure for the private endpoint." - } - }, - "location": { - "type": "string", - "defaultValue": "[resourceGroup().location]", - "metadata": { - "description": "Optional. Location for all Resources." - } - }, - "lock": { - "$ref": "#/definitions/lockType", - "nullable": true, - "metadata": { - "description": "Optional. The lock settings of the service." - } - }, - "roleAssignments": { - "type": "array", - "items": { - "$ref": "#/definitions/roleAssignmentType" - }, - "nullable": true, - "metadata": { - "description": "Optional. Array of role assignments to create." - } - }, - "tags": { - "type": "object", - "nullable": true, - "metadata": { - "description": "Optional. Tags to be applied on all resources/resource groups in this deployment." - } - }, - "customDnsConfigs": { - "type": "array", - "items": { - "$ref": "#/definitions/customDnsConfigType" - }, - "nullable": true, - "metadata": { - "description": "Optional. Custom DNS configurations." - } - }, - "manualPrivateLinkServiceConnections": { - "type": "array", - "items": { - "$ref": "#/definitions/privateLinkServiceConnectionType" - }, - "nullable": true, - "metadata": { - "description": "Conditional. A grouping of information about the connection to the remote resource. Used when the network admin does not have access to approve connections to the remote resource. Required if `privateLinkServiceConnections` is empty." - } - }, - "privateLinkServiceConnections": { - "type": "array", - "items": { - "$ref": "#/definitions/privateLinkServiceConnectionType" - }, - "nullable": true, - "metadata": { - "description": "Conditional. A grouping of information about the connection to the remote resource. Required if `manualPrivateLinkServiceConnections` is empty." - } - }, - "enableTelemetry": { - "type": "bool", - "defaultValue": true, - "metadata": { - "description": "Optional. Enable/Disable usage telemetry for module." - } - } - }, - "variables": { - "copy": [ - { - "name": "formattedRoleAssignments", - "count": "[length(coalesce(parameters('roleAssignments'), createArray()))]", - "input": "[union(coalesce(parameters('roleAssignments'), createArray())[copyIndex('formattedRoleAssignments')], createObject('roleDefinitionId', coalesce(tryGet(variables('builtInRoleNames'), coalesce(parameters('roleAssignments'), createArray())[copyIndex('formattedRoleAssignments')].roleDefinitionIdOrName), if(contains(coalesce(parameters('roleAssignments'), createArray())[copyIndex('formattedRoleAssignments')].roleDefinitionIdOrName, '/providers/Microsoft.Authorization/roleDefinitions/'), coalesce(parameters('roleAssignments'), createArray())[copyIndex('formattedRoleAssignments')].roleDefinitionIdOrName, subscriptionResourceId('Microsoft.Authorization/roleDefinitions', coalesce(parameters('roleAssignments'), createArray())[copyIndex('formattedRoleAssignments')].roleDefinitionIdOrName)))))]" - } - ], - "builtInRoleNames": { - "Contributor": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]", - "DNS Resolver Contributor": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '0f2ebee7-ffd4-4fc0-b3b7-664099fdad5d')]", - "DNS Zone Contributor": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'befefa01-2a29-4197-83a8-272ff33ce314')]", - "Domain Services Contributor": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'eeaeda52-9324-47f6-8069-5d5bade478b2')]", - "Domain Services Reader": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '361898ef-9ed1-48c2-849c-a832951106bb')]", - "Network Contributor": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '4d97b98b-1d4f-4787-a291-c67834d212e7')]", - "Owner": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '8e3af657-a8ff-443c-a75c-2fe8c4bcb635')]", - "Private DNS Zone Contributor": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'b12aa53e-6015-4669-85d0-8515ebb3ae7f')]", - "Reader": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]", - "Role Based Access Control Administrator": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'f58310d9-a9f6-439a-9e8d-f62e7b41a168')]" - } - }, - "resources": { - "avmTelemetry": { - "condition": "[parameters('enableTelemetry')]", - "type": "Microsoft.Resources/deployments", - "apiVersion": "2024-03-01", - "name": "[format('46d3xbcp.res.network-privateendpoint.{0}.{1}', replace('0.11.0', '.', '-'), substring(uniqueString(deployment().name, parameters('location')), 0, 4))]", - "properties": { - "mode": "Incremental", - "template": { - "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", - "contentVersion": "1.0.0.0", - "resources": [], - "outputs": { - "telemetry": { - "type": "String", - "value": "For more information, see https://aka.ms/avm/TelemetryInfo" - } - } - } - } - }, - "privateEndpoint": { - "type": "Microsoft.Network/privateEndpoints", - "apiVersion": "2024-05-01", - "name": "[parameters('name')]", - "location": "[parameters('location')]", - "tags": "[parameters('tags')]", - "properties": { - "copy": [ - { - "name": "applicationSecurityGroups", - "count": "[length(coalesce(parameters('applicationSecurityGroupResourceIds'), createArray()))]", - "input": { - "id": "[coalesce(parameters('applicationSecurityGroupResourceIds'), createArray())[copyIndex('applicationSecurityGroups')]]" - } - } - ], - "customDnsConfigs": "[coalesce(parameters('customDnsConfigs'), createArray())]", - "customNetworkInterfaceName": "[coalesce(parameters('customNetworkInterfaceName'), '')]", - "ipConfigurations": "[coalesce(parameters('ipConfigurations'), createArray())]", - "manualPrivateLinkServiceConnections": "[coalesce(parameters('manualPrivateLinkServiceConnections'), createArray())]", - "privateLinkServiceConnections": "[coalesce(parameters('privateLinkServiceConnections'), createArray())]", - "subnet": { - "id": "[parameters('subnetResourceId')]" - } - } - }, - "privateEndpoint_lock": { - "condition": "[and(not(empty(coalesce(parameters('lock'), createObject()))), not(equals(tryGet(parameters('lock'), 'kind'), 'None')))]", - "type": "Microsoft.Authorization/locks", - "apiVersion": "2020-05-01", - "scope": "[format('Microsoft.Network/privateEndpoints/{0}', parameters('name'))]", - "name": "[coalesce(tryGet(parameters('lock'), 'name'), format('lock-{0}', parameters('name')))]", - "properties": { - "level": "[coalesce(tryGet(parameters('lock'), 'kind'), '')]", - "notes": "[if(equals(tryGet(parameters('lock'), 'kind'), 'CanNotDelete'), 'Cannot delete resource or child resources.', 'Cannot delete or modify the resource or child resources.')]" - }, - "dependsOn": [ - "privateEndpoint" - ] - }, - "privateEndpoint_roleAssignments": { - "copy": { - "name": "privateEndpoint_roleAssignments", - "count": "[length(coalesce(variables('formattedRoleAssignments'), createArray()))]" - }, - "type": "Microsoft.Authorization/roleAssignments", - "apiVersion": "2022-04-01", - "scope": "[format('Microsoft.Network/privateEndpoints/{0}', parameters('name'))]", - "name": "[coalesce(tryGet(coalesce(variables('formattedRoleAssignments'), createArray())[copyIndex()], 'name'), guid(resourceId('Microsoft.Network/privateEndpoints', parameters('name')), coalesce(variables('formattedRoleAssignments'), createArray())[copyIndex()].principalId, coalesce(variables('formattedRoleAssignments'), createArray())[copyIndex()].roleDefinitionId))]", - "properties": { - "roleDefinitionId": "[coalesce(variables('formattedRoleAssignments'), createArray())[copyIndex()].roleDefinitionId]", - "principalId": "[coalesce(variables('formattedRoleAssignments'), createArray())[copyIndex()].principalId]", - "description": "[tryGet(coalesce(variables('formattedRoleAssignments'), createArray())[copyIndex()], 'description')]", - "principalType": "[tryGet(coalesce(variables('formattedRoleAssignments'), createArray())[copyIndex()], 'principalType')]", - "condition": "[tryGet(coalesce(variables('formattedRoleAssignments'), createArray())[copyIndex()], 'condition')]", - "conditionVersion": "[if(not(empty(tryGet(coalesce(variables('formattedRoleAssignments'), createArray())[copyIndex()], 'condition'))), coalesce(tryGet(coalesce(variables('formattedRoleAssignments'), createArray())[copyIndex()], 'conditionVersion'), '2.0'), null())]", - "delegatedManagedIdentityResourceId": "[tryGet(coalesce(variables('formattedRoleAssignments'), createArray())[copyIndex()], 'delegatedManagedIdentityResourceId')]" - }, - "dependsOn": [ - "privateEndpoint" - ] - }, - "privateEndpoint_privateDnsZoneGroup": { - "condition": "[not(empty(parameters('privateDnsZoneGroup')))]", - "type": "Microsoft.Resources/deployments", - "apiVersion": "2022-09-01", - "name": "[format('{0}-PrivateEndpoint-PrivateDnsZoneGroup', uniqueString(deployment().name))]", - "properties": { - "expressionEvaluationOptions": { - "scope": "inner" - }, - "mode": "Incremental", - "parameters": { - "name": { - "value": "[tryGet(parameters('privateDnsZoneGroup'), 'name')]" - }, - "privateEndpointName": { - "value": "[parameters('name')]" - }, - "privateDnsZoneConfigs": { - "value": "[parameters('privateDnsZoneGroup').privateDnsZoneGroupConfigs]" - } - }, - "template": { - "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", - "languageVersion": "2.0", - "contentVersion": "1.0.0.0", - "metadata": { - "_generator": { - "name": "bicep", - "version": "0.34.44.8038", - "templateHash": "13997305779829540948" - }, - "name": "Private Endpoint Private DNS Zone Groups", - "description": "This module deploys a Private Endpoint Private DNS Zone Group." - }, - "definitions": { - "privateDnsZoneGroupConfigType": { - "type": "object", - "properties": { - "name": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. The name of the private DNS zone group config." - } - }, - "privateDnsZoneResourceId": { - "type": "string", - "metadata": { - "description": "Required. The resource id of the private DNS zone." - } - } - }, - "metadata": { - "__bicep_export!": true - } - } - }, - "parameters": { - "privateEndpointName": { - "type": "string", - "metadata": { - "description": "Conditional. The name of the parent private endpoint. Required if the template is used in a standalone deployment." - } - }, - "privateDnsZoneConfigs": { - "type": "array", - "items": { - "$ref": "#/definitions/privateDnsZoneGroupConfigType" - }, - "minLength": 1, - "maxLength": 5, - "metadata": { - "description": "Required. Array of private DNS zone configurations of the private DNS zone group. A DNS zone group can support up to 5 DNS zones." - } - }, - "name": { - "type": "string", - "defaultValue": "default", - "metadata": { - "description": "Optional. The name of the private DNS zone group." - } - } - }, - "variables": { - "copy": [ - { - "name": "privateDnsZoneConfigsVar", - "count": "[length(parameters('privateDnsZoneConfigs'))]", - "input": { - "name": "[coalesce(tryGet(parameters('privateDnsZoneConfigs')[copyIndex('privateDnsZoneConfigsVar')], 'name'), last(split(parameters('privateDnsZoneConfigs')[copyIndex('privateDnsZoneConfigsVar')].privateDnsZoneResourceId, '/')))]", - "properties": { - "privateDnsZoneId": "[parameters('privateDnsZoneConfigs')[copyIndex('privateDnsZoneConfigsVar')].privateDnsZoneResourceId]" - } - } - } - ] - }, - "resources": { - "privateEndpoint": { - "existing": true, - "type": "Microsoft.Network/privateEndpoints", - "apiVersion": "2024-05-01", - "name": "[parameters('privateEndpointName')]" - }, - "privateDnsZoneGroup": { - "type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups", - "apiVersion": "2024-05-01", - "name": "[format('{0}/{1}', parameters('privateEndpointName'), parameters('name'))]", - "properties": { - "privateDnsZoneConfigs": "[variables('privateDnsZoneConfigsVar')]" - } - } - }, - "outputs": { - "name": { - "type": "string", - "metadata": { - "description": "The name of the private endpoint DNS zone group." - }, - "value": "[parameters('name')]" - }, - "resourceId": { - "type": "string", - "metadata": { - "description": "The resource ID of the private endpoint DNS zone group." - }, - "value": "[resourceId('Microsoft.Network/privateEndpoints/privateDnsZoneGroups', parameters('privateEndpointName'), parameters('name'))]" - }, - "resourceGroupName": { - "type": "string", - "metadata": { - "description": "The resource group the private endpoint DNS zone group was deployed into." - }, - "value": "[resourceGroup().name]" - } - } - } - }, - "dependsOn": [ - "privateEndpoint" - ] - } - }, - "outputs": { - "resourceGroupName": { - "type": "string", - "metadata": { - "description": "The resource group the private endpoint was deployed into." - }, - "value": "[resourceGroup().name]" - }, - "resourceId": { - "type": "string", - "metadata": { - "description": "The resource ID of the private endpoint." - }, - "value": "[resourceId('Microsoft.Network/privateEndpoints', parameters('name'))]" - }, - "name": { - "type": "string", - "metadata": { - "description": "The name of the private endpoint." - }, - "value": "[parameters('name')]" - }, - "location": { - "type": "string", - "metadata": { - "description": "The location the resource was deployed into." - }, - "value": "[reference('privateEndpoint', '2024-05-01', 'full').location]" - }, - "customDnsConfigs": { - "type": "array", - "items": { - "$ref": "#/definitions/customDnsConfigType" - }, - "metadata": { - "description": "The custom DNS configurations of the private endpoint." - }, - "value": "[reference('privateEndpoint').customDnsConfigs]" - }, - "networkInterfaceResourceIds": { - "type": "array", - "items": { - "type": "string" - }, - "metadata": { - "description": "The resource IDs of the network interfaces associated with the private endpoint." - }, - "value": "[map(reference('privateEndpoint').networkInterfaces, lambda('nic', lambdaVariables('nic').id))]" - }, - "groupId": { - "type": "string", - "nullable": true, - "metadata": { - "description": "The group Id for the private endpoint Group." - }, - "value": "[coalesce(tryGet(tryGet(tryGet(tryGet(reference('privateEndpoint'), 'manualPrivateLinkServiceConnections'), 0, 'properties'), 'groupIds'), 0), tryGet(tryGet(tryGet(tryGet(reference('privateEndpoint'), 'privateLinkServiceConnections'), 0, 'properties'), 'groupIds'), 0))]" - } - } - } - }, - "dependsOn": [ - "searchService" - ] - }, - "searchService_sharedPrivateLinkResources": { - "copy": { - "name": "searchService_sharedPrivateLinkResources", - "count": "[length(parameters('sharedPrivateLinkResources'))]", - "mode": "serial", - "batchSize": 1 - }, - "type": "Microsoft.Resources/deployments", - "apiVersion": "2022-09-01", - "name": "[format('{0}-searchService-SharedPrvLink-{1}', uniqueString(deployment().name, parameters('location')), copyIndex())]", - "properties": { - "expressionEvaluationOptions": { - "scope": "inner" - }, - "mode": "Incremental", - "parameters": { - "name": { - "value": "[coalesce(tryGet(parameters('sharedPrivateLinkResources')[copyIndex()], 'name'), format('spl-{0}-{1}-{2}', last(split(resourceId('Microsoft.Search/searchServices', parameters('name')), '/')), parameters('sharedPrivateLinkResources')[copyIndex()].groupId, copyIndex()))]" - }, - "searchServiceName": { - "value": "[parameters('name')]" - }, - "privateLinkResourceId": { - "value": "[parameters('sharedPrivateLinkResources')[copyIndex()].privateLinkResourceId]" - }, - "groupId": { - "value": "[parameters('sharedPrivateLinkResources')[copyIndex()].groupId]" - }, - "requestMessage": { - "value": "[parameters('sharedPrivateLinkResources')[copyIndex()].requestMessage]" - }, - "resourceRegion": { - "value": "[tryGet(parameters('sharedPrivateLinkResources')[copyIndex()], 'resourceRegion')]" - } - }, - "template": { - "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", - "languageVersion": "2.0", - "contentVersion": "1.0.0.0", - "metadata": { - "_generator": { - "name": "bicep", - "version": "0.37.4.10188", - "templateHash": "557730297583881254" - }, - "name": "Search Services Private Link Resources", - "description": "This module deploys a Search Service Private Link Resource." - }, - "parameters": { - "searchServiceName": { - "type": "string", - "metadata": { - "description": "Conditional. The name of the parent searchServices. Required if the template is used in a standalone deployment." - } - }, - "name": { - "type": "string", - "metadata": { - "description": "Required. The name of the shared private link resource managed by the Azure Cognitive Search service within the specified resource group." - } - }, - "privateLinkResourceId": { - "type": "string", - "metadata": { - "description": "Required. The resource ID of the resource the shared private link resource is for." - } - }, - "groupId": { - "type": "string", - "metadata": { - "description": "Required. The group ID from the provider of resource the shared private link resource is for." - } - }, - "requestMessage": { - "type": "string", - "metadata": { - "description": "Required. The request message for requesting approval of the shared private link resource." - } - }, - "resourceRegion": { - "type": "string", - "nullable": true, - "metadata": { - "description": "Optional. Can be used to specify the Azure Resource Manager location of the resource to which a shared private link is to be created. This is only required for those resources whose DNS configuration are regional (such as Azure Kubernetes Service)." - } - } - }, - "resources": { - "searchService": { - "existing": true, - "type": "Microsoft.Search/searchServices", - "apiVersion": "2025-02-01-preview", - "name": "[parameters('searchServiceName')]" - }, - "sharedPrivateLinkResource": { - "type": "Microsoft.Search/searchServices/sharedPrivateLinkResources", - "apiVersion": "2025-02-01-preview", - "name": "[format('{0}/{1}', parameters('searchServiceName'), parameters('name'))]", - "properties": { - "privateLinkResourceId": "[parameters('privateLinkResourceId')]", - "groupId": "[parameters('groupId')]", - "requestMessage": "[parameters('requestMessage')]", - "resourceRegion": "[parameters('resourceRegion')]" - } - } - }, - "outputs": { - "name": { - "type": "string", - "metadata": { - "description": "The name of the shared private link resource." - }, - "value": "[parameters('name')]" - }, - "resourceId": { - "type": "string", - "metadata": { - "description": "The resource ID of the shared private link resource." - }, - "value": "[resourceId('Microsoft.Search/searchServices/sharedPrivateLinkResources', parameters('searchServiceName'), parameters('name'))]" - }, - "resourceGroupName": { - "type": "string", - "metadata": { - "description": "The name of the resource group the shared private link resource was created in." - }, - "value": "[resourceGroup().name]" - } - } - } - }, - "dependsOn": [ - "searchService" - ] - }, - "secretsExport": { - "condition": "[not(equals(parameters('secretsExportConfiguration'), null()))]", - "type": "Microsoft.Resources/deployments", - "apiVersion": "2022-09-01", - "name": "[format('{0}-secrets-kv', uniqueString(deployment().name, parameters('location')))]", - "subscriptionId": "[split(tryGet(parameters('secretsExportConfiguration'), 'keyVaultResourceId'), '/')[2]]", - "resourceGroup": "[split(tryGet(parameters('secretsExportConfiguration'), 'keyVaultResourceId'), '/')[4]]", - "properties": { - "expressionEvaluationOptions": { - "scope": "inner" - }, - "mode": "Incremental", - "parameters": { - "keyVaultName": { - "value": "[last(split(tryGet(parameters('secretsExportConfiguration'), 'keyVaultResourceId'), '/'))]" - }, - "secretsToSet": { - "value": "[union(createArray(), if(contains(parameters('secretsExportConfiguration'), 'primaryAdminKeyName'), createArray(createObject('name', tryGet(parameters('secretsExportConfiguration'), 'primaryAdminKeyName'), 'value', listAdminKeys('searchService', '2025-02-01-preview').primaryKey)), createArray()), if(contains(parameters('secretsExportConfiguration'), 'secondaryAdminKeyName'), createArray(createObject('name', tryGet(parameters('secretsExportConfiguration'), 'secondaryAdminKeyName'), 'value', listAdminKeys('searchService', '2025-02-01-preview').secondaryKey)), createArray()))]" - } - }, - "template": { - "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", - "languageVersion": "2.0", - "contentVersion": "1.0.0.0", - "metadata": { - "_generator": { - "name": "bicep", - "version": "0.37.4.10188", - "templateHash": "7634110751636246703" - } - }, - "definitions": { - "secretSetType": { - "type": "object", - "properties": { - "secretResourceId": { - "type": "string", - "metadata": { - "description": "The resourceId of the exported secret." - } - }, - "secretUri": { - "type": "string", - "metadata": { - "description": "The secret URI of the exported secret." - } - } - }, - "metadata": { - "__bicep_export!": true - } - }, - "secretToSetType": { - "type": "object", - "properties": { - "name": { - "type": "string", - "metadata": { - "description": "Required. The name of the secret to set." - } - }, - "value": { - "type": "securestring", - "metadata": { - "description": "Required. The value of the secret to set." - } - } - } - } - }, - "parameters": { - "keyVaultName": { - "type": "string", - "metadata": { - "description": "Required. The name of the Key Vault to set the ecrets in." - } - }, - "secretsToSet": { - "type": "array", - "items": { - "$ref": "#/definitions/secretToSetType" - }, - "metadata": { - "description": "Required. The secrets to set in the Key Vault." - } - } - }, - "resources": { - "keyVault": { - "existing": true, - "type": "Microsoft.KeyVault/vaults", - "apiVersion": "2024-11-01", - "name": "[parameters('keyVaultName')]" - }, - "secrets": { - "copy": { - "name": "secrets", - "count": "[length(parameters('secretsToSet'))]" - }, - "type": "Microsoft.KeyVault/vaults/secrets", - "apiVersion": "2024-11-01", - "name": "[format('{0}/{1}', parameters('keyVaultName'), parameters('secretsToSet')[copyIndex()].name)]", - "properties": { - "value": "[parameters('secretsToSet')[copyIndex()].value]" - } - } - }, - "outputs": { - "secretsSet": { - "type": "array", - "items": { - "$ref": "#/definitions/secretSetType" - }, - "metadata": { - "description": "The references to the secrets exported to the provided Key Vault." - }, - "copy": { - "count": "[length(range(0, length(coalesce(parameters('secretsToSet'), createArray()))))]", - "input": { - "secretResourceId": "[resourceId('Microsoft.KeyVault/vaults/secrets', parameters('keyVaultName'), parameters('secretsToSet')[range(0, length(coalesce(parameters('secretsToSet'), createArray())))[copyIndex()]].name)]", - "secretUri": "[reference(format('secrets[{0}]', range(0, length(coalesce(parameters('secretsToSet'), createArray())))[copyIndex()])).secretUri]" - } - } - } - } - } - }, - "dependsOn": [ - "searchService" - ] - } - }, - "outputs": { - "name": { - "type": "string", - "metadata": { - "description": "The name of the search service." - }, - "value": "[parameters('name')]" - }, - "resourceId": { - "type": "string", - "metadata": { - "description": "The resource ID of the search service." - }, - "value": "[resourceId('Microsoft.Search/searchServices', parameters('name'))]" - }, - "resourceGroupName": { - "type": "string", - "metadata": { - "description": "The name of the resource group the search service was created in." - }, - "value": "[resourceGroup().name]" - }, - "systemAssignedMIPrincipalId": { - "type": "string", - "nullable": true, - "metadata": { - "description": "The principal ID of the system assigned identity." - }, - "value": "[tryGet(tryGet(reference('searchService', '2025-02-01-preview', 'full'), 'identity'), 'principalId')]" - }, - "location": { - "type": "string", - "metadata": { - "description": "The location the resource was deployed into." - }, - "value": "[reference('searchService', '2025-02-01-preview', 'full').location]" - }, - "endpoint": { - "type": "string", - "metadata": { - "description": "The endpoint of the search service." - }, - "value": "[reference('searchService').endpoint]" - }, - "privateEndpoints": { - "type": "array", - "items": { - "$ref": "#/definitions/privateEndpointOutputType" - }, - "metadata": { - "description": "The private endpoints of the search service." - }, - "copy": { - "count": "[length(coalesce(parameters('privateEndpoints'), createArray()))]", - "input": { - "name": "[reference(format('searchService_privateEndpoints[{0}]', copyIndex())).outputs.name.value]", - "resourceId": "[reference(format('searchService_privateEndpoints[{0}]', copyIndex())).outputs.resourceId.value]", - "groupId": "[tryGet(tryGet(reference(format('searchService_privateEndpoints[{0}]', copyIndex())).outputs, 'groupId'), 'value')]", - "customDnsConfigs": "[reference(format('searchService_privateEndpoints[{0}]', copyIndex())).outputs.customDnsConfigs.value]", - "networkInterfaceResourceIds": "[reference(format('searchService_privateEndpoints[{0}]', copyIndex())).outputs.networkInterfaceResourceIds.value]" - } - } - }, - "exportedSecrets": { - "$ref": "#/definitions/secretsOutputType", - "metadata": { - "description": "A hashtable of references to the secrets exported to the provided Key Vault. The key of each reference is each secret's name." - }, - "value": "[if(not(equals(parameters('secretsExportConfiguration'), null())), toObject(reference('secretsExport').outputs.secretsSet.value, lambda('secret', last(split(lambdaVariables('secret').secretResourceId, '/'))), lambda('secret', lambdaVariables('secret'))), createObject())]" - }, - "primaryKey": { - "type": "securestring", - "metadata": { - "description": "The primary admin API key of the search service." - }, - "value": "[listAdminKeys('searchService', '2025-02-01-preview').primaryKey]" - }, - "secondaryKey": { - "type": "securestring", - "metadata": { - "description": "The secondaryKey admin API key of the search service." - }, - "value": "[listAdminKeys('searchService', '2025-02-01-preview').secondaryKey]" - } - } - } - }, - "dependsOn": [ - "aiFoundryAiServicesProject", - "existingAiFoundryAiServicesProject", - "searchService", - "userAssignedIdentity" - ] - }, - "aiSearchFoundryConnection": { - "type": "Microsoft.Resources/deployments", - "apiVersion": "2025-04-01", - "name": "[take(format('aifp-srch-connection.{0}', variables('solutionSuffix')), 64)]", - "subscriptionId": "[variables('aiFoundryAiServicesSubscriptionId')]", - "resourceGroup": "[variables('aiFoundryAiServicesResourceGroupName')]", - "properties": { - "expressionEvaluationOptions": { - "scope": "inner" - }, - "mode": "Incremental", - "parameters": { - "aiFoundryProjectName": "[if(variables('useExistingAiFoundryAiProject'), createObject('value', variables('aiFoundryAiProjectResourceName')), createObject('value', reference('aiFoundryAiServicesProject').outputs.name.value))]", - "aiFoundryName": { - "value": "[variables('aiFoundryAiServicesResourceName')]" - }, - "aifSearchConnectionName": { - "value": "[variables('aiSearchConnectionName')]" - }, - "searchServiceResourceId": { - "value": "[reference('searchService').outputs.resourceId.value]" - }, - "searchServiceLocation": { - "value": "[reference('searchService').outputs.location.value]" + "searchServiceLocation": { + "value": "[reference('searchService', '2024-06-01-preview', 'full').location]" }, "searchServiceName": { - "value": "[reference('searchService').outputs.name.value]" + "value": "[variables('searchServiceName')]" }, "searchApiKey": { - "value": "[listOutputsWithSecureValues('searchService', '2025-04-01').primaryKey]" + "value": "[listAdminKeys('searchService', '2024-06-01-preview').primaryKey]" } }, "template": { @@ -47137,7 +44780,7 @@ "value": [ { "name": "AzureAISearchAPIKey", - "value": "[listOutputsWithSecureValues('searchService', '2025-04-01').primaryKey]" + "value": "[listAdminKeys('searchService', '2024-06-01-preview').primaryKey]" } ] }, @@ -50296,11 +47939,11 @@ }, "AZURE_AI_SEARCH_ENDPOINT": { "type": "string", - "value": "[reference('searchService').outputs.endpoint.value]" + "value": "[reference('searchServiceUpdate').outputs.endpoint.value]" }, "AZURE_AI_SEARCH_NAME": { "type": "string", - "value": "[reference('searchService').outputs.name.value]" + "value": "[variables('searchServiceName')]" }, "COSMOSDB_ENDPOINT": { "type": "string", @@ -50364,7 +48007,7 @@ }, "AZURE_SEARCH_ENDPOINT": { "type": "string", - "value": "[reference('searchService').outputs.endpoint.value]" + "value": "[reference('searchServiceUpdate').outputs.endpoint.value]" }, "AZURE_CLIENT_ID": { "type": "string", From ca417b30d1eb64dd20818d598698c628715179d0 Mon Sep 17 00:00:00 2001 From: Ayaz-Microsoft Date: Thu, 26 Feb 2026 14:44:48 +0530 Subject: [PATCH 021/225] Update dependencies: semantic-kernel to 1.39.4 and mcp to 1.26.0 --- src/backend/pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/pyproject.toml b/src/backend/pyproject.toml index ceb686577..55f774017 100644 --- a/src/backend/pyproject.toml +++ b/src/backend/pyproject.toml @@ -27,11 +27,11 @@ dependencies = [ "pytest-cov==5.0.0", "python-dotenv==1.1.1", "python-multipart==0.0.20", - "semantic-kernel==1.39.3", + "semantic-kernel==1.39.4", "uvicorn==0.35.0", "pylint-pydantic==0.3.5", "pexpect==4.9.0", - "mcp==1.23.0", + "mcp==1.26.0", "werkzeug==3.1.5", "azure-core==1.38.0", "agent-framework>=1.0.0b251105", From 6601a4e749f0f0b780aad02f200fe78d6fbe5d43 Mon Sep 17 00:00:00 2001 From: Ayaz-Microsoft Date: Thu, 26 Feb 2026 15:14:33 +0530 Subject: [PATCH 022/225] Update mcp to version 1.26.0 and semantic-kernel to version 1.39.4 --- src/backend/uv.lock | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/backend/uv.lock b/src/backend/uv.lock index 20bcdb6e9..80f3e0e68 100644 --- a/src/backend/uv.lock +++ b/src/backend/uv.lock @@ -776,7 +776,7 @@ requires-dist = [ { name = "azure-monitor-opentelemetry", specifier = "==1.7.0" }, { name = "azure-search-documents", specifier = "==11.5.3" }, { name = "fastapi", specifier = "==0.116.1" }, - { name = "mcp", specifier = "==1.23.0" }, + { name = "mcp", specifier = "==1.26.0" }, { name = "openai", specifier = "==1.105.0" }, { name = "opentelemetry-api", specifier = "==1.36.0" }, { name = "opentelemetry-exporter-otlp-proto-grpc", specifier = "==1.36.0" }, @@ -791,7 +791,7 @@ requires-dist = [ { name = "pytest-cov", specifier = "==5.0.0" }, { name = "python-dotenv", specifier = "==1.1.1" }, { name = "python-multipart", specifier = "==0.0.20" }, - { name = "semantic-kernel", specifier = "==1.39.3" }, + { name = "semantic-kernel", specifier = "==1.39.4" }, { name = "uvicorn", specifier = "==0.35.0" }, { name = "werkzeug", specifier = "==3.1.5" }, ] @@ -1425,7 +1425,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a4/de/f28ced0a67749cac23fecb02b694f6473f47686dff6afaa211d186e2ef9c/greenlet-3.2.4-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:96378df1de302bc38e99c3a9aa311967b7dc80ced1dcc6f171e99842987882a2", size = 272305, upload-time = "2025-08-07T13:15:41.288Z" }, { url = "https://files.pythonhosted.org/packages/09/16/2c3792cba130000bf2a31c5272999113f4764fd9d874fb257ff588ac779a/greenlet-3.2.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1ee8fae0519a337f2329cb78bd7a8e128ec0f881073d43f023c7b8d4831d5246", size = 632472, upload-time = "2025-08-07T13:42:55.044Z" }, { url = "https://files.pythonhosted.org/packages/ae/8f/95d48d7e3d433e6dae5b1682e4292242a53f22df82e6d3dda81b1701a960/greenlet-3.2.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:94abf90142c2a18151632371140b3dba4dee031633fe614cb592dbb6c9e17bc3", size = 644646, upload-time = "2025-08-07T13:45:26.523Z" }, - { url = "https://files.pythonhosted.org/packages/d5/5e/405965351aef8c76b8ef7ad370e5da58d57ef6068df197548b015464001a/greenlet-3.2.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:4d1378601b85e2e5171b99be8d2dc85f594c79967599328f95c1dc1a40f1c633", size = 640519, upload-time = "2025-08-07T13:53:13.928Z" }, { url = "https://files.pythonhosted.org/packages/25/5d/382753b52006ce0218297ec1b628e048c4e64b155379331f25a7316eb749/greenlet-3.2.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0db5594dce18db94f7d1650d7489909b57afde4c580806b8d9203b6e79cdc079", size = 639707, upload-time = "2025-08-07T13:18:27.146Z" }, { url = "https://files.pythonhosted.org/packages/1f/8e/abdd3f14d735b2929290a018ecf133c901be4874b858dd1c604b9319f064/greenlet-3.2.4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2523e5246274f54fdadbce8494458a2ebdcdbc7b802318466ac5606d3cded1f8", size = 587684, upload-time = "2025-08-07T13:18:25.164Z" }, { url = "https://files.pythonhosted.org/packages/5d/65/deb2a69c3e5996439b0176f6651e0052542bb6c8f8ec2e3fba97c9768805/greenlet-3.2.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1987de92fec508535687fb807a5cea1560f6196285a4cde35c100b8cd632cc52", size = 1116647, upload-time = "2025-08-07T13:42:38.655Z" }, @@ -1436,7 +1435,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/44/69/9b804adb5fd0671f367781560eb5eb586c4d495277c93bde4307b9e28068/greenlet-3.2.4-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3b67ca49f54cede0186854a008109d6ee71f66bd57bb36abd6d0a0267b540cdd", size = 274079, upload-time = "2025-08-07T13:15:45.033Z" }, { url = "https://files.pythonhosted.org/packages/46/e9/d2a80c99f19a153eff70bc451ab78615583b8dac0754cfb942223d2c1a0d/greenlet-3.2.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ddf9164e7a5b08e9d22511526865780a576f19ddd00d62f8a665949327fde8bb", size = 640997, upload-time = "2025-08-07T13:42:56.234Z" }, { url = "https://files.pythonhosted.org/packages/3b/16/035dcfcc48715ccd345f3a93183267167cdd162ad123cd93067d86f27ce4/greenlet-3.2.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f28588772bb5fb869a8eb331374ec06f24a83a9c25bfa1f38b6993afe9c1e968", size = 655185, upload-time = "2025-08-07T13:45:27.624Z" }, - { url = "https://files.pythonhosted.org/packages/31/da/0386695eef69ffae1ad726881571dfe28b41970173947e7c558d9998de0f/greenlet-3.2.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:5c9320971821a7cb77cfab8d956fa8e39cd07ca44b6070db358ceb7f8797c8c9", size = 649926, upload-time = "2025-08-07T13:53:15.251Z" }, { url = "https://files.pythonhosted.org/packages/68/88/69bf19fd4dc19981928ceacbc5fd4bb6bc2215d53199e367832e98d1d8fe/greenlet-3.2.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c60a6d84229b271d44b70fb6e5fa23781abb5d742af7b808ae3f6efd7c9c60f6", size = 651839, upload-time = "2025-08-07T13:18:30.281Z" }, { url = "https://files.pythonhosted.org/packages/19/0d/6660d55f7373b2ff8152401a83e02084956da23ae58cddbfb0b330978fe9/greenlet-3.2.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b3812d8d0c9579967815af437d96623f45c0f2ae5f04e366de62a12d83a8fb0", size = 607586, upload-time = "2025-08-07T13:18:28.544Z" }, { url = "https://files.pythonhosted.org/packages/8e/1a/c953fdedd22d81ee4629afbb38d2f9d71e37d23caace44775a3a969147d4/greenlet-3.2.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:abbf57b5a870d30c4675928c37278493044d7c14378350b3aa5d484fa65575f0", size = 1123281, upload-time = "2025-08-07T13:42:39.858Z" }, @@ -1447,7 +1445,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/49/e8/58c7f85958bda41dafea50497cbd59738c5c43dbbea5ee83d651234398f4/greenlet-3.2.4-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:1a921e542453fe531144e91e1feedf12e07351b1cf6c9e8a3325ea600a715a31", size = 272814, upload-time = "2025-08-07T13:15:50.011Z" }, { url = "https://files.pythonhosted.org/packages/62/dd/b9f59862e9e257a16e4e610480cfffd29e3fae018a68c2332090b53aac3d/greenlet-3.2.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd3c8e693bff0fff6ba55f140bf390fa92c994083f838fece0f63be121334945", size = 641073, upload-time = "2025-08-07T13:42:57.23Z" }, { url = "https://files.pythonhosted.org/packages/f7/0b/bc13f787394920b23073ca3b6c4a7a21396301ed75a655bcb47196b50e6e/greenlet-3.2.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:710638eb93b1fa52823aa91bf75326f9ecdfd5e0466f00789246a5280f4ba0fc", size = 655191, upload-time = "2025-08-07T13:45:29.752Z" }, - { url = "https://files.pythonhosted.org/packages/f2/d6/6adde57d1345a8d0f14d31e4ab9c23cfe8e2cd39c3baf7674b4b0338d266/greenlet-3.2.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c5111ccdc9c88f423426df3fd1811bfc40ed66264d35aa373420a34377efc98a", size = 649516, upload-time = "2025-08-07T13:53:16.314Z" }, { url = "https://files.pythonhosted.org/packages/7f/3b/3a3328a788d4a473889a2d403199932be55b1b0060f4ddd96ee7cdfcad10/greenlet-3.2.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d76383238584e9711e20ebe14db6c88ddcedc1829a9ad31a584389463b5aa504", size = 652169, upload-time = "2025-08-07T13:18:32.861Z" }, { url = "https://files.pythonhosted.org/packages/ee/43/3cecdc0349359e1a527cbf2e3e28e5f8f06d3343aaf82ca13437a9aa290f/greenlet-3.2.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23768528f2911bcd7e475210822ffb5254ed10d71f4028387e5a99b4c6699671", size = 610497, upload-time = "2025-08-07T13:18:31.636Z" }, { url = "https://files.pythonhosted.org/packages/b8/19/06b6cf5d604e2c382a6f31cafafd6f33d5dea706f4db7bdab184bad2b21d/greenlet-3.2.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:00fadb3fedccc447f517ee0d3fd8fe49eae949e1cd0f6a611818f4f6fb7dc83b", size = 1121662, upload-time = "2025-08-07T13:42:41.117Z" }, @@ -1458,7 +1455,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/22/5c/85273fd7cc388285632b0498dbbab97596e04b154933dfe0f3e68156c68c/greenlet-3.2.4-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:49a30d5fda2507ae77be16479bdb62a660fa51b1eb4928b524975b3bde77b3c0", size = 273586, upload-time = "2025-08-07T13:16:08.004Z" }, { url = "https://files.pythonhosted.org/packages/d1/75/10aeeaa3da9332c2e761e4c50d4c3556c21113ee3f0afa2cf5769946f7a3/greenlet-3.2.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:299fd615cd8fc86267b47597123e3f43ad79c9d8a22bebdce535e53550763e2f", size = 686346, upload-time = "2025-08-07T13:42:59.944Z" }, { url = "https://files.pythonhosted.org/packages/c0/aa/687d6b12ffb505a4447567d1f3abea23bd20e73a5bed63871178e0831b7a/greenlet-3.2.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c17b6b34111ea72fc5a4e4beec9711d2226285f0386ea83477cbb97c30a3f3a5", size = 699218, upload-time = "2025-08-07T13:45:30.969Z" }, - { url = "https://files.pythonhosted.org/packages/dc/8b/29aae55436521f1d6f8ff4e12fb676f3400de7fcf27fccd1d4d17fd8fecd/greenlet-3.2.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b4a1870c51720687af7fa3e7cda6d08d801dae660f75a76f3845b642b4da6ee1", size = 694659, upload-time = "2025-08-07T13:53:17.759Z" }, { url = "https://files.pythonhosted.org/packages/92/2e/ea25914b1ebfde93b6fc4ff46d6864564fba59024e928bdc7de475affc25/greenlet-3.2.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:061dc4cf2c34852b052a8620d40f36324554bc192be474b9e9770e8c042fd735", size = 695355, upload-time = "2025-08-07T13:18:34.517Z" }, { url = "https://files.pythonhosted.org/packages/72/60/fc56c62046ec17f6b0d3060564562c64c862948c9d4bc8aa807cf5bd74f4/greenlet-3.2.4-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:44358b9bf66c8576a9f57a590d5f5d6e72fa4228b763d0e43fee6d3b06d3a337", size = 657512, upload-time = "2025-08-07T13:18:33.969Z" }, { url = "https://files.pythonhosted.org/packages/23/6e/74407aed965a4ab6ddd93a7ded3180b730d281c77b765788419484cdfeef/greenlet-3.2.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2917bdf657f5859fbf3386b12d68ede4cf1f04c90c3a6bc1f013dd68a22e2269", size = 1612508, upload-time = "2025-11-04T12:42:23.427Z" }, @@ -1976,7 +1972,7 @@ wheels = [ [[package]] name = "mcp" -version = "1.23.0" +version = "1.26.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -1994,9 +1990,9 @@ dependencies = [ { name = "typing-inspection" }, { name = "uvicorn", marker = "sys_platform != 'emscripten'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/25/1a/9c8a5362e3448d585081d6c7aa95898a64e0ac59d3e26169ae6c3ca5feaf/mcp-1.23.0.tar.gz", hash = "sha256:84e0c29316d0a8cf0affd196fd000487ac512aa3f771b63b2ea864e22961772b", size = 596506, upload-time = "2025-12-02T13:40:02.558Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/6d/62e76bbb8144d6ed86e202b5edd8a4cb631e7c8130f3f4893c3f90262b10/mcp-1.26.0.tar.gz", hash = "sha256:db6e2ef491eecc1a0d93711a76f28dec2e05999f93afd48795da1c1137142c66", size = 608005, upload-time = "2026-01-24T19:40:32.468Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/b2/28739ce409f98159c0121eab56e69ad71546c4f34ac8b42e58c03f57dccc/mcp-1.23.0-py3-none-any.whl", hash = "sha256:5a645cf111ed329f4619f2629a3f15d9aabd7adc2ea09d600d31467b51ecb64f", size = 231427, upload-time = "2025-12-02T13:40:00.738Z" }, + { url = "https://files.pythonhosted.org/packages/fd/d9/eaa1f80170d2b7c5ba23f3b59f766f3a0bb41155fbc32a69adfa1adaaef9/mcp-1.26.0-py3-none-any.whl", hash = "sha256:904a21c33c25aa98ddbeb47273033c435e595bbacfdb177f4bd87f6dceebe1ca", size = 233615, upload-time = "2026-01-24T19:40:30.652Z" }, ] [package.optional-dependencies] @@ -3946,7 +3942,7 @@ wheels = [ [[package]] name = "semantic-kernel" -version = "1.39.3" +version = "1.39.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, @@ -3957,6 +3953,7 @@ dependencies = [ { name = "cloudevents" }, { name = "defusedxml" }, { name = "jinja2" }, + { name = "mcp" }, { name = "nest-asyncio" }, { name = "numpy" }, { name = "openai" }, @@ -3972,9 +3969,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/40/75/ace6cc290bbfec20def659df8dcc76fa1dc059ecbe7a13a65877a3d9ef42/semantic_kernel-1.39.3.tar.gz", hash = "sha256:c67265817cd0e4af8f49059ac46421a911158c8bbe9629b1092a632a2bc1f404", size = 601695, upload-time = "2026-02-02T01:32:42.727Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f4/dc/a915e90d755fe601831406f7f77bfa3b44cb7eaacd60aca2722a8414b96a/semantic_kernel-1.39.4.tar.gz", hash = "sha256:9f629919346216f3b48c1ea6da56fa3d1bffd546a6be8fe5b7893a097f0dc798", size = 602392, upload-time = "2026-02-10T10:09:49.223Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/80/ee/a8f12b1d32f3a528f1fa5dfb4afb1f74eac2191c9efca300f17a177af539/semantic_kernel-1.39.3-py3-none-any.whl", hash = "sha256:0540547bc60b24caaf8b8ddff57d995dbabdd343448c434f939be8891fb52624", size = 913654, upload-time = "2026-02-02T01:32:40.525Z" }, + { url = "https://files.pythonhosted.org/packages/03/38/edd944f3a5781573a8c965de8940339e0dc90f3fe088a0ca405af676a438/semantic_kernel-1.39.4-py3-none-any.whl", hash = "sha256:a10833e493485f59e22e988975396f234871a4103a424c30ac9569591b43870d", size = 914347, upload-time = "2026-02-10T10:09:47.014Z" }, ] [[package]] From f1fcee5d66dce25a375e415c16bee34bc1affbf7 Mon Sep 17 00:00:00 2001 From: Ayaz-Microsoft Date: Thu, 26 Feb 2026 17:10:24 +0530 Subject: [PATCH 023/225] fix: dependabot vulnerabilities --- src/backend/pyproject.toml | 8 +- src/backend/requirements.txt | 2 +- src/backend/uv.lock | 335 +++++++++++++++++---------------- src/frontend/package-lock.json | 18 +- src/frontend/package.json | 4 +- src/mcp_server/pyproject.toml | 4 +- src/mcp_server/uv.lock | 125 ++++++------ 7 files changed, 256 insertions(+), 240 deletions(-) diff --git a/src/backend/pyproject.toml b/src/backend/pyproject.toml index 55f774017..be05a724f 100644 --- a/src/backend/pyproject.toml +++ b/src/backend/pyproject.toml @@ -26,7 +26,7 @@ dependencies = [ "pytest-asyncio==0.24.0", "pytest-cov==5.0.0", "python-dotenv==1.1.1", - "python-multipart==0.0.20", + "python-multipart==0.0.22", "semantic-kernel==1.39.4", "uvicorn==0.35.0", "pylint-pydantic==0.3.5", @@ -35,4 +35,10 @@ dependencies = [ "werkzeug==3.1.5", "azure-core==1.38.0", "agent-framework>=1.0.0b251105", + "urllib3==2.6.3", + "protobuf==5.29.6", + "cryptography==46.0.5", + "aiohttp==3.13.3", + "pyasn1==0.6.2", + "nltk==3.9.3", ] diff --git a/src/backend/requirements.txt b/src/backend/requirements.txt index b785f4776..3c098753a 100644 --- a/src/backend/requirements.txt +++ b/src/backend/requirements.txt @@ -14,7 +14,7 @@ opentelemetry-instrumentation-fastapi opentelemetry-instrumentation-openai opentelemetry-exporter-otlp-proto-http -semantic-kernel[azure]==1.32.2 +semantic-kernel[azure]==1.39.4 azure-ai-projects==1.0.0b11 openai==1.84.0 azure-ai-inference==1.0.0b9 diff --git a/src/backend/uv.lock b/src/backend/uv.lock index 80f3e0e68..1a678fb49 100644 --- a/src/backend/uv.lock +++ b/src/backend/uv.lock @@ -238,7 +238,7 @@ wheels = [ [[package]] name = "aiohttp" -version = "3.13.2" +version = "3.13.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs" }, @@ -249,93 +249,93 @@ dependencies = [ { name = "propcache" }, { name = "yarl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1c/ce/3b83ebba6b3207a7135e5fcaba49706f8a4b6008153b4e30540c982fae26/aiohttp-3.13.2.tar.gz", hash = "sha256:40176a52c186aefef6eb3cad2cdd30cd06e3afbe88fe8ab2af9c0b90f228daca", size = 7837994, upload-time = "2025-10-28T20:59:39.937Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/35/74/b321e7d7ca762638cdf8cdeceb39755d9c745aff7a64c8789be96ddf6e96/aiohttp-3.13.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4647d02df098f6434bafd7f32ad14942f05a9caa06c7016fdcc816f343997dd0", size = 743409, upload-time = "2025-10-28T20:56:00.354Z" }, - { url = "https://files.pythonhosted.org/packages/99/3d/91524b905ec473beaf35158d17f82ef5a38033e5809fe8742e3657cdbb97/aiohttp-3.13.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e3403f24bcb9c3b29113611c3c16a2a447c3953ecf86b79775e7be06f7ae7ccb", size = 497006, upload-time = "2025-10-28T20:56:01.85Z" }, - { url = "https://files.pythonhosted.org/packages/eb/d3/7f68bc02a67716fe80f063e19adbd80a642e30682ce74071269e17d2dba1/aiohttp-3.13.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:43dff14e35aba17e3d6d5ba628858fb8cb51e30f44724a2d2f0c75be492c55e9", size = 493195, upload-time = "2025-10-28T20:56:03.314Z" }, - { url = "https://files.pythonhosted.org/packages/98/31/913f774a4708775433b7375c4f867d58ba58ead833af96c8af3621a0d243/aiohttp-3.13.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e2a9ea08e8c58bb17655630198833109227dea914cd20be660f52215f6de5613", size = 1747759, upload-time = "2025-10-28T20:56:04.904Z" }, - { url = "https://files.pythonhosted.org/packages/e8/63/04efe156f4326f31c7c4a97144f82132c3bb21859b7bb84748d452ccc17c/aiohttp-3.13.2-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53b07472f235eb80e826ad038c9d106c2f653584753f3ddab907c83f49eedead", size = 1704456, upload-time = "2025-10-28T20:56:06.986Z" }, - { url = "https://files.pythonhosted.org/packages/8e/02/4e16154d8e0a9cf4ae76f692941fd52543bbb148f02f098ca73cab9b1c1b/aiohttp-3.13.2-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e736c93e9c274fce6419af4aac199984d866e55f8a4cec9114671d0ea9688780", size = 1807572, upload-time = "2025-10-28T20:56:08.558Z" }, - { url = "https://files.pythonhosted.org/packages/34/58/b0583defb38689e7f06798f0285b1ffb3a6fb371f38363ce5fd772112724/aiohttp-3.13.2-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ff5e771f5dcbc81c64898c597a434f7682f2259e0cd666932a913d53d1341d1a", size = 1895954, upload-time = "2025-10-28T20:56:10.545Z" }, - { url = "https://files.pythonhosted.org/packages/6b/f3/083907ee3437425b4e376aa58b2c915eb1a33703ec0dc30040f7ae3368c6/aiohttp-3.13.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3b6fb0c207cc661fa0bf8c66d8d9b657331ccc814f4719468af61034b478592", size = 1747092, upload-time = "2025-10-28T20:56:12.118Z" }, - { url = "https://files.pythonhosted.org/packages/ac/61/98a47319b4e425cc134e05e5f3fc512bf9a04bf65aafd9fdcda5d57ec693/aiohttp-3.13.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:97a0895a8e840ab3520e2288db7cace3a1981300d48babeb50e7425609e2e0ab", size = 1606815, upload-time = "2025-10-28T20:56:14.191Z" }, - { url = "https://files.pythonhosted.org/packages/97/4b/e78b854d82f66bb974189135d31fce265dee0f5344f64dd0d345158a5973/aiohttp-3.13.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9e8f8afb552297aca127c90cb840e9a1d4bfd6a10d7d8f2d9176e1acc69bad30", size = 1723789, upload-time = "2025-10-28T20:56:16.101Z" }, - { url = "https://files.pythonhosted.org/packages/ed/fc/9d2ccc794fc9b9acd1379d625c3a8c64a45508b5091c546dea273a41929e/aiohttp-3.13.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:ed2f9c7216e53c3df02264f25d824b079cc5914f9e2deba94155190ef648ee40", size = 1718104, upload-time = "2025-10-28T20:56:17.655Z" }, - { url = "https://files.pythonhosted.org/packages/66/65/34564b8765ea5c7d79d23c9113135d1dd3609173da13084830f1507d56cf/aiohttp-3.13.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:99c5280a329d5fa18ef30fd10c793a190d996567667908bef8a7f81f8202b948", size = 1785584, upload-time = "2025-10-28T20:56:19.238Z" }, - { url = "https://files.pythonhosted.org/packages/30/be/f6a7a426e02fc82781afd62016417b3948e2207426d90a0e478790d1c8a4/aiohttp-3.13.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:2ca6ffef405fc9c09a746cb5d019c1672cd7f402542e379afc66b370833170cf", size = 1595126, upload-time = "2025-10-28T20:56:20.836Z" }, - { url = "https://files.pythonhosted.org/packages/e5/c7/8e22d5d28f94f67d2af496f14a83b3c155d915d1fe53d94b66d425ec5b42/aiohttp-3.13.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:47f438b1a28e926c37632bff3c44df7d27c9b57aaf4e34b1def3c07111fdb782", size = 1800665, upload-time = "2025-10-28T20:56:22.922Z" }, - { url = "https://files.pythonhosted.org/packages/d1/11/91133c8b68b1da9fc16555706aa7276fdf781ae2bb0876c838dd86b8116e/aiohttp-3.13.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9acda8604a57bb60544e4646a4615c1866ee6c04a8edef9b8ee6fd1d8fa2ddc8", size = 1739532, upload-time = "2025-10-28T20:56:25.924Z" }, - { url = "https://files.pythonhosted.org/packages/17/6b/3747644d26a998774b21a616016620293ddefa4d63af6286f389aedac844/aiohttp-3.13.2-cp311-cp311-win32.whl", hash = "sha256:868e195e39b24aaa930b063c08bb0c17924899c16c672a28a65afded9c46c6ec", size = 431876, upload-time = "2025-10-28T20:56:27.524Z" }, - { url = "https://files.pythonhosted.org/packages/c3/63/688462108c1a00eb9f05765331c107f95ae86f6b197b865d29e930b7e462/aiohttp-3.13.2-cp311-cp311-win_amd64.whl", hash = "sha256:7fd19df530c292542636c2a9a85854fab93474396a52f1695e799186bbd7f24c", size = 456205, upload-time = "2025-10-28T20:56:29.062Z" }, - { url = "https://files.pythonhosted.org/packages/29/9b/01f00e9856d0a73260e86dd8ed0c2234a466c5c1712ce1c281548df39777/aiohttp-3.13.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b1e56bab2e12b2b9ed300218c351ee2a3d8c8fdab5b1ec6193e11a817767e47b", size = 737623, upload-time = "2025-10-28T20:56:30.797Z" }, - { url = "https://files.pythonhosted.org/packages/5a/1b/4be39c445e2b2bd0aab4ba736deb649fabf14f6757f405f0c9685019b9e9/aiohttp-3.13.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:364e25edaabd3d37b1db1f0cbcee8c73c9a3727bfa262b83e5e4cf3489a2a9dc", size = 492664, upload-time = "2025-10-28T20:56:32.708Z" }, - { url = "https://files.pythonhosted.org/packages/28/66/d35dcfea8050e131cdd731dff36434390479b4045a8d0b9d7111b0a968f1/aiohttp-3.13.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c5c94825f744694c4b8db20b71dba9a257cd2ba8e010a803042123f3a25d50d7", size = 491808, upload-time = "2025-10-28T20:56:34.57Z" }, - { url = "https://files.pythonhosted.org/packages/00/29/8e4609b93e10a853b65f8291e64985de66d4f5848c5637cddc70e98f01f8/aiohttp-3.13.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba2715d842ffa787be87cbfce150d5e88c87a98e0b62e0f5aa489169a393dbbb", size = 1738863, upload-time = "2025-10-28T20:56:36.377Z" }, - { url = "https://files.pythonhosted.org/packages/9d/fa/4ebdf4adcc0def75ced1a0d2d227577cd7b1b85beb7edad85fcc87693c75/aiohttp-3.13.2-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:585542825c4bc662221fb257889e011a5aa00f1ae4d75d1d246a5225289183e3", size = 1700586, upload-time = "2025-10-28T20:56:38.034Z" }, - { url = "https://files.pythonhosted.org/packages/da/04/73f5f02ff348a3558763ff6abe99c223381b0bace05cd4530a0258e52597/aiohttp-3.13.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:39d02cb6025fe1aabca329c5632f48c9532a3dabccd859e7e2f110668972331f", size = 1768625, upload-time = "2025-10-28T20:56:39.75Z" }, - { url = "https://files.pythonhosted.org/packages/f8/49/a825b79ffec124317265ca7d2344a86bcffeb960743487cb11988ffb3494/aiohttp-3.13.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e67446b19e014d37342f7195f592a2a948141d15a312fe0e700c2fd2f03124f6", size = 1867281, upload-time = "2025-10-28T20:56:41.471Z" }, - { url = "https://files.pythonhosted.org/packages/b9/48/adf56e05f81eac31edcfae45c90928f4ad50ef2e3ea72cb8376162a368f8/aiohttp-3.13.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4356474ad6333e41ccefd39eae869ba15a6c5299c9c01dfdcfdd5c107be4363e", size = 1752431, upload-time = "2025-10-28T20:56:43.162Z" }, - { url = "https://files.pythonhosted.org/packages/30/ab/593855356eead019a74e862f21523db09c27f12fd24af72dbc3555b9bfd9/aiohttp-3.13.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:eeacf451c99b4525f700f078becff32c32ec327b10dcf31306a8a52d78166de7", size = 1562846, upload-time = "2025-10-28T20:56:44.85Z" }, - { url = "https://files.pythonhosted.org/packages/39/0f/9f3d32271aa8dc35036e9668e31870a9d3b9542dd6b3e2c8a30931cb27ae/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8a9b889aeabd7a4e9af0b7f4ab5ad94d42e7ff679aaec6d0db21e3b639ad58d", size = 1699606, upload-time = "2025-10-28T20:56:46.519Z" }, - { url = "https://files.pythonhosted.org/packages/2c/3c/52d2658c5699b6ef7692a3f7128b2d2d4d9775f2a68093f74bca06cf01e1/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:fa89cb11bc71a63b69568d5b8a25c3ca25b6d54c15f907ca1c130d72f320b76b", size = 1720663, upload-time = "2025-10-28T20:56:48.528Z" }, - { url = "https://files.pythonhosted.org/packages/9b/d4/8f8f3ff1fb7fb9e3f04fcad4e89d8a1cd8fc7d05de67e3de5b15b33008ff/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8aa7c807df234f693fed0ecd507192fc97692e61fee5702cdc11155d2e5cadc8", size = 1737939, upload-time = "2025-10-28T20:56:50.77Z" }, - { url = "https://files.pythonhosted.org/packages/03/d3/ddd348f8a27a634daae39a1b8e291ff19c77867af438af844bf8b7e3231b/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:9eb3e33fdbe43f88c3c75fa608c25e7c47bbd80f48d012763cb67c47f39a7e16", size = 1555132, upload-time = "2025-10-28T20:56:52.568Z" }, - { url = "https://files.pythonhosted.org/packages/39/b8/46790692dc46218406f94374903ba47552f2f9f90dad554eed61bfb7b64c/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9434bc0d80076138ea986833156c5a48c9c7a8abb0c96039ddbb4afc93184169", size = 1764802, upload-time = "2025-10-28T20:56:54.292Z" }, - { url = "https://files.pythonhosted.org/packages/ba/e4/19ce547b58ab2a385e5f0b8aa3db38674785085abcf79b6e0edd1632b12f/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ff15c147b2ad66da1f2cbb0622313f2242d8e6e8f9b79b5206c84523a4473248", size = 1719512, upload-time = "2025-10-28T20:56:56.428Z" }, - { url = "https://files.pythonhosted.org/packages/70/30/6355a737fed29dcb6dfdd48682d5790cb5eab050f7b4e01f49b121d3acad/aiohttp-3.13.2-cp312-cp312-win32.whl", hash = "sha256:27e569eb9d9e95dbd55c0fc3ec3a9335defbf1d8bc1d20171a49f3c4c607b93e", size = 426690, upload-time = "2025-10-28T20:56:58.736Z" }, - { url = "https://files.pythonhosted.org/packages/0a/0d/b10ac09069973d112de6ef980c1f6bb31cb7dcd0bc363acbdad58f927873/aiohttp-3.13.2-cp312-cp312-win_amd64.whl", hash = "sha256:8709a0f05d59a71f33fd05c17fc11fcb8c30140506e13c2f5e8ee1b8964e1b45", size = 453465, upload-time = "2025-10-28T20:57:00.795Z" }, - { url = "https://files.pythonhosted.org/packages/bf/78/7e90ca79e5aa39f9694dcfd74f4720782d3c6828113bb1f3197f7e7c4a56/aiohttp-3.13.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7519bdc7dfc1940d201651b52bf5e03f5503bda45ad6eacf64dda98be5b2b6be", size = 732139, upload-time = "2025-10-28T20:57:02.455Z" }, - { url = "https://files.pythonhosted.org/packages/db/ed/1f59215ab6853fbaa5c8495fa6cbc39edfc93553426152b75d82a5f32b76/aiohttp-3.13.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:088912a78b4d4f547a1f19c099d5a506df17eacec3c6f4375e2831ec1d995742", size = 490082, upload-time = "2025-10-28T20:57:04.784Z" }, - { url = "https://files.pythonhosted.org/packages/68/7b/fe0fe0f5e05e13629d893c760465173a15ad0039c0a5b0d0040995c8075e/aiohttp-3.13.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5276807b9de9092af38ed23ce120539ab0ac955547b38563a9ba4f5b07b95293", size = 489035, upload-time = "2025-10-28T20:57:06.894Z" }, - { url = "https://files.pythonhosted.org/packages/d2/04/db5279e38471b7ac801d7d36a57d1230feeee130bbe2a74f72731b23c2b1/aiohttp-3.13.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1237c1375eaef0db4dcd7c2559f42e8af7b87ea7d295b118c60c36a6e61cb811", size = 1720387, upload-time = "2025-10-28T20:57:08.685Z" }, - { url = "https://files.pythonhosted.org/packages/31/07/8ea4326bd7dae2bd59828f69d7fdc6e04523caa55e4a70f4a8725a7e4ed2/aiohttp-3.13.2-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:96581619c57419c3d7d78703d5b78c1e5e5fc0172d60f555bdebaced82ded19a", size = 1688314, upload-time = "2025-10-28T20:57:10.693Z" }, - { url = "https://files.pythonhosted.org/packages/48/ab/3d98007b5b87ffd519d065225438cc3b668b2f245572a8cb53da5dd2b1bc/aiohttp-3.13.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a2713a95b47374169409d18103366de1050fe0ea73db358fc7a7acb2880422d4", size = 1756317, upload-time = "2025-10-28T20:57:12.563Z" }, - { url = "https://files.pythonhosted.org/packages/97/3d/801ca172b3d857fafb7b50c7c03f91b72b867a13abca982ed6b3081774ef/aiohttp-3.13.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:228a1cd556b3caca590e9511a89444925da87d35219a49ab5da0c36d2d943a6a", size = 1858539, upload-time = "2025-10-28T20:57:14.623Z" }, - { url = "https://files.pythonhosted.org/packages/f7/0d/4764669bdf47bd472899b3d3db91fffbe925c8e3038ec591a2fd2ad6a14d/aiohttp-3.13.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ac6cde5fba8d7d8c6ac963dbb0256a9854e9fafff52fbcc58fdf819357892c3e", size = 1739597, upload-time = "2025-10-28T20:57:16.399Z" }, - { url = "https://files.pythonhosted.org/packages/c4/52/7bd3c6693da58ba16e657eb904a5b6decfc48ecd06e9ac098591653b1566/aiohttp-3.13.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f2bef8237544f4e42878c61cef4e2839fee6346dc60f5739f876a9c50be7fcdb", size = 1555006, upload-time = "2025-10-28T20:57:18.288Z" }, - { url = "https://files.pythonhosted.org/packages/48/30/9586667acec5993b6f41d2ebcf96e97a1255a85f62f3c653110a5de4d346/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:16f15a4eac3bc2d76c45f7ebdd48a65d41b242eb6c31c2245463b40b34584ded", size = 1683220, upload-time = "2025-10-28T20:57:20.241Z" }, - { url = "https://files.pythonhosted.org/packages/71/01/3afe4c96854cfd7b30d78333852e8e851dceaec1c40fd00fec90c6402dd2/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:bb7fb776645af5cc58ab804c58d7eba545a97e047254a52ce89c157b5af6cd0b", size = 1712570, upload-time = "2025-10-28T20:57:22.253Z" }, - { url = "https://files.pythonhosted.org/packages/11/2c/22799d8e720f4697a9e66fd9c02479e40a49de3de2f0bbe7f9f78a987808/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e1b4951125ec10c70802f2cb09736c895861cd39fd9dcb35107b4dc8ae6220b8", size = 1733407, upload-time = "2025-10-28T20:57:24.37Z" }, - { url = "https://files.pythonhosted.org/packages/34/cb/90f15dd029f07cebbd91f8238a8b363978b530cd128488085b5703683594/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:550bf765101ae721ee1d37d8095f47b1f220650f85fe1af37a90ce75bab89d04", size = 1550093, upload-time = "2025-10-28T20:57:26.257Z" }, - { url = "https://files.pythonhosted.org/packages/69/46/12dce9be9d3303ecbf4d30ad45a7683dc63d90733c2d9fe512be6716cd40/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fe91b87fc295973096251e2d25a811388e7d8adf3bd2b97ef6ae78bc4ac6c476", size = 1758084, upload-time = "2025-10-28T20:57:28.349Z" }, - { url = "https://files.pythonhosted.org/packages/f9/c8/0932b558da0c302ffd639fc6362a313b98fdf235dc417bc2493da8394df7/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e0c8e31cfcc4592cb200160344b2fb6ae0f9e4effe06c644b5a125d4ae5ebe23", size = 1716987, upload-time = "2025-10-28T20:57:30.233Z" }, - { url = "https://files.pythonhosted.org/packages/5d/8b/f5bd1a75003daed099baec373aed678f2e9b34f2ad40d85baa1368556396/aiohttp-3.13.2-cp313-cp313-win32.whl", hash = "sha256:0740f31a60848d6edb296a0df827473eede90c689b8f9f2a4cdde74889eb2254", size = 425859, upload-time = "2025-10-28T20:57:32.105Z" }, - { url = "https://files.pythonhosted.org/packages/5d/28/a8a9fc6957b2cee8902414e41816b5ab5536ecf43c3b1843c10e82c559b2/aiohttp-3.13.2-cp313-cp313-win_amd64.whl", hash = "sha256:a88d13e7ca367394908f8a276b89d04a3652044612b9a408a0bb22a5ed976a1a", size = 452192, upload-time = "2025-10-28T20:57:34.166Z" }, - { url = "https://files.pythonhosted.org/packages/9b/36/e2abae1bd815f01c957cbf7be817b3043304e1c87bad526292a0410fdcf9/aiohttp-3.13.2-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:2475391c29230e063ef53a66669b7b691c9bfc3f1426a0f7bcdf1216bdbac38b", size = 735234, upload-time = "2025-10-28T20:57:36.415Z" }, - { url = "https://files.pythonhosted.org/packages/ca/e3/1ee62dde9b335e4ed41db6bba02613295a0d5b41f74a783c142745a12763/aiohttp-3.13.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:f33c8748abef4d8717bb20e8fb1b3e07c6adacb7fd6beaae971a764cf5f30d61", size = 490733, upload-time = "2025-10-28T20:57:38.205Z" }, - { url = "https://files.pythonhosted.org/packages/1a/aa/7a451b1d6a04e8d15a362af3e9b897de71d86feac3babf8894545d08d537/aiohttp-3.13.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ae32f24bbfb7dbb485a24b30b1149e2f200be94777232aeadba3eecece4d0aa4", size = 491303, upload-time = "2025-10-28T20:57:40.122Z" }, - { url = "https://files.pythonhosted.org/packages/57/1e/209958dbb9b01174870f6a7538cd1f3f28274fdbc88a750c238e2c456295/aiohttp-3.13.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d7f02042c1f009ffb70067326ef183a047425bb2ff3bc434ead4dd4a4a66a2b", size = 1717965, upload-time = "2025-10-28T20:57:42.28Z" }, - { url = "https://files.pythonhosted.org/packages/08/aa/6a01848d6432f241416bc4866cae8dc03f05a5a884d2311280f6a09c73d6/aiohttp-3.13.2-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:93655083005d71cd6c072cdab54c886e6570ad2c4592139c3fb967bfc19e4694", size = 1667221, upload-time = "2025-10-28T20:57:44.869Z" }, - { url = "https://files.pythonhosted.org/packages/87/4f/36c1992432d31bbc789fa0b93c768d2e9047ec8c7177e5cd84ea85155f36/aiohttp-3.13.2-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0db1e24b852f5f664cd728db140cf11ea0e82450471232a394b3d1a540b0f906", size = 1757178, upload-time = "2025-10-28T20:57:47.216Z" }, - { url = "https://files.pythonhosted.org/packages/ac/b4/8e940dfb03b7e0f68a82b88fd182b9be0a65cb3f35612fe38c038c3112cf/aiohttp-3.13.2-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b009194665bcd128e23eaddef362e745601afa4641930848af4c8559e88f18f9", size = 1838001, upload-time = "2025-10-28T20:57:49.337Z" }, - { url = "https://files.pythonhosted.org/packages/d7/ef/39f3448795499c440ab66084a9db7d20ca7662e94305f175a80f5b7e0072/aiohttp-3.13.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c038a8fdc8103cd51dbd986ecdce141473ffd9775a7a8057a6ed9c3653478011", size = 1716325, upload-time = "2025-10-28T20:57:51.327Z" }, - { url = "https://files.pythonhosted.org/packages/d7/51/b311500ffc860b181c05d91c59a1313bdd05c82960fdd4035a15740d431e/aiohttp-3.13.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:66bac29b95a00db411cd758fea0e4b9bdba6d549dfe333f9a945430f5f2cc5a6", size = 1547978, upload-time = "2025-10-28T20:57:53.554Z" }, - { url = "https://files.pythonhosted.org/packages/31/64/b9d733296ef79815226dab8c586ff9e3df41c6aff2e16c06697b2d2e6775/aiohttp-3.13.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4ebf9cfc9ba24a74cf0718f04aac2a3bbe745902cc7c5ebc55c0f3b5777ef213", size = 1682042, upload-time = "2025-10-28T20:57:55.617Z" }, - { url = "https://files.pythonhosted.org/packages/3f/30/43d3e0f9d6473a6db7d472104c4eff4417b1e9df01774cb930338806d36b/aiohttp-3.13.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a4b88ebe35ce54205c7074f7302bd08a4cb83256a3e0870c72d6f68a3aaf8e49", size = 1680085, upload-time = "2025-10-28T20:57:57.59Z" }, - { url = "https://files.pythonhosted.org/packages/16/51/c709f352c911b1864cfd1087577760ced64b3e5bee2aa88b8c0c8e2e4972/aiohttp-3.13.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:98c4fb90bb82b70a4ed79ca35f656f4281885be076f3f970ce315402b53099ae", size = 1728238, upload-time = "2025-10-28T20:57:59.525Z" }, - { url = "https://files.pythonhosted.org/packages/19/e2/19bd4c547092b773caeb48ff5ae4b1ae86756a0ee76c16727fcfd281404b/aiohttp-3.13.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:ec7534e63ae0f3759df3a1ed4fa6bc8f75082a924b590619c0dd2f76d7043caa", size = 1544395, upload-time = "2025-10-28T20:58:01.914Z" }, - { url = "https://files.pythonhosted.org/packages/cf/87/860f2803b27dfc5ed7be532832a3498e4919da61299b4a1f8eb89b8ff44d/aiohttp-3.13.2-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5b927cf9b935a13e33644cbed6c8c4b2d0f25b713d838743f8fe7191b33829c4", size = 1742965, upload-time = "2025-10-28T20:58:03.972Z" }, - { url = "https://files.pythonhosted.org/packages/67/7f/db2fc7618925e8c7a601094d5cbe539f732df4fb570740be88ed9e40e99a/aiohttp-3.13.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:88d6c017966a78c5265d996c19cdb79235be5e6412268d7e2ce7dee339471b7a", size = 1697585, upload-time = "2025-10-28T20:58:06.189Z" }, - { url = "https://files.pythonhosted.org/packages/0c/07/9127916cb09bb38284db5036036042b7b2c514c8ebaeee79da550c43a6d6/aiohttp-3.13.2-cp314-cp314-win32.whl", hash = "sha256:f7c183e786e299b5d6c49fb43a769f8eb8e04a2726a2bd5887b98b5cc2d67940", size = 431621, upload-time = "2025-10-28T20:58:08.636Z" }, - { url = "https://files.pythonhosted.org/packages/fb/41/554a8a380df6d3a2bba8a7726429a23f4ac62aaf38de43bb6d6cde7b4d4d/aiohttp-3.13.2-cp314-cp314-win_amd64.whl", hash = "sha256:fe242cd381e0fb65758faf5ad96c2e460df6ee5b2de1072fe97e4127927e00b4", size = 457627, upload-time = "2025-10-28T20:58:11Z" }, - { url = "https://files.pythonhosted.org/packages/c7/8e/3824ef98c039d3951cb65b9205a96dd2b20f22241ee17d89c5701557c826/aiohttp-3.13.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:f10d9c0b0188fe85398c61147bbd2a657d616c876863bfeff43376e0e3134673", size = 767360, upload-time = "2025-10-28T20:58:13.358Z" }, - { url = "https://files.pythonhosted.org/packages/a4/0f/6a03e3fc7595421274fa34122c973bde2d89344f8a881b728fa8c774e4f1/aiohttp-3.13.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:e7c952aefdf2460f4ae55c5e9c3e80aa72f706a6317e06020f80e96253b1accd", size = 504616, upload-time = "2025-10-28T20:58:15.339Z" }, - { url = "https://files.pythonhosted.org/packages/c6/aa/ed341b670f1bc8a6f2c6a718353d13b9546e2cef3544f573c6a1ff0da711/aiohttp-3.13.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c20423ce14771d98353d2e25e83591fa75dfa90a3c1848f3d7c68243b4fbded3", size = 509131, upload-time = "2025-10-28T20:58:17.693Z" }, - { url = "https://files.pythonhosted.org/packages/7f/f0/c68dac234189dae5c4bbccc0f96ce0cc16b76632cfc3a08fff180045cfa4/aiohttp-3.13.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e96eb1a34396e9430c19d8338d2ec33015e4a87ef2b4449db94c22412e25ccdf", size = 1864168, upload-time = "2025-10-28T20:58:20.113Z" }, - { url = "https://files.pythonhosted.org/packages/8f/65/75a9a76db8364b5d0e52a0c20eabc5d52297385d9af9c35335b924fafdee/aiohttp-3.13.2-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:23fb0783bc1a33640036465019d3bba069942616a6a2353c6907d7fe1ccdaf4e", size = 1719200, upload-time = "2025-10-28T20:58:22.583Z" }, - { url = "https://files.pythonhosted.org/packages/f5/55/8df2ed78d7f41d232f6bd3ff866b6f617026551aa1d07e2f03458f964575/aiohttp-3.13.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e1a9bea6244a1d05a4e57c295d69e159a5c50d8ef16aa390948ee873478d9a5", size = 1843497, upload-time = "2025-10-28T20:58:24.672Z" }, - { url = "https://files.pythonhosted.org/packages/e9/e0/94d7215e405c5a02ccb6a35c7a3a6cfff242f457a00196496935f700cde5/aiohttp-3.13.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0a3d54e822688b56e9f6b5816fb3de3a3a64660efac64e4c2dc435230ad23bad", size = 1935703, upload-time = "2025-10-28T20:58:26.758Z" }, - { url = "https://files.pythonhosted.org/packages/0b/78/1eeb63c3f9b2d1015a4c02788fb543141aad0a03ae3f7a7b669b2483f8d4/aiohttp-3.13.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7a653d872afe9f33497215745da7a943d1dc15b728a9c8da1c3ac423af35178e", size = 1792738, upload-time = "2025-10-28T20:58:29.787Z" }, - { url = "https://files.pythonhosted.org/packages/41/75/aaf1eea4c188e51538c04cc568040e3082db263a57086ea74a7d38c39e42/aiohttp-3.13.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:56d36e80d2003fa3fc0207fac644216d8532e9504a785ef9a8fd013f84a42c61", size = 1624061, upload-time = "2025-10-28T20:58:32.529Z" }, - { url = "https://files.pythonhosted.org/packages/9b/c2/3b6034de81fbcc43de8aeb209073a2286dfb50b86e927b4efd81cf848197/aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:78cd586d8331fb8e241c2dd6b2f4061778cc69e150514b39a9e28dd050475661", size = 1789201, upload-time = "2025-10-28T20:58:34.618Z" }, - { url = "https://files.pythonhosted.org/packages/c9/38/c15dcf6d4d890217dae79d7213988f4e5fe6183d43893a9cf2fe9e84ca8d/aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:20b10bbfbff766294fe99987f7bb3b74fdd2f1a2905f2562132641ad434dcf98", size = 1776868, upload-time = "2025-10-28T20:58:38.835Z" }, - { url = "https://files.pythonhosted.org/packages/04/75/f74fd178ac81adf4f283a74847807ade5150e48feda6aef024403716c30c/aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9ec49dff7e2b3c85cdeaa412e9d438f0ecd71676fde61ec57027dd392f00c693", size = 1790660, upload-time = "2025-10-28T20:58:41.507Z" }, - { url = "https://files.pythonhosted.org/packages/e7/80/7368bd0d06b16b3aba358c16b919e9c46cf11587dc572091031b0e9e3ef0/aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:94f05348c4406450f9d73d38efb41d669ad6cd90c7ee194810d0eefbfa875a7a", size = 1617548, upload-time = "2025-10-28T20:58:43.674Z" }, - { url = "https://files.pythonhosted.org/packages/7d/4b/a6212790c50483cb3212e507378fbe26b5086d73941e1ec4b56a30439688/aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:fa4dcb605c6f82a80c7f95713c2b11c3b8e9893b3ebd2bc9bde93165ed6107be", size = 1817240, upload-time = "2025-10-28T20:58:45.787Z" }, - { url = "https://files.pythonhosted.org/packages/ff/f7/ba5f0ba4ea8d8f3c32850912944532b933acbf0f3a75546b89269b9b7dde/aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cf00e5db968c3f67eccd2778574cf64d8b27d95b237770aa32400bd7a1ca4f6c", size = 1762334, upload-time = "2025-10-28T20:58:47.936Z" }, - { url = "https://files.pythonhosted.org/packages/7e/83/1a5a1856574588b1cad63609ea9ad75b32a8353ac995d830bf5da9357364/aiohttp-3.13.2-cp314-cp314t-win32.whl", hash = "sha256:d23b5fe492b0805a50d3371e8a728a9134d8de5447dce4c885f5587294750734", size = 464685, upload-time = "2025-10-28T20:58:50.642Z" }, - { url = "https://files.pythonhosted.org/packages/9f/4d/d22668674122c08f4d56972297c51a624e64b3ed1efaa40187607a7cb66e/aiohttp-3.13.2-cp314-cp314t-win_amd64.whl", hash = "sha256:ff0a7b0a82a7ab905cbda74006318d1b12e37c797eb1b0d4eb3e316cf47f658f", size = 498093, upload-time = "2025-10-28T20:58:52.782Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/50/42/32cf8e7704ceb4481406eb87161349abb46a57fee3f008ba9cb610968646/aiohttp-3.13.3.tar.gz", hash = "sha256:a949eee43d3782f2daae4f4a2819b2cb9b0c5d3b7f7a927067cc84dafdbb9f88", size = 7844556, upload-time = "2026-01-03T17:33:05.204Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/4c/a164164834f03924d9a29dc3acd9e7ee58f95857e0b467f6d04298594ebb/aiohttp-3.13.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5b6073099fb654e0a068ae678b10feff95c5cae95bbfcbfa7af669d361a8aa6b", size = 746051, upload-time = "2026-01-03T17:29:43.287Z" }, + { url = "https://files.pythonhosted.org/packages/82/71/d5c31390d18d4f58115037c432b7e0348c60f6f53b727cad33172144a112/aiohttp-3.13.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cb93e166e6c28716c8c6aeb5f99dfb6d5ccf482d29fe9bf9a794110e6d0ab64", size = 499234, upload-time = "2026-01-03T17:29:44.822Z" }, + { url = "https://files.pythonhosted.org/packages/0e/c9/741f8ac91e14b1d2e7100690425a5b2b919a87a5075406582991fb7de920/aiohttp-3.13.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:28e027cf2f6b641693a09f631759b4d9ce9165099d2b5d92af9bd4e197690eea", size = 494979, upload-time = "2026-01-03T17:29:46.405Z" }, + { url = "https://files.pythonhosted.org/packages/75/b5/31d4d2e802dfd59f74ed47eba48869c1c21552c586d5e81a9d0d5c2ad640/aiohttp-3.13.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3b61b7169ababd7802f9568ed96142616a9118dd2be0d1866e920e77ec8fa92a", size = 1748297, upload-time = "2026-01-03T17:29:48.083Z" }, + { url = "https://files.pythonhosted.org/packages/1a/3e/eefad0ad42959f226bb79664826883f2687d602a9ae2941a18e0484a74d3/aiohttp-3.13.3-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:80dd4c21b0f6237676449c6baaa1039abae86b91636b6c91a7f8e61c87f89540", size = 1707172, upload-time = "2026-01-03T17:29:49.648Z" }, + { url = "https://files.pythonhosted.org/packages/c5/3a/54a64299fac2891c346cdcf2aa6803f994a2e4beeaf2e5a09dcc54acc842/aiohttp-3.13.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:65d2ccb7eabee90ce0503c17716fc77226be026dcc3e65cce859a30db715025b", size = 1805405, upload-time = "2026-01-03T17:29:51.244Z" }, + { url = "https://files.pythonhosted.org/packages/6c/70/ddc1b7169cf64075e864f64595a14b147a895a868394a48f6a8031979038/aiohttp-3.13.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5b179331a481cb5529fca8b432d8d3c7001cb217513c94cd72d668d1248688a3", size = 1899449, upload-time = "2026-01-03T17:29:53.938Z" }, + { url = "https://files.pythonhosted.org/packages/a1/7e/6815aab7d3a56610891c76ef79095677b8b5be6646aaf00f69b221765021/aiohttp-3.13.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d4c940f02f49483b18b079d1c27ab948721852b281f8b015c058100e9421dd1", size = 1748444, upload-time = "2026-01-03T17:29:55.484Z" }, + { url = "https://files.pythonhosted.org/packages/6b/f2/073b145c4100da5511f457dc0f7558e99b2987cf72600d42b559db856fbc/aiohttp-3.13.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f9444f105664c4ce47a2a7171a2418bce5b7bae45fb610f4e2c36045d85911d3", size = 1606038, upload-time = "2026-01-03T17:29:57.179Z" }, + { url = "https://files.pythonhosted.org/packages/0a/c1/778d011920cae03ae01424ec202c513dc69243cf2db303965615b81deeea/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:694976222c711d1d00ba131904beb60534f93966562f64440d0c9d41b8cdb440", size = 1724156, upload-time = "2026-01-03T17:29:58.914Z" }, + { url = "https://files.pythonhosted.org/packages/0e/cb/3419eabf4ec1e9ec6f242c32b689248365a1cf621891f6f0386632525494/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f33ed1a2bf1997a36661874b017f5c4b760f41266341af36febaf271d179f6d7", size = 1722340, upload-time = "2026-01-03T17:30:01.962Z" }, + { url = "https://files.pythonhosted.org/packages/7a/e5/76cf77bdbc435bf233c1f114edad39ed4177ccbfab7c329482b179cff4f4/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e636b3c5f61da31a92bf0d91da83e58fdfa96f178ba682f11d24f31944cdd28c", size = 1783041, upload-time = "2026-01-03T17:30:03.609Z" }, + { url = "https://files.pythonhosted.org/packages/9d/d4/dd1ca234c794fd29c057ce8c0566b8ef7fd6a51069de5f06fa84b9a1971c/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5d2d94f1f5fcbe40838ac51a6ab5704a6f9ea42e72ceda48de5e6b898521da51", size = 1596024, upload-time = "2026-01-03T17:30:05.132Z" }, + { url = "https://files.pythonhosted.org/packages/55/58/4345b5f26661a6180afa686c473620c30a66afdf120ed3dd545bbc809e85/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2be0e9ccf23e8a94f6f0650ce06042cefc6ac703d0d7ab6c7a917289f2539ad4", size = 1804590, upload-time = "2026-01-03T17:30:07.135Z" }, + { url = "https://files.pythonhosted.org/packages/7b/06/05950619af6c2df7e0a431d889ba2813c9f0129cec76f663e547a5ad56f2/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9af5e68ee47d6534d36791bbe9b646d2a7c7deb6fc24d7943628edfbb3581f29", size = 1740355, upload-time = "2026-01-03T17:30:09.083Z" }, + { url = "https://files.pythonhosted.org/packages/3e/80/958f16de79ba0422d7c1e284b2abd0c84bc03394fbe631d0a39ffa10e1eb/aiohttp-3.13.3-cp311-cp311-win32.whl", hash = "sha256:a2212ad43c0833a873d0fb3c63fa1bacedd4cf6af2fee62bf4b739ceec3ab239", size = 433701, upload-time = "2026-01-03T17:30:10.869Z" }, + { url = "https://files.pythonhosted.org/packages/dc/f2/27cdf04c9851712d6c1b99df6821a6623c3c9e55956d4b1e318c337b5a48/aiohttp-3.13.3-cp311-cp311-win_amd64.whl", hash = "sha256:642f752c3eb117b105acbd87e2c143de710987e09860d674e068c4c2c441034f", size = 457678, upload-time = "2026-01-03T17:30:12.719Z" }, + { url = "https://files.pythonhosted.org/packages/a0/be/4fc11f202955a69e0db803a12a062b8379c970c7c84f4882b6da17337cc1/aiohttp-3.13.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b903a4dfee7d347e2d87697d0713be59e0b87925be030c9178c5faa58ea58d5c", size = 739732, upload-time = "2026-01-03T17:30:14.23Z" }, + { url = "https://files.pythonhosted.org/packages/97/2c/621d5b851f94fa0bb7430d6089b3aa970a9d9b75196bc93bb624b0db237a/aiohttp-3.13.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a45530014d7a1e09f4a55f4f43097ba0fd155089372e105e4bff4ca76cb1b168", size = 494293, upload-time = "2026-01-03T17:30:15.96Z" }, + { url = "https://files.pythonhosted.org/packages/5d/43/4be01406b78e1be8320bb8316dc9c42dbab553d281c40364e0f862d5661c/aiohttp-3.13.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:27234ef6d85c914f9efeb77ff616dbf4ad2380be0cda40b4db086ffc7ddd1b7d", size = 493533, upload-time = "2026-01-03T17:30:17.431Z" }, + { url = "https://files.pythonhosted.org/packages/8d/a8/5a35dc56a06a2c90d4742cbf35294396907027f80eea696637945a106f25/aiohttp-3.13.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d32764c6c9aafb7fb55366a224756387cd50bfa720f32b88e0e6fa45b27dcf29", size = 1737839, upload-time = "2026-01-03T17:30:19.422Z" }, + { url = "https://files.pythonhosted.org/packages/bf/62/4b9eeb331da56530bf2e198a297e5303e1c1ebdceeb00fe9b568a65c5a0c/aiohttp-3.13.3-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b1a6102b4d3ebc07dad44fbf07b45bb600300f15b552ddf1851b5390202ea2e3", size = 1703932, upload-time = "2026-01-03T17:30:21.756Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f6/af16887b5d419e6a367095994c0b1332d154f647e7dc2bd50e61876e8e3d/aiohttp-3.13.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c014c7ea7fb775dd015b2d3137378b7be0249a448a1612268b5a90c2d81de04d", size = 1771906, upload-time = "2026-01-03T17:30:23.932Z" }, + { url = "https://files.pythonhosted.org/packages/ce/83/397c634b1bcc24292fa1e0c7822800f9f6569e32934bdeef09dae7992dfb/aiohttp-3.13.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2b8d8ddba8f95ba17582226f80e2de99c7a7948e66490ef8d947e272a93e9463", size = 1871020, upload-time = "2026-01-03T17:30:26Z" }, + { url = "https://files.pythonhosted.org/packages/86/f6/a62cbbf13f0ac80a70f71b1672feba90fdb21fd7abd8dbf25c0105fb6fa3/aiohttp-3.13.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ae8dd55c8e6c4257eae3a20fd2c8f41edaea5992ed67156642493b8daf3cecc", size = 1755181, upload-time = "2026-01-03T17:30:27.554Z" }, + { url = "https://files.pythonhosted.org/packages/0a/87/20a35ad487efdd3fba93d5843efdfaa62d2f1479eaafa7453398a44faf13/aiohttp-3.13.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:01ad2529d4b5035578f5081606a465f3b814c542882804e2e8cda61adf5c71bf", size = 1561794, upload-time = "2026-01-03T17:30:29.254Z" }, + { url = "https://files.pythonhosted.org/packages/de/95/8fd69a66682012f6716e1bc09ef8a1a2a91922c5725cb904689f112309c4/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bb4f7475e359992b580559e008c598091c45b5088f28614e855e42d39c2f1033", size = 1697900, upload-time = "2026-01-03T17:30:31.033Z" }, + { url = "https://files.pythonhosted.org/packages/e5/66/7b94b3b5ba70e955ff597672dad1691333080e37f50280178967aff68657/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c19b90316ad3b24c69cd78d5c9b4f3aa4497643685901185b65166293d36a00f", size = 1728239, upload-time = "2026-01-03T17:30:32.703Z" }, + { url = "https://files.pythonhosted.org/packages/47/71/6f72f77f9f7d74719692ab65a2a0252584bf8d5f301e2ecb4c0da734530a/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:96d604498a7c782cb15a51c406acaea70d8c027ee6b90c569baa6e7b93073679", size = 1740527, upload-time = "2026-01-03T17:30:34.695Z" }, + { url = "https://files.pythonhosted.org/packages/fa/b4/75ec16cbbd5c01bdaf4a05b19e103e78d7ce1ef7c80867eb0ace42ff4488/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:084911a532763e9d3dd95adf78a78f4096cd5f58cdc18e6fdbc1b58417a45423", size = 1554489, upload-time = "2026-01-03T17:30:36.864Z" }, + { url = "https://files.pythonhosted.org/packages/52/8f/bc518c0eea29f8406dcf7ed1f96c9b48e3bc3995a96159b3fc11f9e08321/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7a4a94eb787e606d0a09404b9c38c113d3b099d508021faa615d70a0131907ce", size = 1767852, upload-time = "2026-01-03T17:30:39.433Z" }, + { url = "https://files.pythonhosted.org/packages/9d/f2/a07a75173124f31f11ea6f863dc44e6f09afe2bca45dd4e64979490deab1/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:87797e645d9d8e222e04160ee32aa06bc5c163e8499f24db719e7852ec23093a", size = 1722379, upload-time = "2026-01-03T17:30:41.081Z" }, + { url = "https://files.pythonhosted.org/packages/3c/4a/1a3fee7c21350cac78e5c5cef711bac1b94feca07399f3d406972e2d8fcd/aiohttp-3.13.3-cp312-cp312-win32.whl", hash = "sha256:b04be762396457bef43f3597c991e192ee7da460a4953d7e647ee4b1c28e7046", size = 428253, upload-time = "2026-01-03T17:30:42.644Z" }, + { url = "https://files.pythonhosted.org/packages/d9/b7/76175c7cb4eb73d91ad63c34e29fc4f77c9386bba4a65b53ba8e05ee3c39/aiohttp-3.13.3-cp312-cp312-win_amd64.whl", hash = "sha256:e3531d63d3bdfa7e3ac5e9b27b2dd7ec9df3206a98e0b3445fa906f233264c57", size = 455407, upload-time = "2026-01-03T17:30:44.195Z" }, + { url = "https://files.pythonhosted.org/packages/97/8a/12ca489246ca1faaf5432844adbfce7ff2cc4997733e0af120869345643a/aiohttp-3.13.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5dff64413671b0d3e7d5918ea490bdccb97a4ad29b3f311ed423200b2203e01c", size = 734190, upload-time = "2026-01-03T17:30:45.832Z" }, + { url = "https://files.pythonhosted.org/packages/32/08/de43984c74ed1fca5c014808963cc83cb00d7bb06af228f132d33862ca76/aiohttp-3.13.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:87b9aab6d6ed88235aa2970294f496ff1a1f9adcd724d800e9b952395a80ffd9", size = 491783, upload-time = "2026-01-03T17:30:47.466Z" }, + { url = "https://files.pythonhosted.org/packages/17/f8/8dd2cf6112a5a76f81f81a5130c57ca829d101ad583ce57f889179accdda/aiohttp-3.13.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:425c126c0dc43861e22cb1c14ba4c8e45d09516d0a3ae0a3f7494b79f5f233a3", size = 490704, upload-time = "2026-01-03T17:30:49.373Z" }, + { url = "https://files.pythonhosted.org/packages/6d/40/a46b03ca03936f832bc7eaa47cfbb1ad012ba1be4790122ee4f4f8cba074/aiohttp-3.13.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f9120f7093c2a32d9647abcaf21e6ad275b4fbec5b55969f978b1a97c7c86bf", size = 1720652, upload-time = "2026-01-03T17:30:50.974Z" }, + { url = "https://files.pythonhosted.org/packages/f7/7e/917fe18e3607af92657e4285498f500dca797ff8c918bd7d90b05abf6c2a/aiohttp-3.13.3-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:697753042d57f4bf7122cab985bf15d0cef23c770864580f5af4f52023a56bd6", size = 1692014, upload-time = "2026-01-03T17:30:52.729Z" }, + { url = "https://files.pythonhosted.org/packages/71/b6/cefa4cbc00d315d68973b671cf105b21a609c12b82d52e5d0c9ae61d2a09/aiohttp-3.13.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6de499a1a44e7de70735d0b39f67c8f25eb3d91eb3103be99ca0fa882cdd987d", size = 1759777, upload-time = "2026-01-03T17:30:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/fb/e3/e06ee07b45e59e6d81498b591fc589629be1553abb2a82ce33efe2a7b068/aiohttp-3.13.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:37239e9f9a7ea9ac5bf6b92b0260b01f8a22281996da609206a84df860bc1261", size = 1861276, upload-time = "2026-01-03T17:30:56.512Z" }, + { url = "https://files.pythonhosted.org/packages/7c/24/75d274228acf35ceeb2850b8ce04de9dd7355ff7a0b49d607ee60c29c518/aiohttp-3.13.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f76c1e3fe7d7c8afad7ed193f89a292e1999608170dcc9751a7462a87dfd5bc0", size = 1743131, upload-time = "2026-01-03T17:30:58.256Z" }, + { url = "https://files.pythonhosted.org/packages/04/98/3d21dde21889b17ca2eea54fdcff21b27b93f45b7bb94ca029c31ab59dc3/aiohttp-3.13.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fc290605db2a917f6e81b0e1e0796469871f5af381ce15c604a3c5c7e51cb730", size = 1556863, upload-time = "2026-01-03T17:31:00.445Z" }, + { url = "https://files.pythonhosted.org/packages/9e/84/da0c3ab1192eaf64782b03971ab4055b475d0db07b17eff925e8c93b3aa5/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4021b51936308aeea0367b8f006dc999ca02bc118a0cc78c303f50a2ff6afb91", size = 1682793, upload-time = "2026-01-03T17:31:03.024Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0f/5802ada182f575afa02cbd0ec5180d7e13a402afb7c2c03a9aa5e5d49060/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:49a03727c1bba9a97d3e93c9f93ca03a57300f484b6e935463099841261195d3", size = 1716676, upload-time = "2026-01-03T17:31:04.842Z" }, + { url = "https://files.pythonhosted.org/packages/3f/8c/714d53bd8b5a4560667f7bbbb06b20c2382f9c7847d198370ec6526af39c/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3d9908a48eb7416dc1f4524e69f1d32e5d90e3981e4e37eb0aa1cd18f9cfa2a4", size = 1733217, upload-time = "2026-01-03T17:31:06.868Z" }, + { url = "https://files.pythonhosted.org/packages/7d/79/e2176f46d2e963facea939f5be2d26368ce543622be6f00a12844d3c991f/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2712039939ec963c237286113c68dbad80a82a4281543f3abf766d9d73228998", size = 1552303, upload-time = "2026-01-03T17:31:08.958Z" }, + { url = "https://files.pythonhosted.org/packages/ab/6a/28ed4dea1759916090587d1fe57087b03e6c784a642b85ef48217b0277ae/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7bfdc049127717581866fa4708791220970ce291c23e28ccf3922c700740fdc0", size = 1763673, upload-time = "2026-01-03T17:31:10.676Z" }, + { url = "https://files.pythonhosted.org/packages/e8/35/4a3daeb8b9fab49240d21c04d50732313295e4bd813a465d840236dd0ce1/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8057c98e0c8472d8846b9c79f56766bcc57e3e8ac7bfd510482332366c56c591", size = 1721120, upload-time = "2026-01-03T17:31:12.575Z" }, + { url = "https://files.pythonhosted.org/packages/bc/9f/d643bb3c5fb99547323e635e251c609fbbc660d983144cfebec529e09264/aiohttp-3.13.3-cp313-cp313-win32.whl", hash = "sha256:1449ceddcdbcf2e0446957863af03ebaaa03f94c090f945411b61269e2cb5daf", size = 427383, upload-time = "2026-01-03T17:31:14.382Z" }, + { url = "https://files.pythonhosted.org/packages/4e/f1/ab0395f8a79933577cdd996dd2f9aa6014af9535f65dddcf88204682fe62/aiohttp-3.13.3-cp313-cp313-win_amd64.whl", hash = "sha256:693781c45a4033d31d4187d2436f5ac701e7bbfe5df40d917736108c1cc7436e", size = 453899, upload-time = "2026-01-03T17:31:15.958Z" }, + { url = "https://files.pythonhosted.org/packages/99/36/5b6514a9f5d66f4e2597e40dea2e3db271e023eb7a5d22defe96ba560996/aiohttp-3.13.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:ea37047c6b367fd4bd632bff8077449b8fa034b69e812a18e0132a00fae6e808", size = 737238, upload-time = "2026-01-03T17:31:17.909Z" }, + { url = "https://files.pythonhosted.org/packages/f7/49/459327f0d5bcd8c6c9ca69e60fdeebc3622861e696490d8674a6d0cb90a6/aiohttp-3.13.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6fc0e2337d1a4c3e6acafda6a78a39d4c14caea625124817420abceed36e2415", size = 492292, upload-time = "2026-01-03T17:31:19.919Z" }, + { url = "https://files.pythonhosted.org/packages/e8/0b/b97660c5fd05d3495b4eb27f2d0ef18dc1dc4eff7511a9bf371397ff0264/aiohttp-3.13.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c685f2d80bb67ca8c3837823ad76196b3694b0159d232206d1e461d3d434666f", size = 493021, upload-time = "2026-01-03T17:31:21.636Z" }, + { url = "https://files.pythonhosted.org/packages/54/d4/438efabdf74e30aeceb890c3290bbaa449780583b1270b00661126b8aae4/aiohttp-3.13.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:48e377758516d262bde50c2584fc6c578af272559c409eecbdd2bae1601184d6", size = 1717263, upload-time = "2026-01-03T17:31:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/71/f2/7bddc7fd612367d1459c5bcf598a9e8f7092d6580d98de0e057eb42697ad/aiohttp-3.13.3-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:34749271508078b261c4abb1767d42b8d0c0cc9449c73a4df494777dc55f0687", size = 1669107, upload-time = "2026-01-03T17:31:25.334Z" }, + { url = "https://files.pythonhosted.org/packages/00/5a/1aeaecca40e22560f97610a329e0e5efef5e0b5afdf9f857f0d93839ab2e/aiohttp-3.13.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:82611aeec80eb144416956ec85b6ca45a64d76429c1ed46ae1b5f86c6e0c9a26", size = 1760196, upload-time = "2026-01-03T17:31:27.394Z" }, + { url = "https://files.pythonhosted.org/packages/f8/f8/0ff6992bea7bd560fc510ea1c815f87eedd745fe035589c71ce05612a19a/aiohttp-3.13.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2fff83cfc93f18f215896e3a190e8e5cb413ce01553901aca925176e7568963a", size = 1843591, upload-time = "2026-01-03T17:31:29.238Z" }, + { url = "https://files.pythonhosted.org/packages/e3/d1/e30e537a15f53485b61f5be525f2157da719819e8377298502aebac45536/aiohttp-3.13.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bbe7d4cecacb439e2e2a8a1a7b935c25b812af7a5fd26503a66dadf428e79ec1", size = 1720277, upload-time = "2026-01-03T17:31:31.053Z" }, + { url = "https://files.pythonhosted.org/packages/84/45/23f4c451d8192f553d38d838831ebbc156907ea6e05557f39563101b7717/aiohttp-3.13.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b928f30fe49574253644b1ca44b1b8adbd903aa0da4b9054a6c20fc7f4092a25", size = 1548575, upload-time = "2026-01-03T17:31:32.87Z" }, + { url = "https://files.pythonhosted.org/packages/6a/ed/0a42b127a43712eda7807e7892c083eadfaf8429ca8fb619662a530a3aab/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7b5e8fe4de30df199155baaf64f2fcd604f4c678ed20910db8e2c66dc4b11603", size = 1679455, upload-time = "2026-01-03T17:31:34.76Z" }, + { url = "https://files.pythonhosted.org/packages/2e/b5/c05f0c2b4b4fe2c9d55e73b6d3ed4fd6c9dc2684b1d81cbdf77e7fad9adb/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:8542f41a62bcc58fc7f11cf7c90e0ec324ce44950003feb70640fc2a9092c32a", size = 1687417, upload-time = "2026-01-03T17:31:36.699Z" }, + { url = "https://files.pythonhosted.org/packages/c9/6b/915bc5dad66aef602b9e459b5a973529304d4e89ca86999d9d75d80cbd0b/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5e1d8c8b8f1d91cd08d8f4a3c2b067bfca6ec043d3ff36de0f3a715feeedf926", size = 1729968, upload-time = "2026-01-03T17:31:38.622Z" }, + { url = "https://files.pythonhosted.org/packages/11/3b/e84581290a9520024a08640b63d07673057aec5ca548177a82026187ba73/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:90455115e5da1c3c51ab619ac57f877da8fd6d73c05aacd125c5ae9819582aba", size = 1545690, upload-time = "2026-01-03T17:31:40.57Z" }, + { url = "https://files.pythonhosted.org/packages/f5/04/0c3655a566c43fd647c81b895dfe361b9f9ad6d58c19309d45cff52d6c3b/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:042e9e0bcb5fba81886c8b4fbb9a09d6b8a00245fd8d88e4d989c1f96c74164c", size = 1746390, upload-time = "2026-01-03T17:31:42.857Z" }, + { url = "https://files.pythonhosted.org/packages/1f/53/71165b26978f719c3419381514c9690bd5980e764a09440a10bb816ea4ab/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2eb752b102b12a76ca02dff751a801f028b4ffbbc478840b473597fc91a9ed43", size = 1702188, upload-time = "2026-01-03T17:31:44.984Z" }, + { url = "https://files.pythonhosted.org/packages/29/a7/cbe6c9e8e136314fa1980da388a59d2f35f35395948a08b6747baebb6aa6/aiohttp-3.13.3-cp314-cp314-win32.whl", hash = "sha256:b556c85915d8efaed322bf1bdae9486aa0f3f764195a0fb6ee962e5c71ef5ce1", size = 433126, upload-time = "2026-01-03T17:31:47.463Z" }, + { url = "https://files.pythonhosted.org/packages/de/56/982704adea7d3b16614fc5936014e9af85c0e34b58f9046655817f04306e/aiohttp-3.13.3-cp314-cp314-win_amd64.whl", hash = "sha256:9bf9f7a65e7aa20dd764151fb3d616c81088f91f8df39c3893a536e279b4b984", size = 459128, upload-time = "2026-01-03T17:31:49.2Z" }, + { url = "https://files.pythonhosted.org/packages/6c/2a/3c79b638a9c3d4658d345339d22070241ea341ed4e07b5ac60fb0f418003/aiohttp-3.13.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:05861afbbec40650d8a07ea324367cb93e9e8cc7762e04dd4405df99fa65159c", size = 769512, upload-time = "2026-01-03T17:31:51.134Z" }, + { url = "https://files.pythonhosted.org/packages/29/b9/3e5014d46c0ab0db8707e0ac2711ed28c4da0218c358a4e7c17bae0d8722/aiohttp-3.13.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2fc82186fadc4a8316768d61f3722c230e2c1dcab4200d52d2ebdf2482e47592", size = 506444, upload-time = "2026-01-03T17:31:52.85Z" }, + { url = "https://files.pythonhosted.org/packages/90/03/c1d4ef9a054e151cd7839cdc497f2638f00b93cbe8043983986630d7a80c/aiohttp-3.13.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0add0900ff220d1d5c5ebbf99ed88b0c1bbf87aa7e4262300ed1376a6b13414f", size = 510798, upload-time = "2026-01-03T17:31:54.91Z" }, + { url = "https://files.pythonhosted.org/packages/ea/76/8c1e5abbfe8e127c893fe7ead569148a4d5a799f7cf958d8c09f3eedf097/aiohttp-3.13.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:568f416a4072fbfae453dcf9a99194bbb8bdeab718e08ee13dfa2ba0e4bebf29", size = 1868835, upload-time = "2026-01-03T17:31:56.733Z" }, + { url = "https://files.pythonhosted.org/packages/8e/ac/984c5a6f74c363b01ff97adc96a3976d9c98940b8969a1881575b279ac5d/aiohttp-3.13.3-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:add1da70de90a2569c5e15249ff76a631ccacfe198375eead4aadf3b8dc849dc", size = 1720486, upload-time = "2026-01-03T17:31:58.65Z" }, + { url = "https://files.pythonhosted.org/packages/b2/9a/b7039c5f099c4eb632138728828b33428585031a1e658d693d41d07d89d1/aiohttp-3.13.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:10b47b7ba335d2e9b1239fa571131a87e2d8ec96b333e68b2a305e7a98b0bae2", size = 1847951, upload-time = "2026-01-03T17:32:00.989Z" }, + { url = "https://files.pythonhosted.org/packages/3c/02/3bec2b9a1ba3c19ff89a43a19324202b8eb187ca1e928d8bdac9bbdddebd/aiohttp-3.13.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3dd4dce1c718e38081c8f35f323209d4c1df7d4db4bab1b5c88a6b4d12b74587", size = 1941001, upload-time = "2026-01-03T17:32:03.122Z" }, + { url = "https://files.pythonhosted.org/packages/37/df/d879401cedeef27ac4717f6426c8c36c3091c6e9f08a9178cc87549c537f/aiohttp-3.13.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34bac00a67a812570d4a460447e1e9e06fae622946955f939051e7cc895cfab8", size = 1797246, upload-time = "2026-01-03T17:32:05.255Z" }, + { url = "https://files.pythonhosted.org/packages/8d/15/be122de1f67e6953add23335c8ece6d314ab67c8bebb3f181063010795a7/aiohttp-3.13.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a19884d2ee70b06d9204b2727a7b9f983d0c684c650254679e716b0b77920632", size = 1627131, upload-time = "2026-01-03T17:32:07.607Z" }, + { url = "https://files.pythonhosted.org/packages/12/12/70eedcac9134cfa3219ab7af31ea56bc877395b1ac30d65b1bc4b27d0438/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5f8ca7f2bb6ba8348a3614c7918cc4bb73268c5ac2a207576b7afea19d3d9f64", size = 1795196, upload-time = "2026-01-03T17:32:09.59Z" }, + { url = "https://files.pythonhosted.org/packages/32/11/b30e1b1cd1f3054af86ebe60df96989c6a414dd87e27ad16950eee420bea/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:b0d95340658b9d2f11d9697f59b3814a9d3bb4b7a7c20b131df4bcef464037c0", size = 1782841, upload-time = "2026-01-03T17:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/88/0d/d98a9367b38912384a17e287850f5695c528cff0f14f791ce8ee2e4f7796/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:a1e53262fd202e4b40b70c3aff944a8155059beedc8a89bba9dc1f9ef06a1b56", size = 1795193, upload-time = "2026-01-03T17:32:13.705Z" }, + { url = "https://files.pythonhosted.org/packages/43/a5/a2dfd1f5ff5581632c7f6a30e1744deda03808974f94f6534241ef60c751/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:d60ac9663f44168038586cab2157e122e46bdef09e9368b37f2d82d354c23f72", size = 1621979, upload-time = "2026-01-03T17:32:15.965Z" }, + { url = "https://files.pythonhosted.org/packages/fa/f0/12973c382ae7c1cccbc4417e129c5bf54c374dfb85af70893646e1f0e749/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:90751b8eed69435bac9ff4e3d2f6b3af1f57e37ecb0fbeee59c0174c9e2d41df", size = 1822193, upload-time = "2026-01-03T17:32:18.219Z" }, + { url = "https://files.pythonhosted.org/packages/3c/5f/24155e30ba7f8c96918af1350eb0663e2430aad9e001c0489d89cd708ab1/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fc353029f176fd2b3ec6cfc71be166aba1936fe5d73dd1992ce289ca6647a9aa", size = 1769801, upload-time = "2026-01-03T17:32:20.25Z" }, + { url = "https://files.pythonhosted.org/packages/eb/f8/7314031ff5c10e6ece114da79b338ec17eeff3a079e53151f7e9f43c4723/aiohttp-3.13.3-cp314-cp314t-win32.whl", hash = "sha256:2e41b18a58da1e474a057b3d35248d8320029f61d70a37629535b16a0c8f3767", size = 466523, upload-time = "2026-01-03T17:32:22.215Z" }, + { url = "https://files.pythonhosted.org/packages/b4/63/278a98c715ae467624eafe375542d8ba9b4383a016df8fdefe0ae28382a7/aiohttp-3.13.3-cp314-cp314t-win_amd64.whl", hash = "sha256:44531a36aa2264a1860089ffd4dce7baf875ee5a6079d5fb42e261c704ef7344", size = 499694, upload-time = "2026-01-03T17:32:24.546Z" }, ] [[package]] @@ -731,6 +731,7 @@ version = "0.1.0" source = { virtual = "." } dependencies = [ { name = "agent-framework" }, + { name = "aiohttp" }, { name = "azure-ai-agents" }, { name = "azure-ai-evaluation" }, { name = "azure-ai-inference" }, @@ -741,8 +742,10 @@ dependencies = [ { name = "azure-monitor-events-extension" }, { name = "azure-monitor-opentelemetry" }, { name = "azure-search-documents" }, + { name = "cryptography" }, { name = "fastapi" }, { name = "mcp" }, + { name = "nltk" }, { name = "openai" }, { name = "opentelemetry-api" }, { name = "opentelemetry-exporter-otlp-proto-grpc" }, @@ -751,6 +754,8 @@ dependencies = [ { name = "opentelemetry-instrumentation-openai" }, { name = "opentelemetry-sdk" }, { name = "pexpect" }, + { name = "protobuf" }, + { name = "pyasn1" }, { name = "pylint-pydantic" }, { name = "pytest" }, { name = "pytest-asyncio" }, @@ -758,6 +763,7 @@ dependencies = [ { name = "python-dotenv" }, { name = "python-multipart" }, { name = "semantic-kernel" }, + { name = "urllib3" }, { name = "uvicorn" }, { name = "werkzeug" }, ] @@ -765,6 +771,7 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "agent-framework", specifier = ">=1.0.0b251105" }, + { name = "aiohttp", specifier = "==3.13.3" }, { name = "azure-ai-agents", specifier = "==1.2.0b5" }, { name = "azure-ai-evaluation", specifier = "==1.11.0" }, { name = "azure-ai-inference", specifier = "==1.0.0b9" }, @@ -775,8 +782,10 @@ requires-dist = [ { name = "azure-monitor-events-extension", specifier = "==0.1.0" }, { name = "azure-monitor-opentelemetry", specifier = "==1.7.0" }, { name = "azure-search-documents", specifier = "==11.5.3" }, + { name = "cryptography", specifier = "==46.0.5" }, { name = "fastapi", specifier = "==0.116.1" }, { name = "mcp", specifier = "==1.26.0" }, + { name = "nltk", specifier = "==3.9.3" }, { name = "openai", specifier = "==1.105.0" }, { name = "opentelemetry-api", specifier = "==1.36.0" }, { name = "opentelemetry-exporter-otlp-proto-grpc", specifier = "==1.36.0" }, @@ -785,13 +794,16 @@ requires-dist = [ { name = "opentelemetry-instrumentation-openai", specifier = "==0.46.2" }, { name = "opentelemetry-sdk", specifier = "==1.36.0" }, { name = "pexpect", specifier = "==4.9.0" }, + { name = "protobuf", specifier = "==5.29.6" }, + { name = "pyasn1", specifier = "==0.6.2" }, { name = "pylint-pydantic", specifier = "==0.3.5" }, { name = "pytest", specifier = "==8.4.1" }, { name = "pytest-asyncio", specifier = "==0.24.0" }, { name = "pytest-cov", specifier = "==5.0.0" }, { name = "python-dotenv", specifier = "==1.1.1" }, - { name = "python-multipart", specifier = "==0.0.20" }, + { name = "python-multipart", specifier = "==0.0.22" }, { name = "semantic-kernel", specifier = "==1.39.4" }, + { name = "urllib3", specifier = "==2.6.3" }, { name = "uvicorn", specifier = "==0.35.0" }, { name = "werkzeug", specifier = "==3.1.5" }, ] @@ -1102,64 +1114,61 @@ toml = [ [[package]] name = "cryptography" -version = "46.0.3" +version = "46.0.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9f/33/c00162f49c0e2fe8064a62cb92b93e50c74a72bc370ab92f86112b33ff62/cryptography-46.0.3.tar.gz", hash = "sha256:a8b17438104fed022ce745b362294d9ce35b4c2e45c1d958ad4a4b019285f4a1", size = 749258, upload-time = "2025-10-15T23:18:31.74Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/42/9c391dd801d6cf0d561b5890549d4b27bafcc53b39c31a817e69d87c625b/cryptography-46.0.3-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:109d4ddfadf17e8e7779c39f9b18111a09efb969a301a31e987416a0191ed93a", size = 7225004, upload-time = "2025-10-15T23:16:52.239Z" }, - { url = "https://files.pythonhosted.org/packages/1c/67/38769ca6b65f07461eb200e85fc1639b438bdc667be02cf7f2cd6a64601c/cryptography-46.0.3-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:09859af8466b69bc3c27bdf4f5d84a665e0f7ab5088412e9e2ec49758eca5cbc", size = 4296667, upload-time = "2025-10-15T23:16:54.369Z" }, - { url = "https://files.pythonhosted.org/packages/5c/49/498c86566a1d80e978b42f0d702795f69887005548c041636df6ae1ca64c/cryptography-46.0.3-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:01ca9ff2885f3acc98c29f1860552e37f6d7c7d013d7334ff2a9de43a449315d", size = 4450807, upload-time = "2025-10-15T23:16:56.414Z" }, - { url = "https://files.pythonhosted.org/packages/4b/0a/863a3604112174c8624a2ac3c038662d9e59970c7f926acdcfaed8d61142/cryptography-46.0.3-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6eae65d4c3d33da080cff9c4ab1f711b15c1d9760809dad6ea763f3812d254cb", size = 4299615, upload-time = "2025-10-15T23:16:58.442Z" }, - { url = "https://files.pythonhosted.org/packages/64/02/b73a533f6b64a69f3cd3872acb6ebc12aef924d8d103133bb3ea750dc703/cryptography-46.0.3-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5bf0ed4490068a2e72ac03d786693adeb909981cc596425d09032d372bcc849", size = 4016800, upload-time = "2025-10-15T23:17:00.378Z" }, - { url = "https://files.pythonhosted.org/packages/25/d5/16e41afbfa450cde85a3b7ec599bebefaef16b5c6ba4ec49a3532336ed72/cryptography-46.0.3-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5ecfccd2329e37e9b7112a888e76d9feca2347f12f37918facbb893d7bb88ee8", size = 4984707, upload-time = "2025-10-15T23:17:01.98Z" }, - { url = "https://files.pythonhosted.org/packages/c9/56/e7e69b427c3878352c2fb9b450bd0e19ed552753491d39d7d0a2f5226d41/cryptography-46.0.3-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a2c0cd47381a3229c403062f764160d57d4d175e022c1df84e168c6251a22eec", size = 4482541, upload-time = "2025-10-15T23:17:04.078Z" }, - { url = "https://files.pythonhosted.org/packages/78/f6/50736d40d97e8483172f1bb6e698895b92a223dba513b0ca6f06b2365339/cryptography-46.0.3-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:549e234ff32571b1f4076ac269fcce7a808d3bf98b76c8dd560e42dbc66d7d91", size = 4299464, upload-time = "2025-10-15T23:17:05.483Z" }, - { url = "https://files.pythonhosted.org/packages/00/de/d8e26b1a855f19d9994a19c702fa2e93b0456beccbcfe437eda00e0701f2/cryptography-46.0.3-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:c0a7bb1a68a5d3471880e264621346c48665b3bf1c3759d682fc0864c540bd9e", size = 4950838, upload-time = "2025-10-15T23:17:07.425Z" }, - { url = "https://files.pythonhosted.org/packages/8f/29/798fc4ec461a1c9e9f735f2fc58741b0daae30688f41b2497dcbc9ed1355/cryptography-46.0.3-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:10b01676fc208c3e6feeb25a8b83d81767e8059e1fe86e1dc62d10a3018fa926", size = 4481596, upload-time = "2025-10-15T23:17:09.343Z" }, - { url = "https://files.pythonhosted.org/packages/15/8d/03cd48b20a573adfff7652b76271078e3045b9f49387920e7f1f631d125e/cryptography-46.0.3-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0abf1ffd6e57c67e92af68330d05760b7b7efb243aab8377e583284dbab72c71", size = 4426782, upload-time = "2025-10-15T23:17:11.22Z" }, - { url = "https://files.pythonhosted.org/packages/fa/b1/ebacbfe53317d55cf33165bda24c86523497a6881f339f9aae5c2e13e57b/cryptography-46.0.3-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a04bee9ab6a4da801eb9b51f1b708a1b5b5c9eb48c03f74198464c66f0d344ac", size = 4698381, upload-time = "2025-10-15T23:17:12.829Z" }, - { url = "https://files.pythonhosted.org/packages/96/92/8a6a9525893325fc057a01f654d7efc2c64b9de90413adcf605a85744ff4/cryptography-46.0.3-cp311-abi3-win32.whl", hash = "sha256:f260d0d41e9b4da1ed1e0f1ce571f97fe370b152ab18778e9e8f67d6af432018", size = 3055988, upload-time = "2025-10-15T23:17:14.65Z" }, - { url = "https://files.pythonhosted.org/packages/7e/bf/80fbf45253ea585a1e492a6a17efcb93467701fa79e71550a430c5e60df0/cryptography-46.0.3-cp311-abi3-win_amd64.whl", hash = "sha256:a9a3008438615669153eb86b26b61e09993921ebdd75385ddd748702c5adfddb", size = 3514451, upload-time = "2025-10-15T23:17:16.142Z" }, - { url = "https://files.pythonhosted.org/packages/2e/af/9b302da4c87b0beb9db4e756386a7c6c5b8003cd0e742277888d352ae91d/cryptography-46.0.3-cp311-abi3-win_arm64.whl", hash = "sha256:5d7f93296ee28f68447397bf5198428c9aeeab45705a55d53a6343455dcb2c3c", size = 2928007, upload-time = "2025-10-15T23:17:18.04Z" }, - { url = "https://files.pythonhosted.org/packages/f5/e2/a510aa736755bffa9d2f75029c229111a1d02f8ecd5de03078f4c18d91a3/cryptography-46.0.3-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:00a5e7e87938e5ff9ff5447ab086a5706a957137e6e433841e9d24f38a065217", size = 7158012, upload-time = "2025-10-15T23:17:19.982Z" }, - { url = "https://files.pythonhosted.org/packages/73/dc/9aa866fbdbb95b02e7f9d086f1fccfeebf8953509b87e3f28fff927ff8a0/cryptography-46.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c8daeb2d2174beb4575b77482320303f3d39b8e81153da4f0fb08eb5fe86a6c5", size = 4288728, upload-time = "2025-10-15T23:17:21.527Z" }, - { url = "https://files.pythonhosted.org/packages/c5/fd/bc1daf8230eaa075184cbbf5f8cd00ba9db4fd32d63fb83da4671b72ed8a/cryptography-46.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:39b6755623145ad5eff1dab323f4eae2a32a77a7abef2c5089a04a3d04366715", size = 4435078, upload-time = "2025-10-15T23:17:23.042Z" }, - { url = "https://files.pythonhosted.org/packages/82/98/d3bd5407ce4c60017f8ff9e63ffee4200ab3e23fe05b765cab805a7db008/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:db391fa7c66df6762ee3f00c95a89e6d428f4d60e7abc8328f4fe155b5ac6e54", size = 4293460, upload-time = "2025-10-15T23:17:24.885Z" }, - { url = "https://files.pythonhosted.org/packages/26/e9/e23e7900983c2b8af7a08098db406cf989d7f09caea7897e347598d4cd5b/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:78a97cf6a8839a48c49271cdcbd5cf37ca2c1d6b7fdd86cc864f302b5e9bf459", size = 3995237, upload-time = "2025-10-15T23:17:26.449Z" }, - { url = "https://files.pythonhosted.org/packages/91/15/af68c509d4a138cfe299d0d7ddb14afba15233223ebd933b4bbdbc7155d3/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:dfb781ff7eaa91a6f7fd41776ec37c5853c795d3b358d4896fdbb5df168af422", size = 4967344, upload-time = "2025-10-15T23:17:28.06Z" }, - { url = "https://files.pythonhosted.org/packages/ca/e3/8643d077c53868b681af077edf6b3cb58288b5423610f21c62aadcbe99f4/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:6f61efb26e76c45c4a227835ddeae96d83624fb0d29eb5df5b96e14ed1a0afb7", size = 4466564, upload-time = "2025-10-15T23:17:29.665Z" }, - { url = "https://files.pythonhosted.org/packages/0e/43/c1e8726fa59c236ff477ff2b5dc071e54b21e5a1e51aa2cee1676f1c986f/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:23b1a8f26e43f47ceb6d6a43115f33a5a37d57df4ea0ca295b780ae8546e8044", size = 4292415, upload-time = "2025-10-15T23:17:31.686Z" }, - { url = "https://files.pythonhosted.org/packages/42/f9/2f8fefdb1aee8a8e3256a0568cffc4e6d517b256a2fe97a029b3f1b9fe7e/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:b419ae593c86b87014b9be7396b385491ad7f320bde96826d0dd174459e54665", size = 4931457, upload-time = "2025-10-15T23:17:33.478Z" }, - { url = "https://files.pythonhosted.org/packages/79/30/9b54127a9a778ccd6d27c3da7563e9f2d341826075ceab89ae3b41bf5be2/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:50fc3343ac490c6b08c0cf0d704e881d0d660be923fd3076db3e932007e726e3", size = 4466074, upload-time = "2025-10-15T23:17:35.158Z" }, - { url = "https://files.pythonhosted.org/packages/ac/68/b4f4a10928e26c941b1b6a179143af9f4d27d88fe84a6a3c53592d2e76bf/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:22d7e97932f511d6b0b04f2bfd818d73dcd5928db509460aaf48384778eb6d20", size = 4420569, upload-time = "2025-10-15T23:17:37.188Z" }, - { url = "https://files.pythonhosted.org/packages/a3/49/3746dab4c0d1979888f125226357d3262a6dd40e114ac29e3d2abdf1ec55/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d55f3dffadd674514ad19451161118fd010988540cee43d8bc20675e775925de", size = 4681941, upload-time = "2025-10-15T23:17:39.236Z" }, - { url = "https://files.pythonhosted.org/packages/fd/30/27654c1dbaf7e4a3531fa1fc77986d04aefa4d6d78259a62c9dc13d7ad36/cryptography-46.0.3-cp314-cp314t-win32.whl", hash = "sha256:8a6e050cb6164d3f830453754094c086ff2d0b2f3a897a1d9820f6139a1f0914", size = 3022339, upload-time = "2025-10-15T23:17:40.888Z" }, - { url = "https://files.pythonhosted.org/packages/f6/30/640f34ccd4d2a1bc88367b54b926b781b5a018d65f404d409aba76a84b1c/cryptography-46.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:760f83faa07f8b64e9c33fc963d790a2edb24efb479e3520c14a45741cd9b2db", size = 3494315, upload-time = "2025-10-15T23:17:42.769Z" }, - { url = "https://files.pythonhosted.org/packages/ba/8b/88cc7e3bd0a8e7b861f26981f7b820e1f46aa9d26cc482d0feba0ecb4919/cryptography-46.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:516ea134e703e9fe26bcd1277a4b59ad30586ea90c365a87781d7887a646fe21", size = 2919331, upload-time = "2025-10-15T23:17:44.468Z" }, - { url = "https://files.pythonhosted.org/packages/fd/23/45fe7f376a7df8daf6da3556603b36f53475a99ce4faacb6ba2cf3d82021/cryptography-46.0.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:cb3d760a6117f621261d662bccc8ef5bc32ca673e037c83fbe565324f5c46936", size = 7218248, upload-time = "2025-10-15T23:17:46.294Z" }, - { url = "https://files.pythonhosted.org/packages/27/32/b68d27471372737054cbd34c84981f9edbc24fe67ca225d389799614e27f/cryptography-46.0.3-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4b7387121ac7d15e550f5cb4a43aef2559ed759c35df7336c402bb8275ac9683", size = 4294089, upload-time = "2025-10-15T23:17:48.269Z" }, - { url = "https://files.pythonhosted.org/packages/26/42/fa8389d4478368743e24e61eea78846a0006caffaf72ea24a15159215a14/cryptography-46.0.3-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:15ab9b093e8f09daab0f2159bb7e47532596075139dd74365da52ecc9cb46c5d", size = 4440029, upload-time = "2025-10-15T23:17:49.837Z" }, - { url = "https://files.pythonhosted.org/packages/5f/eb/f483db0ec5ac040824f269e93dd2bd8a21ecd1027e77ad7bdf6914f2fd80/cryptography-46.0.3-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:46acf53b40ea38f9c6c229599a4a13f0d46a6c3fa9ef19fc1a124d62e338dfa0", size = 4297222, upload-time = "2025-10-15T23:17:51.357Z" }, - { url = "https://files.pythonhosted.org/packages/fd/cf/da9502c4e1912cb1da3807ea3618a6829bee8207456fbbeebc361ec38ba3/cryptography-46.0.3-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:10ca84c4668d066a9878890047f03546f3ae0a6b8b39b697457b7757aaf18dbc", size = 4012280, upload-time = "2025-10-15T23:17:52.964Z" }, - { url = "https://files.pythonhosted.org/packages/6b/8f/9adb86b93330e0df8b3dcf03eae67c33ba89958fc2e03862ef1ac2b42465/cryptography-46.0.3-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:36e627112085bb3b81b19fed209c05ce2a52ee8b15d161b7c643a7d5a88491f3", size = 4978958, upload-time = "2025-10-15T23:17:54.965Z" }, - { url = "https://files.pythonhosted.org/packages/d1/a0/5fa77988289c34bdb9f913f5606ecc9ada1adb5ae870bd0d1054a7021cc4/cryptography-46.0.3-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1000713389b75c449a6e979ffc7dcc8ac90b437048766cef052d4d30b8220971", size = 4473714, upload-time = "2025-10-15T23:17:56.754Z" }, - { url = "https://files.pythonhosted.org/packages/14/e5/fc82d72a58d41c393697aa18c9abe5ae1214ff6f2a5c18ac470f92777895/cryptography-46.0.3-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:b02cf04496f6576afffef5ddd04a0cb7d49cf6be16a9059d793a30b035f6b6ac", size = 4296970, upload-time = "2025-10-15T23:17:58.588Z" }, - { url = "https://files.pythonhosted.org/packages/78/06/5663ed35438d0b09056973994f1aec467492b33bd31da36e468b01ec1097/cryptography-46.0.3-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:71e842ec9bc7abf543b47cf86b9a743baa95f4677d22baa4c7d5c69e49e9bc04", size = 4940236, upload-time = "2025-10-15T23:18:00.897Z" }, - { url = "https://files.pythonhosted.org/packages/fc/59/873633f3f2dcd8a053b8dd1d38f783043b5fce589c0f6988bf55ef57e43e/cryptography-46.0.3-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:402b58fc32614f00980b66d6e56a5b4118e6cb362ae8f3fda141ba4689bd4506", size = 4472642, upload-time = "2025-10-15T23:18:02.749Z" }, - { url = "https://files.pythonhosted.org/packages/3d/39/8e71f3930e40f6877737d6f69248cf74d4e34b886a3967d32f919cc50d3b/cryptography-46.0.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ef639cb3372f69ec44915fafcd6698b6cc78fbe0c2ea41be867f6ed612811963", size = 4423126, upload-time = "2025-10-15T23:18:04.85Z" }, - { url = "https://files.pythonhosted.org/packages/cd/c7/f65027c2810e14c3e7268353b1681932b87e5a48e65505d8cc17c99e36ae/cryptography-46.0.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b51b8ca4f1c6453d8829e1eb7299499ca7f313900dd4d89a24b8b87c0a780d4", size = 4686573, upload-time = "2025-10-15T23:18:06.908Z" }, - { url = "https://files.pythonhosted.org/packages/0a/6e/1c8331ddf91ca4730ab3086a0f1be19c65510a33b5a441cb334e7a2d2560/cryptography-46.0.3-cp38-abi3-win32.whl", hash = "sha256:6276eb85ef938dc035d59b87c8a7dc559a232f954962520137529d77b18ff1df", size = 3036695, upload-time = "2025-10-15T23:18:08.672Z" }, - { url = "https://files.pythonhosted.org/packages/90/45/b0d691df20633eff80955a0fc7695ff9051ffce8b69741444bd9ed7bd0db/cryptography-46.0.3-cp38-abi3-win_amd64.whl", hash = "sha256:416260257577718c05135c55958b674000baef9a1c7d9e8f306ec60d71db850f", size = 3501720, upload-time = "2025-10-15T23:18:10.632Z" }, - { url = "https://files.pythonhosted.org/packages/e8/cb/2da4cc83f5edb9c3257d09e1e7ab7b23f049c7962cae8d842bbef0a9cec9/cryptography-46.0.3-cp38-abi3-win_arm64.whl", hash = "sha256:d89c3468de4cdc4f08a57e214384d0471911a3830fcdaf7a8cc587e42a866372", size = 2918740, upload-time = "2025-10-15T23:18:12.277Z" }, - { url = "https://files.pythonhosted.org/packages/06/8a/e60e46adab4362a682cf142c7dcb5bf79b782ab2199b0dcb81f55970807f/cryptography-46.0.3-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7ce938a99998ed3c8aa7e7272dca1a610401ede816d36d0693907d863b10d9ea", size = 3698132, upload-time = "2025-10-15T23:18:17.056Z" }, - { url = "https://files.pythonhosted.org/packages/da/38/f59940ec4ee91e93d3311f7532671a5cef5570eb04a144bf203b58552d11/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:191bb60a7be5e6f54e30ba16fdfae78ad3a342a0599eb4193ba88e3f3d6e185b", size = 4243992, upload-time = "2025-10-15T23:18:18.695Z" }, - { url = "https://files.pythonhosted.org/packages/b0/0c/35b3d92ddebfdfda76bb485738306545817253d0a3ded0bfe80ef8e67aa5/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c70cc23f12726be8f8bc72e41d5065d77e4515efae3690326764ea1b07845cfb", size = 4409944, upload-time = "2025-10-15T23:18:20.597Z" }, - { url = "https://files.pythonhosted.org/packages/99/55/181022996c4063fc0e7666a47049a1ca705abb9c8a13830f074edb347495/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:9394673a9f4de09e28b5356e7fff97d778f8abad85c9d5ac4a4b7e25a0de7717", size = 4242957, upload-time = "2025-10-15T23:18:22.18Z" }, - { url = "https://files.pythonhosted.org/packages/ba/af/72cd6ef29f9c5f731251acadaeb821559fe25f10852f44a63374c9ca08c1/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:94cd0549accc38d1494e1f8de71eca837d0509d0d44bf11d158524b0e12cebf9", size = 4409447, upload-time = "2025-10-15T23:18:24.209Z" }, - { url = "https://files.pythonhosted.org/packages/0d/c3/e90f4a4feae6410f914f8ebac129b9ae7a8c92eb60a638012dde42030a9d/cryptography-46.0.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6b5063083824e5509fdba180721d55909ffacccc8adbec85268b48439423d78c", size = 3438528, upload-time = "2025-10-15T23:18:26.227Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/60/04/ee2a9e8542e4fa2773b81771ff8349ff19cdd56b7258a0cc442639052edb/cryptography-46.0.5.tar.gz", hash = "sha256:abace499247268e3757271b2f1e244b36b06f8515cf27c4d49468fc9eb16e93d", size = 750064, upload-time = "2026-02-10T19:18:38.255Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/81/b0bb27f2ba931a65409c6b8a8b358a7f03c0e46eceacddff55f7c84b1f3b/cryptography-46.0.5-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:351695ada9ea9618b3500b490ad54c739860883df6c1f555e088eaf25b1bbaad", size = 7176289, upload-time = "2026-02-10T19:17:08.274Z" }, + { url = "https://files.pythonhosted.org/packages/ff/9e/6b4397a3e3d15123de3b1806ef342522393d50736c13b20ec4c9ea6693a6/cryptography-46.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c18ff11e86df2e28854939acde2d003f7984f721eba450b56a200ad90eeb0e6b", size = 4275637, upload-time = "2026-02-10T19:17:10.53Z" }, + { url = "https://files.pythonhosted.org/packages/63/e7/471ab61099a3920b0c77852ea3f0ea611c9702f651600397ac567848b897/cryptography-46.0.5-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d7e3d356b8cd4ea5aff04f129d5f66ebdc7b6f8eae802b93739ed520c47c79b", size = 4424742, upload-time = "2026-02-10T19:17:12.388Z" }, + { url = "https://files.pythonhosted.org/packages/37/53/a18500f270342d66bf7e4d9f091114e31e5ee9e7375a5aba2e85a91e0044/cryptography-46.0.5-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:50bfb6925eff619c9c023b967d5b77a54e04256c4281b0e21336a130cd7fc263", size = 4277528, upload-time = "2026-02-10T19:17:13.853Z" }, + { url = "https://files.pythonhosted.org/packages/22/29/c2e812ebc38c57b40e7c583895e73c8c5adb4d1e4a0cc4c5a4fdab2b1acc/cryptography-46.0.5-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:803812e111e75d1aa73690d2facc295eaefd4439be1023fefc4995eaea2af90d", size = 4947993, upload-time = "2026-02-10T19:17:15.618Z" }, + { url = "https://files.pythonhosted.org/packages/6b/e7/237155ae19a9023de7e30ec64e5d99a9431a567407ac21170a046d22a5a3/cryptography-46.0.5-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ee190460e2fbe447175cda91b88b84ae8322a104fc27766ad09428754a618ed", size = 4456855, upload-time = "2026-02-10T19:17:17.221Z" }, + { url = "https://files.pythonhosted.org/packages/2d/87/fc628a7ad85b81206738abbd213b07702bcbdada1dd43f72236ef3cffbb5/cryptography-46.0.5-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:f145bba11b878005c496e93e257c1e88f154d278d2638e6450d17e0f31e558d2", size = 3984635, upload-time = "2026-02-10T19:17:18.792Z" }, + { url = "https://files.pythonhosted.org/packages/84/29/65b55622bde135aedf4565dc509d99b560ee4095e56989e815f8fd2aa910/cryptography-46.0.5-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e9251e3be159d1020c4030bd2e5f84d6a43fe54b6c19c12f51cde9542a2817b2", size = 4277038, upload-time = "2026-02-10T19:17:20.256Z" }, + { url = "https://files.pythonhosted.org/packages/bc/36/45e76c68d7311432741faf1fbf7fac8a196a0a735ca21f504c75d37e2558/cryptography-46.0.5-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:47fb8a66058b80e509c47118ef8a75d14c455e81ac369050f20ba0d23e77fee0", size = 4912181, upload-time = "2026-02-10T19:17:21.825Z" }, + { url = "https://files.pythonhosted.org/packages/6d/1a/c1ba8fead184d6e3d5afcf03d569acac5ad063f3ac9fb7258af158f7e378/cryptography-46.0.5-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:4c3341037c136030cb46e4b1e17b7418ea4cbd9dd207e4a6f3b2b24e0d4ac731", size = 4456482, upload-time = "2026-02-10T19:17:25.133Z" }, + { url = "https://files.pythonhosted.org/packages/f9/e5/3fb22e37f66827ced3b902cf895e6a6bc1d095b5b26be26bd13c441fdf19/cryptography-46.0.5-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:890bcb4abd5a2d3f852196437129eb3667d62630333aacc13dfd470fad3aaa82", size = 4405497, upload-time = "2026-02-10T19:17:26.66Z" }, + { url = "https://files.pythonhosted.org/packages/1a/df/9d58bb32b1121a8a2f27383fabae4d63080c7ca60b9b5c88be742be04ee7/cryptography-46.0.5-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:80a8d7bfdf38f87ca30a5391c0c9ce4ed2926918e017c29ddf643d0ed2778ea1", size = 4667819, upload-time = "2026-02-10T19:17:28.569Z" }, + { url = "https://files.pythonhosted.org/packages/ea/ed/325d2a490c5e94038cdb0117da9397ece1f11201f425c4e9c57fe5b9f08b/cryptography-46.0.5-cp311-abi3-win32.whl", hash = "sha256:60ee7e19e95104d4c03871d7d7dfb3d22ef8a9b9c6778c94e1c8fcc8365afd48", size = 3028230, upload-time = "2026-02-10T19:17:30.518Z" }, + { url = "https://files.pythonhosted.org/packages/e9/5a/ac0f49e48063ab4255d9e3b79f5def51697fce1a95ea1370f03dc9db76f6/cryptography-46.0.5-cp311-abi3-win_amd64.whl", hash = "sha256:38946c54b16c885c72c4f59846be9743d699eee2b69b6988e0a00a01f46a61a4", size = 3480909, upload-time = "2026-02-10T19:17:32.083Z" }, + { url = "https://files.pythonhosted.org/packages/00/13/3d278bfa7a15a96b9dc22db5a12ad1e48a9eb3d40e1827ef66a5df75d0d0/cryptography-46.0.5-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:94a76daa32eb78d61339aff7952ea819b1734b46f73646a07decb40e5b3448e2", size = 7119287, upload-time = "2026-02-10T19:17:33.801Z" }, + { url = "https://files.pythonhosted.org/packages/67/c8/581a6702e14f0898a0848105cbefd20c058099e2c2d22ef4e476dfec75d7/cryptography-46.0.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5be7bf2fb40769e05739dd0046e7b26f9d4670badc7b032d6ce4db64dddc0678", size = 4265728, upload-time = "2026-02-10T19:17:35.569Z" }, + { url = "https://files.pythonhosted.org/packages/dd/4a/ba1a65ce8fc65435e5a849558379896c957870dd64fecea97b1ad5f46a37/cryptography-46.0.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fe346b143ff9685e40192a4960938545c699054ba11d4f9029f94751e3f71d87", size = 4408287, upload-time = "2026-02-10T19:17:36.938Z" }, + { url = "https://files.pythonhosted.org/packages/f8/67/8ffdbf7b65ed1ac224d1c2df3943553766914a8ca718747ee3871da6107e/cryptography-46.0.5-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:c69fd885df7d089548a42d5ec05be26050ebcd2283d89b3d30676eb32ff87dee", size = 4270291, upload-time = "2026-02-10T19:17:38.748Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e5/f52377ee93bc2f2bba55a41a886fd208c15276ffbd2569f2ddc89d50e2c5/cryptography-46.0.5-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:8293f3dea7fc929ef7240796ba231413afa7b68ce38fd21da2995549f5961981", size = 4927539, upload-time = "2026-02-10T19:17:40.241Z" }, + { url = "https://files.pythonhosted.org/packages/3b/02/cfe39181b02419bbbbcf3abdd16c1c5c8541f03ca8bda240debc467d5a12/cryptography-46.0.5-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:1abfdb89b41c3be0365328a410baa9df3ff8a9110fb75e7b52e66803ddabc9a9", size = 4442199, upload-time = "2026-02-10T19:17:41.789Z" }, + { url = "https://files.pythonhosted.org/packages/c0/96/2fcaeb4873e536cf71421a388a6c11b5bc846e986b2b069c79363dc1648e/cryptography-46.0.5-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:d66e421495fdb797610a08f43b05269e0a5ea7f5e652a89bfd5a7d3c1dee3648", size = 3960131, upload-time = "2026-02-10T19:17:43.379Z" }, + { url = "https://files.pythonhosted.org/packages/d8/d2/b27631f401ddd644e94c5cf33c9a4069f72011821cf3dc7309546b0642a0/cryptography-46.0.5-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:4e817a8920bfbcff8940ecfd60f23d01836408242b30f1a708d93198393a80b4", size = 4270072, upload-time = "2026-02-10T19:17:45.481Z" }, + { url = "https://files.pythonhosted.org/packages/f4/a7/60d32b0370dae0b4ebe55ffa10e8599a2a59935b5ece1b9f06edb73abdeb/cryptography-46.0.5-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:68f68d13f2e1cb95163fa3b4db4bf9a159a418f5f6e7242564fc75fcae667fd0", size = 4892170, upload-time = "2026-02-10T19:17:46.997Z" }, + { url = "https://files.pythonhosted.org/packages/d2/b9/cf73ddf8ef1164330eb0b199a589103c363afa0cf794218c24d524a58eab/cryptography-46.0.5-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:a3d1fae9863299076f05cb8a778c467578262fae09f9dc0ee9b12eb4268ce663", size = 4441741, upload-time = "2026-02-10T19:17:48.661Z" }, + { url = "https://files.pythonhosted.org/packages/5f/eb/eee00b28c84c726fe8fa0158c65afe312d9c3b78d9d01daf700f1f6e37ff/cryptography-46.0.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c4143987a42a2397f2fc3b4d7e3a7d313fbe684f67ff443999e803dd75a76826", size = 4396728, upload-time = "2026-02-10T19:17:50.058Z" }, + { url = "https://files.pythonhosted.org/packages/65/f4/6bc1a9ed5aef7145045114b75b77c2a8261b4d38717bd8dea111a63c3442/cryptography-46.0.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:7d731d4b107030987fd61a7f8ab512b25b53cef8f233a97379ede116f30eb67d", size = 4652001, upload-time = "2026-02-10T19:17:51.54Z" }, + { url = "https://files.pythonhosted.org/packages/86/ef/5d00ef966ddd71ac2e6951d278884a84a40ffbd88948ef0e294b214ae9e4/cryptography-46.0.5-cp314-cp314t-win32.whl", hash = "sha256:c3bcce8521d785d510b2aad26ae2c966092b7daa8f45dd8f44734a104dc0bc1a", size = 3003637, upload-time = "2026-02-10T19:17:52.997Z" }, + { url = "https://files.pythonhosted.org/packages/b7/57/f3f4160123da6d098db78350fdfd9705057aad21de7388eacb2401dceab9/cryptography-46.0.5-cp314-cp314t-win_amd64.whl", hash = "sha256:4d8ae8659ab18c65ced284993c2265910f6c9e650189d4e3f68445ef82a810e4", size = 3469487, upload-time = "2026-02-10T19:17:54.549Z" }, + { url = "https://files.pythonhosted.org/packages/e2/fa/a66aa722105ad6a458bebd64086ca2b72cdd361fed31763d20390f6f1389/cryptography-46.0.5-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:4108d4c09fbbf2789d0c926eb4152ae1760d5a2d97612b92d508d96c861e4d31", size = 7170514, upload-time = "2026-02-10T19:17:56.267Z" }, + { url = "https://files.pythonhosted.org/packages/0f/04/c85bdeab78c8bc77b701bf0d9bdcf514c044e18a46dcff330df5448631b0/cryptography-46.0.5-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1f30a86d2757199cb2d56e48cce14deddf1f9c95f1ef1b64ee91ea43fe2e18", size = 4275349, upload-time = "2026-02-10T19:17:58.419Z" }, + { url = "https://files.pythonhosted.org/packages/5c/32/9b87132a2f91ee7f5223b091dc963055503e9b442c98fc0b8a5ca765fab0/cryptography-46.0.5-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:039917b0dc418bb9f6edce8a906572d69e74bd330b0b3fea4f79dab7f8ddd235", size = 4420667, upload-time = "2026-02-10T19:18:00.619Z" }, + { url = "https://files.pythonhosted.org/packages/a1/a6/a7cb7010bec4b7c5692ca6f024150371b295ee1c108bdc1c400e4c44562b/cryptography-46.0.5-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ba2a27ff02f48193fc4daeadf8ad2590516fa3d0adeeb34336b96f7fa64c1e3a", size = 4276980, upload-time = "2026-02-10T19:18:02.379Z" }, + { url = "https://files.pythonhosted.org/packages/8e/7c/c4f45e0eeff9b91e3f12dbd0e165fcf2a38847288fcfd889deea99fb7b6d/cryptography-46.0.5-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:61aa400dce22cb001a98014f647dc21cda08f7915ceb95df0c9eaf84b4b6af76", size = 4939143, upload-time = "2026-02-10T19:18:03.964Z" }, + { url = "https://files.pythonhosted.org/packages/37/19/e1b8f964a834eddb44fa1b9a9976f4e414cbb7aa62809b6760c8803d22d1/cryptography-46.0.5-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ce58ba46e1bc2aac4f7d9290223cead56743fa6ab94a5d53292ffaac6a91614", size = 4453674, upload-time = "2026-02-10T19:18:05.588Z" }, + { url = "https://files.pythonhosted.org/packages/db/ed/db15d3956f65264ca204625597c410d420e26530c4e2943e05a0d2f24d51/cryptography-46.0.5-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:420d0e909050490d04359e7fdb5ed7e667ca5c3c402b809ae2563d7e66a92229", size = 3978801, upload-time = "2026-02-10T19:18:07.167Z" }, + { url = "https://files.pythonhosted.org/packages/41/e2/df40a31d82df0a70a0daf69791f91dbb70e47644c58581d654879b382d11/cryptography-46.0.5-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:582f5fcd2afa31622f317f80426a027f30dc792e9c80ffee87b993200ea115f1", size = 4276755, upload-time = "2026-02-10T19:18:09.813Z" }, + { url = "https://files.pythonhosted.org/packages/33/45/726809d1176959f4a896b86907b98ff4391a8aa29c0aaaf9450a8a10630e/cryptography-46.0.5-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:bfd56bb4b37ed4f330b82402f6f435845a5f5648edf1ad497da51a8452d5d62d", size = 4901539, upload-time = "2026-02-10T19:18:11.263Z" }, + { url = "https://files.pythonhosted.org/packages/99/0f/a3076874e9c88ecb2ecc31382f6e7c21b428ede6f55aafa1aa272613e3cd/cryptography-46.0.5-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:a3d507bb6a513ca96ba84443226af944b0f7f47dcc9a399d110cd6146481d24c", size = 4452794, upload-time = "2026-02-10T19:18:12.914Z" }, + { url = "https://files.pythonhosted.org/packages/02/ef/ffeb542d3683d24194a38f66ca17c0a4b8bf10631feef44a7ef64e631b1a/cryptography-46.0.5-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9f16fbdf4da055efb21c22d81b89f155f02ba420558db21288b3d0035bafd5f4", size = 4404160, upload-time = "2026-02-10T19:18:14.375Z" }, + { url = "https://files.pythonhosted.org/packages/96/93/682d2b43c1d5f1406ed048f377c0fc9fc8f7b0447a478d5c65ab3d3a66eb/cryptography-46.0.5-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ced80795227d70549a411a4ab66e8ce307899fad2220ce5ab2f296e687eacde9", size = 4667123, upload-time = "2026-02-10T19:18:15.886Z" }, + { url = "https://files.pythonhosted.org/packages/45/2d/9c5f2926cb5300a8eefc3f4f0b3f3df39db7f7ce40c8365444c49363cbda/cryptography-46.0.5-cp38-abi3-win32.whl", hash = "sha256:02f547fce831f5096c9a567fd41bc12ca8f11df260959ecc7c3202555cc47a72", size = 3010220, upload-time = "2026-02-10T19:18:17.361Z" }, + { url = "https://files.pythonhosted.org/packages/48/ef/0c2f4a8e31018a986949d34a01115dd057bf536905dca38897bacd21fac3/cryptography-46.0.5-cp38-abi3-win_amd64.whl", hash = "sha256:556e106ee01aa13484ce9b0239bca667be5004efb0aabbed28d353df86445595", size = 3467050, upload-time = "2026-02-10T19:18:18.899Z" }, + { url = "https://files.pythonhosted.org/packages/eb/dd/2d9fdb07cebdf3d51179730afb7d5e576153c6744c3ff8fded23030c204e/cryptography-46.0.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:3b4995dc971c9fb83c25aa44cf45f02ba86f71ee600d81091c2f0cbae116b06c", size = 3476964, upload-time = "2026-02-10T19:18:20.687Z" }, + { url = "https://files.pythonhosted.org/packages/e9/6f/6cc6cc9955caa6eaf83660b0da2b077c7fe8ff9950a3c5e45d605038d439/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bc84e875994c3b445871ea7181d424588171efec3e185dced958dad9e001950a", size = 4218321, upload-time = "2026-02-10T19:18:22.349Z" }, + { url = "https://files.pythonhosted.org/packages/3e/5d/c4da701939eeee699566a6c1367427ab91a8b7088cc2328c09dbee940415/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:2ae6971afd6246710480e3f15824ed3029a60fc16991db250034efd0b9fb4356", size = 4381786, upload-time = "2026-02-10T19:18:24.529Z" }, + { url = "https://files.pythonhosted.org/packages/ac/97/a538654732974a94ff96c1db621fa464f455c02d4bb7d2652f4edc21d600/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d861ee9e76ace6cf36a6a89b959ec08e7bc2493ee39d07ffe5acb23ef46d27da", size = 4217990, upload-time = "2026-02-10T19:18:25.957Z" }, + { url = "https://files.pythonhosted.org/packages/ae/11/7e500d2dd3ba891197b9efd2da5454b74336d64a7cc419aa7327ab74e5f6/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:2b7a67c9cd56372f3249b39699f2ad479f6991e62ea15800973b956f4b73e257", size = 4381252, upload-time = "2026-02-10T19:18:27.496Z" }, + { url = "https://files.pythonhosted.org/packages/bc/58/6b3d24e6b9bc474a2dcdee65dfd1f008867015408a271562e4b690561a4d/cryptography-46.0.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8456928655f856c6e1533ff59d5be76578a7157224dbd9ce6872f25055ab9ab7", size = 3407605, upload-time = "2026-02-10T19:18:29.233Z" }, ] [[package]] @@ -2274,7 +2283,7 @@ wheels = [ [[package]] name = "nltk" -version = "3.9.2" +version = "3.9.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -2282,9 +2291,9 @@ dependencies = [ { name = "regex" }, { name = "tqdm" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f9/76/3a5e4312c19a028770f86fd7c058cf9f4ec4321c6cf7526bab998a5b683c/nltk-3.9.2.tar.gz", hash = "sha256:0f409e9b069ca4177c1903c3e843eef90c7e92992fa4931ae607da6de49e1419", size = 2887629, upload-time = "2025-10-01T07:19:23.764Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/8f/915e1c12df07c70ed779d18ab83d065718a926e70d3ea33eb0cd66ffb7c0/nltk-3.9.3.tar.gz", hash = "sha256:cb5945d6424a98d694c2b9a0264519fab4363711065a46aa0ae7a2195b92e71f", size = 2923673, upload-time = "2026-02-24T12:05:53.833Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/60/90/81ac364ef94209c100e12579629dc92bf7a709a84af32f8c551b02c07e94/nltk-3.9.2-py3-none-any.whl", hash = "sha256:1e209d2b3009110635ed9709a67a1a3e33a10f799490fa71cf4bec218c11c88a", size = 1513404, upload-time = "2025-10-01T07:19:21.648Z" }, + { url = "https://files.pythonhosted.org/packages/c2/7e/9af5a710a1236e4772de8dfcc6af942a561327bb9f42b5b4a24d0cf100fd/nltk-3.9.3-py3-none-any.whl", hash = "sha256:60b3db6e9995b3dd976b1f0fa7dec22069b2677e759c28eb69b62ddd44870522", size = 1525385, upload-time = "2026-02-24T12:05:46.54Z" }, ] [[package]] @@ -3036,16 +3045,16 @@ wheels = [ [[package]] name = "protobuf" -version = "5.29.5" +version = "5.29.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/29/d09e70352e4e88c9c7a198d5645d7277811448d76c23b00345670f7c8a38/protobuf-5.29.5.tar.gz", hash = "sha256:bc1463bafd4b0929216c35f437a8e28731a2b7fe3d98bb77a600efced5a15c84", size = 425226, upload-time = "2025-05-28T23:51:59.82Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/57/394a763c103e0edf87f0938dafcd918d53b4c011dfc5c8ae80f3b0452dbb/protobuf-5.29.6.tar.gz", hash = "sha256:da9ee6a5424b6b30fd5e45c5ea663aef540ca95f9ad99d1e887e819cdf9b8723", size = 425623, upload-time = "2026-02-04T22:54:40.584Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/11/6e40e9fc5bba02988a214c07cf324595789ca7820160bfd1f8be96e48539/protobuf-5.29.5-cp310-abi3-win32.whl", hash = "sha256:3f1c6468a2cfd102ff4703976138844f78ebd1fb45f49011afc5139e9e283079", size = 422963, upload-time = "2025-05-28T23:51:41.204Z" }, - { url = "https://files.pythonhosted.org/packages/81/7f/73cefb093e1a2a7c3ffd839e6f9fcafb7a427d300c7f8aef9c64405d8ac6/protobuf-5.29.5-cp310-abi3-win_amd64.whl", hash = "sha256:3f76e3a3675b4a4d867b52e4a5f5b78a2ef9565549d4037e06cf7b0942b1d3fc", size = 434818, upload-time = "2025-05-28T23:51:44.297Z" }, - { url = "https://files.pythonhosted.org/packages/dd/73/10e1661c21f139f2c6ad9b23040ff36fee624310dc28fba20d33fdae124c/protobuf-5.29.5-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e38c5add5a311f2a6eb0340716ef9b039c1dfa428b28f25a7838ac329204a671", size = 418091, upload-time = "2025-05-28T23:51:45.907Z" }, - { url = "https://files.pythonhosted.org/packages/6c/04/98f6f8cf5b07ab1294c13f34b4e69b3722bb609c5b701d6c169828f9f8aa/protobuf-5.29.5-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:fa18533a299d7ab6c55a238bf8629311439995f2e7eca5caaff08663606e9015", size = 319824, upload-time = "2025-05-28T23:51:47.545Z" }, - { url = "https://files.pythonhosted.org/packages/85/e4/07c80521879c2d15f321465ac24c70efe2381378c00bf5e56a0f4fbac8cd/protobuf-5.29.5-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:63848923da3325e1bf7e9003d680ce6e14b07e55d0473253a690c3a8b8fd6e61", size = 319942, upload-time = "2025-05-28T23:51:49.11Z" }, - { url = "https://files.pythonhosted.org/packages/7e/cc/7e77861000a0691aeea8f4566e5d3aa716f2b1dece4a24439437e41d3d25/protobuf-5.29.5-py3-none-any.whl", hash = "sha256:6cf42630262c59b2d8de33954443d94b746c952b01434fc58a417fdbd2e84bd5", size = 172823, upload-time = "2025-05-28T23:51:58.157Z" }, + { url = "https://files.pythonhosted.org/packages/d4/88/9ee58ff7863c479d6f8346686d4636dd4c415b0cbeed7a6a7d0617639c2a/protobuf-5.29.6-cp310-abi3-win32.whl", hash = "sha256:62e8a3114992c7c647bce37dcc93647575fc52d50e48de30c6fcb28a6a291eb1", size = 423357, upload-time = "2026-02-04T22:54:25.805Z" }, + { url = "https://files.pythonhosted.org/packages/1c/66/2dc736a4d576847134fb6d80bd995c569b13cdc7b815d669050bf0ce2d2c/protobuf-5.29.6-cp310-abi3-win_amd64.whl", hash = "sha256:7e6ad413275be172f67fdee0f43484b6de5a904cc1c3ea9804cb6fe2ff366eda", size = 435175, upload-time = "2026-02-04T22:54:28.592Z" }, + { url = "https://files.pythonhosted.org/packages/06/db/49b05966fd208ae3f44dcd33837b6243b4915c57561d730a43f881f24dea/protobuf-5.29.6-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:b5a169e664b4057183a34bdc424540e86eea47560f3c123a0d64de4e137f9269", size = 418619, upload-time = "2026-02-04T22:54:30.266Z" }, + { url = "https://files.pythonhosted.org/packages/b7/d7/48cbf6b0c3c39761e47a99cb483405f0fde2be22cf00d71ef316ce52b458/protobuf-5.29.6-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:a8866b2cff111f0f863c1b3b9e7572dc7eaea23a7fae27f6fc613304046483e6", size = 320284, upload-time = "2026-02-04T22:54:31.782Z" }, + { url = "https://files.pythonhosted.org/packages/e3/dd/cadd6ec43069247d91f6345fa7a0d2858bef6af366dbd7ba8f05d2c77d3b/protobuf-5.29.6-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:e3387f44798ac1106af0233c04fb8abf543772ff241169946f698b3a9a3d3ab9", size = 320478, upload-time = "2026-02-04T22:54:32.909Z" }, + { url = "https://files.pythonhosted.org/packages/5a/cb/e3065b447186cb70aa65acc70c86baf482d82bf75625bf5a2c4f6919c6a3/protobuf-5.29.6-py3-none-any.whl", hash = "sha256:6b9edb641441b2da9fa8f428760fc136a49cf97a52076010cf22a2ff73438a86", size = 173126, upload-time = "2026-02-04T22:54:39.462Z" }, ] [[package]] @@ -3085,11 +3094,11 @@ wheels = [ [[package]] name = "pyasn1" -version = "0.6.1" +version = "0.6.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ba/e9/01f1a64245b89f039897cb0130016d79f77d52669aae6ee7b159a6c4c018/pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034", size = 145322, upload-time = "2024-09-10T22:41:42.55Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/b6/6e630dff89739fcd427e3f72b3d905ce0acb85a45d4ec3e2678718a3487f/pyasn1-0.6.2.tar.gz", hash = "sha256:9b59a2b25ba7e4f8197db7686c09fb33e658b98339fadb826e9512629017833b", size = 146586, upload-time = "2026-01-16T18:04:18.534Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629", size = 83135, upload-time = "2024-09-11T16:00:36.122Z" }, + { url = "https://files.pythonhosted.org/packages/44/b5/a96872e5184f354da9c84ae119971a0a4c221fe9b27a4d94bd43f2596727/pyasn1-0.6.2-py3-none-any.whl", hash = "sha256:1eb26d860996a18e9b6ed05e7aae0e9fc21619fcee6af91cca9bad4fbea224bf", size = 83371, upload-time = "2026-01-16T18:04:17.174Z" }, ] [[package]] @@ -3399,11 +3408,11 @@ wheels = [ [[package]] name = "python-multipart" -version = "0.0.20" +version = "0.0.22" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/87/f44d7c9f274c7ee665a29b885ec97089ec5dc034c7f3fafa03da9e39a09e/python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13", size = 37158, upload-time = "2024-12-16T19:45:46.972Z" } +sdist = { url = "https://files.pythonhosted.org/packages/94/01/979e98d542a70714b0cb2b6728ed0b7c46792b695e3eaec3e20711271ca3/python_multipart-0.0.22.tar.gz", hash = "sha256:7340bef99a7e0032613f56dc36027b959fd3b30a787ed62d310e951f7c3a3a58", size = 37612, upload-time = "2026-01-25T10:15:56.219Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546, upload-time = "2024-12-16T19:45:44.423Z" }, + { url = "https://files.pythonhosted.org/packages/1b/d0/397f9626e711ff749a95d96b7af99b9c566a9bb5129b8e4c10fc4d100304/python_multipart-0.0.22-py3-none-any.whl", hash = "sha256:2b2cd894c83d21bf49d702499531c7bafd057d730c201782048f7945d82de155", size = 24579, upload-time = "2026-01-25T10:15:54.811Z" }, ] [[package]] @@ -4165,11 +4174,11 @@ wheels = [ [[package]] name = "urllib3" -version = "2.5.0" +version = "2.6.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, + { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, ] [[package]] diff --git a/src/frontend/package-lock.json b/src/frontend/package-lock.json index cec7e9621..ab014b2d5 100644 --- a/src/frontend/package-lock.json +++ b/src/frontend/package-lock.json @@ -19,7 +19,7 @@ "@types/node": "^16.18.126", "@types/react": "^18.3.23", "@types/react-dom": "^18.3.7", - "axios": "^1.11.0", + "axios": "^1.13.5", "react": "^18.3.1", "react-dom": "^18.3.1", "react-markdown": "^10.1.0", @@ -3991,13 +3991,13 @@ } }, "node_modules/axios": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", - "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", + "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", "proxy-from-env": "^1.1.0" } }, @@ -5367,9 +5367,9 @@ } }, "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", diff --git a/src/frontend/package.json b/src/frontend/package.json index fd512e0b0..58c047424 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -15,7 +15,7 @@ "@types/node": "^16.18.126", "@types/react": "^18.3.23", "@types/react-dom": "^18.3.7", - "axios": "^1.11.0", + "axios": "^1.13.5", "react": "^18.3.1", "react-dom": "^18.3.1", "react-markdown": "^10.1.0", @@ -68,4 +68,4 @@ "vite": "^7.1.2", "vitest": "^3.2.4" } -} \ No newline at end of file +} diff --git a/src/mcp_server/pyproject.toml b/src/mcp_server/pyproject.toml index 871469e68..f04ef6db1 100644 --- a/src/mcp_server/pyproject.toml +++ b/src/mcp_server/pyproject.toml @@ -21,10 +21,12 @@ dependencies = [ "azure-identity==1.19.0", "pydantic==2.11.7", "pydantic-settings==2.6.1", - "python-multipart==0.0.18", + "python-multipart==0.0.22", "httpx==0.28.1", "werkzeug==3.1.5", "urllib3==2.6.3", + "azure-core==1.38.0", + "cryptography==46.0.5", ] [project.optional-dependencies] diff --git a/src/mcp_server/uv.lock b/src/mcp_server/uv.lock index c46b7d687..9ee3540d0 100644 --- a/src/mcp_server/uv.lock +++ b/src/mcp_server/uv.lock @@ -66,15 +66,15 @@ wheels = [ [[package]] name = "azure-core" -version = "1.37.0" +version = "1.38.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "requests" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ef/83/41c9371c8298999c67b007e308a0a3c4d6a59c6908fa9c62101f031f886f/azure_core-1.37.0.tar.gz", hash = "sha256:7064f2c11e4b97f340e8e8c6d923b822978be3016e46b7bc4aa4b337cfb48aee", size = 357620, upload-time = "2025-12-11T20:05:13.518Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/1b/e503e08e755ea94e7d3419c9242315f888fc664211c90d032e40479022bf/azure_core-1.38.0.tar.gz", hash = "sha256:8194d2682245a3e4e3151a667c686464c3786fed7918b394d035bdcd61bb5993", size = 363033, upload-time = "2026-01-12T17:03:05.535Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ee/34/a9914e676971a13d6cc671b1ed172f9804b50a3a80a143ff196e52f4c7ee/azure_core-1.37.0-py3-none-any.whl", hash = "sha256:b3abe2c59e7d6bb18b38c275a5029ff80f98990e7c90a5e646249a56630fcc19", size = 214006, upload-time = "2025-12-11T20:05:14.96Z" }, + { url = "https://files.pythonhosted.org/packages/fc/d8/b8fcba9464f02b121f39de2db2bf57f0b216fe11d014513d666e8634380d/azure_core-1.38.0-py3-none-any.whl", hash = "sha256:ab0c9b2cd71fecb1842d52c965c95285d3cfb38902f6766e4a471f1cd8905335", size = 217825, upload-time = "2026-01-12T17:03:07.291Z" }, ] [[package]] @@ -345,67 +345,62 @@ wheels = [ [[package]] name = "cryptography" -version = "46.0.3" +version = "46.0.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9f/33/c00162f49c0e2fe8064a62cb92b93e50c74a72bc370ab92f86112b33ff62/cryptography-46.0.3.tar.gz", hash = "sha256:a8b17438104fed022ce745b362294d9ce35b4c2e45c1d958ad4a4b019285f4a1", size = 749258, upload-time = "2025-10-15T23:18:31.74Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/42/9c391dd801d6cf0d561b5890549d4b27bafcc53b39c31a817e69d87c625b/cryptography-46.0.3-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:109d4ddfadf17e8e7779c39f9b18111a09efb969a301a31e987416a0191ed93a", size = 7225004, upload-time = "2025-10-15T23:16:52.239Z" }, - { url = "https://files.pythonhosted.org/packages/1c/67/38769ca6b65f07461eb200e85fc1639b438bdc667be02cf7f2cd6a64601c/cryptography-46.0.3-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:09859af8466b69bc3c27bdf4f5d84a665e0f7ab5088412e9e2ec49758eca5cbc", size = 4296667, upload-time = "2025-10-15T23:16:54.369Z" }, - { url = "https://files.pythonhosted.org/packages/5c/49/498c86566a1d80e978b42f0d702795f69887005548c041636df6ae1ca64c/cryptography-46.0.3-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:01ca9ff2885f3acc98c29f1860552e37f6d7c7d013d7334ff2a9de43a449315d", size = 4450807, upload-time = "2025-10-15T23:16:56.414Z" }, - { url = "https://files.pythonhosted.org/packages/4b/0a/863a3604112174c8624a2ac3c038662d9e59970c7f926acdcfaed8d61142/cryptography-46.0.3-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6eae65d4c3d33da080cff9c4ab1f711b15c1d9760809dad6ea763f3812d254cb", size = 4299615, upload-time = "2025-10-15T23:16:58.442Z" }, - { url = "https://files.pythonhosted.org/packages/64/02/b73a533f6b64a69f3cd3872acb6ebc12aef924d8d103133bb3ea750dc703/cryptography-46.0.3-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5bf0ed4490068a2e72ac03d786693adeb909981cc596425d09032d372bcc849", size = 4016800, upload-time = "2025-10-15T23:17:00.378Z" }, - { url = "https://files.pythonhosted.org/packages/25/d5/16e41afbfa450cde85a3b7ec599bebefaef16b5c6ba4ec49a3532336ed72/cryptography-46.0.3-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5ecfccd2329e37e9b7112a888e76d9feca2347f12f37918facbb893d7bb88ee8", size = 4984707, upload-time = "2025-10-15T23:17:01.98Z" }, - { url = "https://files.pythonhosted.org/packages/c9/56/e7e69b427c3878352c2fb9b450bd0e19ed552753491d39d7d0a2f5226d41/cryptography-46.0.3-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a2c0cd47381a3229c403062f764160d57d4d175e022c1df84e168c6251a22eec", size = 4482541, upload-time = "2025-10-15T23:17:04.078Z" }, - { url = "https://files.pythonhosted.org/packages/78/f6/50736d40d97e8483172f1bb6e698895b92a223dba513b0ca6f06b2365339/cryptography-46.0.3-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:549e234ff32571b1f4076ac269fcce7a808d3bf98b76c8dd560e42dbc66d7d91", size = 4299464, upload-time = "2025-10-15T23:17:05.483Z" }, - { url = "https://files.pythonhosted.org/packages/00/de/d8e26b1a855f19d9994a19c702fa2e93b0456beccbcfe437eda00e0701f2/cryptography-46.0.3-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:c0a7bb1a68a5d3471880e264621346c48665b3bf1c3759d682fc0864c540bd9e", size = 4950838, upload-time = "2025-10-15T23:17:07.425Z" }, - { url = "https://files.pythonhosted.org/packages/8f/29/798fc4ec461a1c9e9f735f2fc58741b0daae30688f41b2497dcbc9ed1355/cryptography-46.0.3-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:10b01676fc208c3e6feeb25a8b83d81767e8059e1fe86e1dc62d10a3018fa926", size = 4481596, upload-time = "2025-10-15T23:17:09.343Z" }, - { url = "https://files.pythonhosted.org/packages/15/8d/03cd48b20a573adfff7652b76271078e3045b9f49387920e7f1f631d125e/cryptography-46.0.3-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0abf1ffd6e57c67e92af68330d05760b7b7efb243aab8377e583284dbab72c71", size = 4426782, upload-time = "2025-10-15T23:17:11.22Z" }, - { url = "https://files.pythonhosted.org/packages/fa/b1/ebacbfe53317d55cf33165bda24c86523497a6881f339f9aae5c2e13e57b/cryptography-46.0.3-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a04bee9ab6a4da801eb9b51f1b708a1b5b5c9eb48c03f74198464c66f0d344ac", size = 4698381, upload-time = "2025-10-15T23:17:12.829Z" }, - { url = "https://files.pythonhosted.org/packages/96/92/8a6a9525893325fc057a01f654d7efc2c64b9de90413adcf605a85744ff4/cryptography-46.0.3-cp311-abi3-win32.whl", hash = "sha256:f260d0d41e9b4da1ed1e0f1ce571f97fe370b152ab18778e9e8f67d6af432018", size = 3055988, upload-time = "2025-10-15T23:17:14.65Z" }, - { url = "https://files.pythonhosted.org/packages/7e/bf/80fbf45253ea585a1e492a6a17efcb93467701fa79e71550a430c5e60df0/cryptography-46.0.3-cp311-abi3-win_amd64.whl", hash = "sha256:a9a3008438615669153eb86b26b61e09993921ebdd75385ddd748702c5adfddb", size = 3514451, upload-time = "2025-10-15T23:17:16.142Z" }, - { url = "https://files.pythonhosted.org/packages/2e/af/9b302da4c87b0beb9db4e756386a7c6c5b8003cd0e742277888d352ae91d/cryptography-46.0.3-cp311-abi3-win_arm64.whl", hash = "sha256:5d7f93296ee28f68447397bf5198428c9aeeab45705a55d53a6343455dcb2c3c", size = 2928007, upload-time = "2025-10-15T23:17:18.04Z" }, - { url = "https://files.pythonhosted.org/packages/f5/e2/a510aa736755bffa9d2f75029c229111a1d02f8ecd5de03078f4c18d91a3/cryptography-46.0.3-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:00a5e7e87938e5ff9ff5447ab086a5706a957137e6e433841e9d24f38a065217", size = 7158012, upload-time = "2025-10-15T23:17:19.982Z" }, - { url = "https://files.pythonhosted.org/packages/73/dc/9aa866fbdbb95b02e7f9d086f1fccfeebf8953509b87e3f28fff927ff8a0/cryptography-46.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c8daeb2d2174beb4575b77482320303f3d39b8e81153da4f0fb08eb5fe86a6c5", size = 4288728, upload-time = "2025-10-15T23:17:21.527Z" }, - { url = "https://files.pythonhosted.org/packages/c5/fd/bc1daf8230eaa075184cbbf5f8cd00ba9db4fd32d63fb83da4671b72ed8a/cryptography-46.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:39b6755623145ad5eff1dab323f4eae2a32a77a7abef2c5089a04a3d04366715", size = 4435078, upload-time = "2025-10-15T23:17:23.042Z" }, - { url = "https://files.pythonhosted.org/packages/82/98/d3bd5407ce4c60017f8ff9e63ffee4200ab3e23fe05b765cab805a7db008/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:db391fa7c66df6762ee3f00c95a89e6d428f4d60e7abc8328f4fe155b5ac6e54", size = 4293460, upload-time = "2025-10-15T23:17:24.885Z" }, - { url = "https://files.pythonhosted.org/packages/26/e9/e23e7900983c2b8af7a08098db406cf989d7f09caea7897e347598d4cd5b/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:78a97cf6a8839a48c49271cdcbd5cf37ca2c1d6b7fdd86cc864f302b5e9bf459", size = 3995237, upload-time = "2025-10-15T23:17:26.449Z" }, - { url = "https://files.pythonhosted.org/packages/91/15/af68c509d4a138cfe299d0d7ddb14afba15233223ebd933b4bbdbc7155d3/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:dfb781ff7eaa91a6f7fd41776ec37c5853c795d3b358d4896fdbb5df168af422", size = 4967344, upload-time = "2025-10-15T23:17:28.06Z" }, - { url = "https://files.pythonhosted.org/packages/ca/e3/8643d077c53868b681af077edf6b3cb58288b5423610f21c62aadcbe99f4/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:6f61efb26e76c45c4a227835ddeae96d83624fb0d29eb5df5b96e14ed1a0afb7", size = 4466564, upload-time = "2025-10-15T23:17:29.665Z" }, - { url = "https://files.pythonhosted.org/packages/0e/43/c1e8726fa59c236ff477ff2b5dc071e54b21e5a1e51aa2cee1676f1c986f/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:23b1a8f26e43f47ceb6d6a43115f33a5a37d57df4ea0ca295b780ae8546e8044", size = 4292415, upload-time = "2025-10-15T23:17:31.686Z" }, - { url = "https://files.pythonhosted.org/packages/42/f9/2f8fefdb1aee8a8e3256a0568cffc4e6d517b256a2fe97a029b3f1b9fe7e/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:b419ae593c86b87014b9be7396b385491ad7f320bde96826d0dd174459e54665", size = 4931457, upload-time = "2025-10-15T23:17:33.478Z" }, - { url = "https://files.pythonhosted.org/packages/79/30/9b54127a9a778ccd6d27c3da7563e9f2d341826075ceab89ae3b41bf5be2/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:50fc3343ac490c6b08c0cf0d704e881d0d660be923fd3076db3e932007e726e3", size = 4466074, upload-time = "2025-10-15T23:17:35.158Z" }, - { url = "https://files.pythonhosted.org/packages/ac/68/b4f4a10928e26c941b1b6a179143af9f4d27d88fe84a6a3c53592d2e76bf/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:22d7e97932f511d6b0b04f2bfd818d73dcd5928db509460aaf48384778eb6d20", size = 4420569, upload-time = "2025-10-15T23:17:37.188Z" }, - { url = "https://files.pythonhosted.org/packages/a3/49/3746dab4c0d1979888f125226357d3262a6dd40e114ac29e3d2abdf1ec55/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d55f3dffadd674514ad19451161118fd010988540cee43d8bc20675e775925de", size = 4681941, upload-time = "2025-10-15T23:17:39.236Z" }, - { url = "https://files.pythonhosted.org/packages/fd/30/27654c1dbaf7e4a3531fa1fc77986d04aefa4d6d78259a62c9dc13d7ad36/cryptography-46.0.3-cp314-cp314t-win32.whl", hash = "sha256:8a6e050cb6164d3f830453754094c086ff2d0b2f3a897a1d9820f6139a1f0914", size = 3022339, upload-time = "2025-10-15T23:17:40.888Z" }, - { url = "https://files.pythonhosted.org/packages/f6/30/640f34ccd4d2a1bc88367b54b926b781b5a018d65f404d409aba76a84b1c/cryptography-46.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:760f83faa07f8b64e9c33fc963d790a2edb24efb479e3520c14a45741cd9b2db", size = 3494315, upload-time = "2025-10-15T23:17:42.769Z" }, - { url = "https://files.pythonhosted.org/packages/ba/8b/88cc7e3bd0a8e7b861f26981f7b820e1f46aa9d26cc482d0feba0ecb4919/cryptography-46.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:516ea134e703e9fe26bcd1277a4b59ad30586ea90c365a87781d7887a646fe21", size = 2919331, upload-time = "2025-10-15T23:17:44.468Z" }, - { url = "https://files.pythonhosted.org/packages/fd/23/45fe7f376a7df8daf6da3556603b36f53475a99ce4faacb6ba2cf3d82021/cryptography-46.0.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:cb3d760a6117f621261d662bccc8ef5bc32ca673e037c83fbe565324f5c46936", size = 7218248, upload-time = "2025-10-15T23:17:46.294Z" }, - { url = "https://files.pythonhosted.org/packages/27/32/b68d27471372737054cbd34c84981f9edbc24fe67ca225d389799614e27f/cryptography-46.0.3-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4b7387121ac7d15e550f5cb4a43aef2559ed759c35df7336c402bb8275ac9683", size = 4294089, upload-time = "2025-10-15T23:17:48.269Z" }, - { url = "https://files.pythonhosted.org/packages/26/42/fa8389d4478368743e24e61eea78846a0006caffaf72ea24a15159215a14/cryptography-46.0.3-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:15ab9b093e8f09daab0f2159bb7e47532596075139dd74365da52ecc9cb46c5d", size = 4440029, upload-time = "2025-10-15T23:17:49.837Z" }, - { url = "https://files.pythonhosted.org/packages/5f/eb/f483db0ec5ac040824f269e93dd2bd8a21ecd1027e77ad7bdf6914f2fd80/cryptography-46.0.3-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:46acf53b40ea38f9c6c229599a4a13f0d46a6c3fa9ef19fc1a124d62e338dfa0", size = 4297222, upload-time = "2025-10-15T23:17:51.357Z" }, - { url = "https://files.pythonhosted.org/packages/fd/cf/da9502c4e1912cb1da3807ea3618a6829bee8207456fbbeebc361ec38ba3/cryptography-46.0.3-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:10ca84c4668d066a9878890047f03546f3ae0a6b8b39b697457b7757aaf18dbc", size = 4012280, upload-time = "2025-10-15T23:17:52.964Z" }, - { url = "https://files.pythonhosted.org/packages/6b/8f/9adb86b93330e0df8b3dcf03eae67c33ba89958fc2e03862ef1ac2b42465/cryptography-46.0.3-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:36e627112085bb3b81b19fed209c05ce2a52ee8b15d161b7c643a7d5a88491f3", size = 4978958, upload-time = "2025-10-15T23:17:54.965Z" }, - { url = "https://files.pythonhosted.org/packages/d1/a0/5fa77988289c34bdb9f913f5606ecc9ada1adb5ae870bd0d1054a7021cc4/cryptography-46.0.3-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1000713389b75c449a6e979ffc7dcc8ac90b437048766cef052d4d30b8220971", size = 4473714, upload-time = "2025-10-15T23:17:56.754Z" }, - { url = "https://files.pythonhosted.org/packages/14/e5/fc82d72a58d41c393697aa18c9abe5ae1214ff6f2a5c18ac470f92777895/cryptography-46.0.3-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:b02cf04496f6576afffef5ddd04a0cb7d49cf6be16a9059d793a30b035f6b6ac", size = 4296970, upload-time = "2025-10-15T23:17:58.588Z" }, - { url = "https://files.pythonhosted.org/packages/78/06/5663ed35438d0b09056973994f1aec467492b33bd31da36e468b01ec1097/cryptography-46.0.3-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:71e842ec9bc7abf543b47cf86b9a743baa95f4677d22baa4c7d5c69e49e9bc04", size = 4940236, upload-time = "2025-10-15T23:18:00.897Z" }, - { url = "https://files.pythonhosted.org/packages/fc/59/873633f3f2dcd8a053b8dd1d38f783043b5fce589c0f6988bf55ef57e43e/cryptography-46.0.3-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:402b58fc32614f00980b66d6e56a5b4118e6cb362ae8f3fda141ba4689bd4506", size = 4472642, upload-time = "2025-10-15T23:18:02.749Z" }, - { url = "https://files.pythonhosted.org/packages/3d/39/8e71f3930e40f6877737d6f69248cf74d4e34b886a3967d32f919cc50d3b/cryptography-46.0.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ef639cb3372f69ec44915fafcd6698b6cc78fbe0c2ea41be867f6ed612811963", size = 4423126, upload-time = "2025-10-15T23:18:04.85Z" }, - { url = "https://files.pythonhosted.org/packages/cd/c7/f65027c2810e14c3e7268353b1681932b87e5a48e65505d8cc17c99e36ae/cryptography-46.0.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b51b8ca4f1c6453d8829e1eb7299499ca7f313900dd4d89a24b8b87c0a780d4", size = 4686573, upload-time = "2025-10-15T23:18:06.908Z" }, - { url = "https://files.pythonhosted.org/packages/0a/6e/1c8331ddf91ca4730ab3086a0f1be19c65510a33b5a441cb334e7a2d2560/cryptography-46.0.3-cp38-abi3-win32.whl", hash = "sha256:6276eb85ef938dc035d59b87c8a7dc559a232f954962520137529d77b18ff1df", size = 3036695, upload-time = "2025-10-15T23:18:08.672Z" }, - { url = "https://files.pythonhosted.org/packages/90/45/b0d691df20633eff80955a0fc7695ff9051ffce8b69741444bd9ed7bd0db/cryptography-46.0.3-cp38-abi3-win_amd64.whl", hash = "sha256:416260257577718c05135c55958b674000baef9a1c7d9e8f306ec60d71db850f", size = 3501720, upload-time = "2025-10-15T23:18:10.632Z" }, - { url = "https://files.pythonhosted.org/packages/e8/cb/2da4cc83f5edb9c3257d09e1e7ab7b23f049c7962cae8d842bbef0a9cec9/cryptography-46.0.3-cp38-abi3-win_arm64.whl", hash = "sha256:d89c3468de4cdc4f08a57e214384d0471911a3830fcdaf7a8cc587e42a866372", size = 2918740, upload-time = "2025-10-15T23:18:12.277Z" }, - { url = "https://files.pythonhosted.org/packages/d9/cd/1a8633802d766a0fa46f382a77e096d7e209e0817892929655fe0586ae32/cryptography-46.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a23582810fedb8c0bc47524558fb6c56aac3fc252cb306072fd2815da2a47c32", size = 3689163, upload-time = "2025-10-15T23:18:13.821Z" }, - { url = "https://files.pythonhosted.org/packages/4c/59/6b26512964ace6480c3e54681a9859c974172fb141c38df11eadd8416947/cryptography-46.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e7aec276d68421f9574040c26e2a7c3771060bc0cff408bae1dcb19d3ab1e63c", size = 3429474, upload-time = "2025-10-15T23:18:15.477Z" }, - { url = "https://files.pythonhosted.org/packages/06/8a/e60e46adab4362a682cf142c7dcb5bf79b782ab2199b0dcb81f55970807f/cryptography-46.0.3-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7ce938a99998ed3c8aa7e7272dca1a610401ede816d36d0693907d863b10d9ea", size = 3698132, upload-time = "2025-10-15T23:18:17.056Z" }, - { url = "https://files.pythonhosted.org/packages/da/38/f59940ec4ee91e93d3311f7532671a5cef5570eb04a144bf203b58552d11/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:191bb60a7be5e6f54e30ba16fdfae78ad3a342a0599eb4193ba88e3f3d6e185b", size = 4243992, upload-time = "2025-10-15T23:18:18.695Z" }, - { url = "https://files.pythonhosted.org/packages/b0/0c/35b3d92ddebfdfda76bb485738306545817253d0a3ded0bfe80ef8e67aa5/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c70cc23f12726be8f8bc72e41d5065d77e4515efae3690326764ea1b07845cfb", size = 4409944, upload-time = "2025-10-15T23:18:20.597Z" }, - { url = "https://files.pythonhosted.org/packages/99/55/181022996c4063fc0e7666a47049a1ca705abb9c8a13830f074edb347495/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:9394673a9f4de09e28b5356e7fff97d778f8abad85c9d5ac4a4b7e25a0de7717", size = 4242957, upload-time = "2025-10-15T23:18:22.18Z" }, - { url = "https://files.pythonhosted.org/packages/ba/af/72cd6ef29f9c5f731251acadaeb821559fe25f10852f44a63374c9ca08c1/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:94cd0549accc38d1494e1f8de71eca837d0509d0d44bf11d158524b0e12cebf9", size = 4409447, upload-time = "2025-10-15T23:18:24.209Z" }, - { url = "https://files.pythonhosted.org/packages/0d/c3/e90f4a4feae6410f914f8ebac129b9ae7a8c92eb60a638012dde42030a9d/cryptography-46.0.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6b5063083824e5509fdba180721d55909ffacccc8adbec85268b48439423d78c", size = 3438528, upload-time = "2025-10-15T23:18:26.227Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/60/04/ee2a9e8542e4fa2773b81771ff8349ff19cdd56b7258a0cc442639052edb/cryptography-46.0.5.tar.gz", hash = "sha256:abace499247268e3757271b2f1e244b36b06f8515cf27c4d49468fc9eb16e93d", size = 750064, upload-time = "2026-02-10T19:18:38.255Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/81/b0bb27f2ba931a65409c6b8a8b358a7f03c0e46eceacddff55f7c84b1f3b/cryptography-46.0.5-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:351695ada9ea9618b3500b490ad54c739860883df6c1f555e088eaf25b1bbaad", size = 7176289, upload-time = "2026-02-10T19:17:08.274Z" }, + { url = "https://files.pythonhosted.org/packages/ff/9e/6b4397a3e3d15123de3b1806ef342522393d50736c13b20ec4c9ea6693a6/cryptography-46.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c18ff11e86df2e28854939acde2d003f7984f721eba450b56a200ad90eeb0e6b", size = 4275637, upload-time = "2026-02-10T19:17:10.53Z" }, + { url = "https://files.pythonhosted.org/packages/63/e7/471ab61099a3920b0c77852ea3f0ea611c9702f651600397ac567848b897/cryptography-46.0.5-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d7e3d356b8cd4ea5aff04f129d5f66ebdc7b6f8eae802b93739ed520c47c79b", size = 4424742, upload-time = "2026-02-10T19:17:12.388Z" }, + { url = "https://files.pythonhosted.org/packages/37/53/a18500f270342d66bf7e4d9f091114e31e5ee9e7375a5aba2e85a91e0044/cryptography-46.0.5-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:50bfb6925eff619c9c023b967d5b77a54e04256c4281b0e21336a130cd7fc263", size = 4277528, upload-time = "2026-02-10T19:17:13.853Z" }, + { url = "https://files.pythonhosted.org/packages/22/29/c2e812ebc38c57b40e7c583895e73c8c5adb4d1e4a0cc4c5a4fdab2b1acc/cryptography-46.0.5-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:803812e111e75d1aa73690d2facc295eaefd4439be1023fefc4995eaea2af90d", size = 4947993, upload-time = "2026-02-10T19:17:15.618Z" }, + { url = "https://files.pythonhosted.org/packages/6b/e7/237155ae19a9023de7e30ec64e5d99a9431a567407ac21170a046d22a5a3/cryptography-46.0.5-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ee190460e2fbe447175cda91b88b84ae8322a104fc27766ad09428754a618ed", size = 4456855, upload-time = "2026-02-10T19:17:17.221Z" }, + { url = "https://files.pythonhosted.org/packages/2d/87/fc628a7ad85b81206738abbd213b07702bcbdada1dd43f72236ef3cffbb5/cryptography-46.0.5-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:f145bba11b878005c496e93e257c1e88f154d278d2638e6450d17e0f31e558d2", size = 3984635, upload-time = "2026-02-10T19:17:18.792Z" }, + { url = "https://files.pythonhosted.org/packages/84/29/65b55622bde135aedf4565dc509d99b560ee4095e56989e815f8fd2aa910/cryptography-46.0.5-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e9251e3be159d1020c4030bd2e5f84d6a43fe54b6c19c12f51cde9542a2817b2", size = 4277038, upload-time = "2026-02-10T19:17:20.256Z" }, + { url = "https://files.pythonhosted.org/packages/bc/36/45e76c68d7311432741faf1fbf7fac8a196a0a735ca21f504c75d37e2558/cryptography-46.0.5-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:47fb8a66058b80e509c47118ef8a75d14c455e81ac369050f20ba0d23e77fee0", size = 4912181, upload-time = "2026-02-10T19:17:21.825Z" }, + { url = "https://files.pythonhosted.org/packages/6d/1a/c1ba8fead184d6e3d5afcf03d569acac5ad063f3ac9fb7258af158f7e378/cryptography-46.0.5-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:4c3341037c136030cb46e4b1e17b7418ea4cbd9dd207e4a6f3b2b24e0d4ac731", size = 4456482, upload-time = "2026-02-10T19:17:25.133Z" }, + { url = "https://files.pythonhosted.org/packages/f9/e5/3fb22e37f66827ced3b902cf895e6a6bc1d095b5b26be26bd13c441fdf19/cryptography-46.0.5-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:890bcb4abd5a2d3f852196437129eb3667d62630333aacc13dfd470fad3aaa82", size = 4405497, upload-time = "2026-02-10T19:17:26.66Z" }, + { url = "https://files.pythonhosted.org/packages/1a/df/9d58bb32b1121a8a2f27383fabae4d63080c7ca60b9b5c88be742be04ee7/cryptography-46.0.5-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:80a8d7bfdf38f87ca30a5391c0c9ce4ed2926918e017c29ddf643d0ed2778ea1", size = 4667819, upload-time = "2026-02-10T19:17:28.569Z" }, + { url = "https://files.pythonhosted.org/packages/ea/ed/325d2a490c5e94038cdb0117da9397ece1f11201f425c4e9c57fe5b9f08b/cryptography-46.0.5-cp311-abi3-win32.whl", hash = "sha256:60ee7e19e95104d4c03871d7d7dfb3d22ef8a9b9c6778c94e1c8fcc8365afd48", size = 3028230, upload-time = "2026-02-10T19:17:30.518Z" }, + { url = "https://files.pythonhosted.org/packages/e9/5a/ac0f49e48063ab4255d9e3b79f5def51697fce1a95ea1370f03dc9db76f6/cryptography-46.0.5-cp311-abi3-win_amd64.whl", hash = "sha256:38946c54b16c885c72c4f59846be9743d699eee2b69b6988e0a00a01f46a61a4", size = 3480909, upload-time = "2026-02-10T19:17:32.083Z" }, + { url = "https://files.pythonhosted.org/packages/00/13/3d278bfa7a15a96b9dc22db5a12ad1e48a9eb3d40e1827ef66a5df75d0d0/cryptography-46.0.5-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:94a76daa32eb78d61339aff7952ea819b1734b46f73646a07decb40e5b3448e2", size = 7119287, upload-time = "2026-02-10T19:17:33.801Z" }, + { url = "https://files.pythonhosted.org/packages/67/c8/581a6702e14f0898a0848105cbefd20c058099e2c2d22ef4e476dfec75d7/cryptography-46.0.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5be7bf2fb40769e05739dd0046e7b26f9d4670badc7b032d6ce4db64dddc0678", size = 4265728, upload-time = "2026-02-10T19:17:35.569Z" }, + { url = "https://files.pythonhosted.org/packages/dd/4a/ba1a65ce8fc65435e5a849558379896c957870dd64fecea97b1ad5f46a37/cryptography-46.0.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fe346b143ff9685e40192a4960938545c699054ba11d4f9029f94751e3f71d87", size = 4408287, upload-time = "2026-02-10T19:17:36.938Z" }, + { url = "https://files.pythonhosted.org/packages/f8/67/8ffdbf7b65ed1ac224d1c2df3943553766914a8ca718747ee3871da6107e/cryptography-46.0.5-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:c69fd885df7d089548a42d5ec05be26050ebcd2283d89b3d30676eb32ff87dee", size = 4270291, upload-time = "2026-02-10T19:17:38.748Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e5/f52377ee93bc2f2bba55a41a886fd208c15276ffbd2569f2ddc89d50e2c5/cryptography-46.0.5-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:8293f3dea7fc929ef7240796ba231413afa7b68ce38fd21da2995549f5961981", size = 4927539, upload-time = "2026-02-10T19:17:40.241Z" }, + { url = "https://files.pythonhosted.org/packages/3b/02/cfe39181b02419bbbbcf3abdd16c1c5c8541f03ca8bda240debc467d5a12/cryptography-46.0.5-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:1abfdb89b41c3be0365328a410baa9df3ff8a9110fb75e7b52e66803ddabc9a9", size = 4442199, upload-time = "2026-02-10T19:17:41.789Z" }, + { url = "https://files.pythonhosted.org/packages/c0/96/2fcaeb4873e536cf71421a388a6c11b5bc846e986b2b069c79363dc1648e/cryptography-46.0.5-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:d66e421495fdb797610a08f43b05269e0a5ea7f5e652a89bfd5a7d3c1dee3648", size = 3960131, upload-time = "2026-02-10T19:17:43.379Z" }, + { url = "https://files.pythonhosted.org/packages/d8/d2/b27631f401ddd644e94c5cf33c9a4069f72011821cf3dc7309546b0642a0/cryptography-46.0.5-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:4e817a8920bfbcff8940ecfd60f23d01836408242b30f1a708d93198393a80b4", size = 4270072, upload-time = "2026-02-10T19:17:45.481Z" }, + { url = "https://files.pythonhosted.org/packages/f4/a7/60d32b0370dae0b4ebe55ffa10e8599a2a59935b5ece1b9f06edb73abdeb/cryptography-46.0.5-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:68f68d13f2e1cb95163fa3b4db4bf9a159a418f5f6e7242564fc75fcae667fd0", size = 4892170, upload-time = "2026-02-10T19:17:46.997Z" }, + { url = "https://files.pythonhosted.org/packages/d2/b9/cf73ddf8ef1164330eb0b199a589103c363afa0cf794218c24d524a58eab/cryptography-46.0.5-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:a3d1fae9863299076f05cb8a778c467578262fae09f9dc0ee9b12eb4268ce663", size = 4441741, upload-time = "2026-02-10T19:17:48.661Z" }, + { url = "https://files.pythonhosted.org/packages/5f/eb/eee00b28c84c726fe8fa0158c65afe312d9c3b78d9d01daf700f1f6e37ff/cryptography-46.0.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c4143987a42a2397f2fc3b4d7e3a7d313fbe684f67ff443999e803dd75a76826", size = 4396728, upload-time = "2026-02-10T19:17:50.058Z" }, + { url = "https://files.pythonhosted.org/packages/65/f4/6bc1a9ed5aef7145045114b75b77c2a8261b4d38717bd8dea111a63c3442/cryptography-46.0.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:7d731d4b107030987fd61a7f8ab512b25b53cef8f233a97379ede116f30eb67d", size = 4652001, upload-time = "2026-02-10T19:17:51.54Z" }, + { url = "https://files.pythonhosted.org/packages/86/ef/5d00ef966ddd71ac2e6951d278884a84a40ffbd88948ef0e294b214ae9e4/cryptography-46.0.5-cp314-cp314t-win32.whl", hash = "sha256:c3bcce8521d785d510b2aad26ae2c966092b7daa8f45dd8f44734a104dc0bc1a", size = 3003637, upload-time = "2026-02-10T19:17:52.997Z" }, + { url = "https://files.pythonhosted.org/packages/b7/57/f3f4160123da6d098db78350fdfd9705057aad21de7388eacb2401dceab9/cryptography-46.0.5-cp314-cp314t-win_amd64.whl", hash = "sha256:4d8ae8659ab18c65ced284993c2265910f6c9e650189d4e3f68445ef82a810e4", size = 3469487, upload-time = "2026-02-10T19:17:54.549Z" }, + { url = "https://files.pythonhosted.org/packages/e2/fa/a66aa722105ad6a458bebd64086ca2b72cdd361fed31763d20390f6f1389/cryptography-46.0.5-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:4108d4c09fbbf2789d0c926eb4152ae1760d5a2d97612b92d508d96c861e4d31", size = 7170514, upload-time = "2026-02-10T19:17:56.267Z" }, + { url = "https://files.pythonhosted.org/packages/0f/04/c85bdeab78c8bc77b701bf0d9bdcf514c044e18a46dcff330df5448631b0/cryptography-46.0.5-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1f30a86d2757199cb2d56e48cce14deddf1f9c95f1ef1b64ee91ea43fe2e18", size = 4275349, upload-time = "2026-02-10T19:17:58.419Z" }, + { url = "https://files.pythonhosted.org/packages/5c/32/9b87132a2f91ee7f5223b091dc963055503e9b442c98fc0b8a5ca765fab0/cryptography-46.0.5-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:039917b0dc418bb9f6edce8a906572d69e74bd330b0b3fea4f79dab7f8ddd235", size = 4420667, upload-time = "2026-02-10T19:18:00.619Z" }, + { url = "https://files.pythonhosted.org/packages/a1/a6/a7cb7010bec4b7c5692ca6f024150371b295ee1c108bdc1c400e4c44562b/cryptography-46.0.5-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ba2a27ff02f48193fc4daeadf8ad2590516fa3d0adeeb34336b96f7fa64c1e3a", size = 4276980, upload-time = "2026-02-10T19:18:02.379Z" }, + { url = "https://files.pythonhosted.org/packages/8e/7c/c4f45e0eeff9b91e3f12dbd0e165fcf2a38847288fcfd889deea99fb7b6d/cryptography-46.0.5-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:61aa400dce22cb001a98014f647dc21cda08f7915ceb95df0c9eaf84b4b6af76", size = 4939143, upload-time = "2026-02-10T19:18:03.964Z" }, + { url = "https://files.pythonhosted.org/packages/37/19/e1b8f964a834eddb44fa1b9a9976f4e414cbb7aa62809b6760c8803d22d1/cryptography-46.0.5-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ce58ba46e1bc2aac4f7d9290223cead56743fa6ab94a5d53292ffaac6a91614", size = 4453674, upload-time = "2026-02-10T19:18:05.588Z" }, + { url = "https://files.pythonhosted.org/packages/db/ed/db15d3956f65264ca204625597c410d420e26530c4e2943e05a0d2f24d51/cryptography-46.0.5-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:420d0e909050490d04359e7fdb5ed7e667ca5c3c402b809ae2563d7e66a92229", size = 3978801, upload-time = "2026-02-10T19:18:07.167Z" }, + { url = "https://files.pythonhosted.org/packages/41/e2/df40a31d82df0a70a0daf69791f91dbb70e47644c58581d654879b382d11/cryptography-46.0.5-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:582f5fcd2afa31622f317f80426a027f30dc792e9c80ffee87b993200ea115f1", size = 4276755, upload-time = "2026-02-10T19:18:09.813Z" }, + { url = "https://files.pythonhosted.org/packages/33/45/726809d1176959f4a896b86907b98ff4391a8aa29c0aaaf9450a8a10630e/cryptography-46.0.5-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:bfd56bb4b37ed4f330b82402f6f435845a5f5648edf1ad497da51a8452d5d62d", size = 4901539, upload-time = "2026-02-10T19:18:11.263Z" }, + { url = "https://files.pythonhosted.org/packages/99/0f/a3076874e9c88ecb2ecc31382f6e7c21b428ede6f55aafa1aa272613e3cd/cryptography-46.0.5-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:a3d507bb6a513ca96ba84443226af944b0f7f47dcc9a399d110cd6146481d24c", size = 4452794, upload-time = "2026-02-10T19:18:12.914Z" }, + { url = "https://files.pythonhosted.org/packages/02/ef/ffeb542d3683d24194a38f66ca17c0a4b8bf10631feef44a7ef64e631b1a/cryptography-46.0.5-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9f16fbdf4da055efb21c22d81b89f155f02ba420558db21288b3d0035bafd5f4", size = 4404160, upload-time = "2026-02-10T19:18:14.375Z" }, + { url = "https://files.pythonhosted.org/packages/96/93/682d2b43c1d5f1406ed048f377c0fc9fc8f7b0447a478d5c65ab3d3a66eb/cryptography-46.0.5-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ced80795227d70549a411a4ab66e8ce307899fad2220ce5ab2f296e687eacde9", size = 4667123, upload-time = "2026-02-10T19:18:15.886Z" }, + { url = "https://files.pythonhosted.org/packages/45/2d/9c5f2926cb5300a8eefc3f4f0b3f3df39db7f7ce40c8365444c49363cbda/cryptography-46.0.5-cp38-abi3-win32.whl", hash = "sha256:02f547fce831f5096c9a567fd41bc12ca8f11df260959ecc7c3202555cc47a72", size = 3010220, upload-time = "2026-02-10T19:18:17.361Z" }, + { url = "https://files.pythonhosted.org/packages/48/ef/0c2f4a8e31018a986949d34a01115dd057bf536905dca38897bacd21fac3/cryptography-46.0.5-cp38-abi3-win_amd64.whl", hash = "sha256:556e106ee01aa13484ce9b0239bca667be5004efb0aabbed28d353df86445595", size = 3467050, upload-time = "2026-02-10T19:18:18.899Z" }, + { url = "https://files.pythonhosted.org/packages/eb/dd/2d9fdb07cebdf3d51179730afb7d5e576153c6744c3ff8fded23030c204e/cryptography-46.0.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:3b4995dc971c9fb83c25aa44cf45f02ba86f71ee600d81091c2f0cbae116b06c", size = 3476964, upload-time = "2026-02-10T19:18:20.687Z" }, + { url = "https://files.pythonhosted.org/packages/e9/6f/6cc6cc9955caa6eaf83660b0da2b077c7fe8ff9950a3c5e45d605038d439/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bc84e875994c3b445871ea7181d424588171efec3e185dced958dad9e001950a", size = 4218321, upload-time = "2026-02-10T19:18:22.349Z" }, + { url = "https://files.pythonhosted.org/packages/3e/5d/c4da701939eeee699566a6c1367427ab91a8b7088cc2328c09dbee940415/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:2ae6971afd6246710480e3f15824ed3029a60fc16991db250034efd0b9fb4356", size = 4381786, upload-time = "2026-02-10T19:18:24.529Z" }, + { url = "https://files.pythonhosted.org/packages/ac/97/a538654732974a94ff96c1db621fa464f455c02d4bb7d2652f4edc21d600/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d861ee9e76ace6cf36a6a89b959ec08e7bc2493ee39d07ffe5acb23ef46d27da", size = 4217990, upload-time = "2026-02-10T19:18:25.957Z" }, + { url = "https://files.pythonhosted.org/packages/ae/11/7e500d2dd3ba891197b9efd2da5454b74336d64a7cc419aa7327ab74e5f6/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:2b7a67c9cd56372f3249b39699f2ad479f6991e62ea15800973b956f4b73e257", size = 4381252, upload-time = "2026-02-10T19:18:27.496Z" }, + { url = "https://files.pythonhosted.org/packages/bc/58/6b3d24e6b9bc474a2dcdee65dfd1f008867015408a271562e4b690561a4d/cryptography-46.0.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8456928655f856c6e1533ff59d5be76578a7157224dbd9ce6872f25055ab9ab7", size = 3407605, upload-time = "2026-02-10T19:18:29.233Z" }, ] [[package]] @@ -834,7 +829,9 @@ wheels = [ name = "macae-mcp-server" source = { editable = "." } dependencies = [ + { name = "azure-core" }, { name = "azure-identity" }, + { name = "cryptography" }, { name = "fastmcp" }, { name = "httpx" }, { name = "pydantic" }, @@ -854,7 +851,9 @@ dev = [ [package.metadata] requires-dist = [ + { name = "azure-core", specifier = "==1.38.0" }, { name = "azure-identity", specifier = "==1.19.0" }, + { name = "cryptography", specifier = "==46.0.5" }, { name = "fastmcp", specifier = "==2.14.0" }, { name = "httpx", specifier = "==0.28.1" }, { name = "pydantic", specifier = "==2.11.7" }, @@ -862,7 +861,7 @@ requires-dist = [ { name = "pytest", marker = "extra == 'dev'", specifier = "==8.3.4" }, { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = "==0.24.0" }, { name = "python-dotenv", specifier = "==1.1.1" }, - { name = "python-multipart", specifier = "==0.0.18" }, + { name = "python-multipart", specifier = "==0.0.22" }, { name = "urllib3", specifier = "==2.6.3" }, { name = "uvicorn", extras = ["standard"], specifier = "==0.38.0" }, { name = "werkzeug", specifier = "==3.1.5" }, @@ -1401,11 +1400,11 @@ wheels = [ [[package]] name = "python-multipart" -version = "0.0.18" +version = "0.0.22" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b4/86/b6b38677dec2e2e7898fc5b6f7e42c2d011919a92d25339451892f27b89c/python_multipart-0.0.18.tar.gz", hash = "sha256:7a68db60c8bfb82e460637fa4750727b45af1d5e2ed215593f917f64694d34fe", size = 36622, upload-time = "2024-11-28T19:16:02.383Z" } +sdist = { url = "https://files.pythonhosted.org/packages/94/01/979e98d542a70714b0cb2b6728ed0b7c46792b695e3eaec3e20711271ca3/python_multipart-0.0.22.tar.gz", hash = "sha256:7340bef99a7e0032613f56dc36027b959fd3b30a787ed62d310e951f7c3a3a58", size = 37612, upload-time = "2026-01-25T10:15:56.219Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/13/6b/b60f47101ba2cac66b4a83246630e68ae9bbe2e614cbae5f4465f46dee13/python_multipart-0.0.18-py3-none-any.whl", hash = "sha256:efe91480f485f6a361427a541db4796f9e1591afc0fb8e7a4ba06bfbc6708996", size = 24389, upload-time = "2024-11-28T19:16:00.947Z" }, + { url = "https://files.pythonhosted.org/packages/1b/d0/397f9626e711ff749a95d96b7af99b9c566a9bb5129b8e4c10fc4d100304/python_multipart-0.0.22-py3-none-any.whl", hash = "sha256:2b2cd894c83d21bf49d702499531c7bafd057d730c201782048f7945d82de155", size = 24579, upload-time = "2026-01-25T10:15:54.811Z" }, ] [[package]] From 1f34901facdbbbbd25337025623f5bf3743e8c69 Mon Sep 17 00:00:00 2001 From: Ayaz-Microsoft Date: Thu, 26 Feb 2026 17:23:55 +0530 Subject: [PATCH 024/225] update azure-ai-projects version to 1.0.0b12 in dependencies --- src/backend/pyproject.toml | 2 +- src/backend/requirements.txt | 2 +- src/backend/uv.lock | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/backend/pyproject.toml b/src/backend/pyproject.toml index be05a724f..1e9735017 100644 --- a/src/backend/pyproject.toml +++ b/src/backend/pyproject.toml @@ -7,7 +7,7 @@ requires-python = ">=3.11" dependencies = [ "azure-ai-evaluation==1.11.0", "azure-ai-inference==1.0.0b9", - "azure-ai-projects==1.0.0", + "azure-ai-projects==1.0.0b12", "azure-ai-agents==1.2.0b5", "azure-cosmos==4.9.0", "azure-identity==1.24.0", diff --git a/src/backend/requirements.txt b/src/backend/requirements.txt index 3c098753a..f57fe75e1 100644 --- a/src/backend/requirements.txt +++ b/src/backend/requirements.txt @@ -15,7 +15,7 @@ opentelemetry-instrumentation-openai opentelemetry-exporter-otlp-proto-http semantic-kernel[azure]==1.39.4 -azure-ai-projects==1.0.0b11 +azure-ai-projects==1.0.0b12 openai==1.84.0 azure-ai-inference==1.0.0b9 azure-search-documents diff --git a/src/backend/uv.lock b/src/backend/uv.lock index 1a678fb49..0302117fa 100644 --- a/src/backend/uv.lock +++ b/src/backend/uv.lock @@ -563,7 +563,7 @@ wheels = [ [[package]] name = "azure-ai-projects" -version = "1.0.0" +version = "1.0.0b12" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "azure-ai-agents" }, @@ -572,9 +572,9 @@ dependencies = [ { name = "isodate" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/dd/95/9c04cb5f658c7f856026aa18432e0f0fa254ead2983a3574a0f5558a7234/azure_ai_projects-1.0.0.tar.gz", hash = "sha256:b5f03024ccf0fd543fbe0f5abcc74e45b15eccc1c71ab87fc71c63061d9fd63c", size = 130798, upload-time = "2025-07-31T02:09:27.912Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a5/57/9a89c1978ec9ce29a3be454b83b66885982261762d7a436cad73c47c9225/azure_ai_projects-1.0.0b12.tar.gz", hash = "sha256:1a3784e4be6af3b0fc76e9e4a64158a38f6679fe3a1f8b9c33f12bc8914ae36c", size = 144358, upload-time = "2025-06-27T04:12:48.334Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/db/7149cdf71e12d9737f186656176efc94943ead4f205671768c1549593efe/azure_ai_projects-1.0.0-py3-none-any.whl", hash = "sha256:81369ed7a2f84a65864f57d3fa153e16c30f411a1504d334e184fb070165a3fa", size = 115188, upload-time = "2025-07-31T02:09:29.362Z" }, + { url = "https://files.pythonhosted.org/packages/73/e4/50cd2c3bd5ab745e85a4a1bd591bf4343d6e3470580f1eadceed55fd57c0/azure_ai_projects-1.0.0b12-py3-none-any.whl", hash = "sha256:4e3d3ef275f7409ea8030e474626968848055d4b3717ff7ef03681da809c096f", size = 129783, upload-time = "2025-06-27T04:12:49.837Z" }, ] [[package]] @@ -775,7 +775,7 @@ requires-dist = [ { name = "azure-ai-agents", specifier = "==1.2.0b5" }, { name = "azure-ai-evaluation", specifier = "==1.11.0" }, { name = "azure-ai-inference", specifier = "==1.0.0b9" }, - { name = "azure-ai-projects", specifier = "==1.0.0" }, + { name = "azure-ai-projects", specifier = "==1.0.0b12" }, { name = "azure-core", specifier = "==1.38.0" }, { name = "azure-cosmos", specifier = "==4.9.0" }, { name = "azure-identity", specifier = "==1.24.0" }, From 310deef9f51bbc63413e3eb7faef380a52d5f470 Mon Sep 17 00:00:00 2001 From: Ayaz-Microsoft Date: Thu, 26 Feb 2026 17:30:21 +0530 Subject: [PATCH 025/225] update openai version to 1.105.0 in requirements --- src/backend/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/requirements.txt b/src/backend/requirements.txt index f57fe75e1..cbd31dc32 100644 --- a/src/backend/requirements.txt +++ b/src/backend/requirements.txt @@ -16,7 +16,7 @@ opentelemetry-exporter-otlp-proto-http semantic-kernel[azure]==1.39.4 azure-ai-projects==1.0.0b12 -openai==1.84.0 +openai==1.105.0 azure-ai-inference==1.0.0b9 azure-search-documents azure-ai-evaluation From 1eed4422b5af0103941586eab4fc19de8898e05d Mon Sep 17 00:00:00 2001 From: Abdul-Microsoft Date: Thu, 26 Feb 2026 22:55:43 +0530 Subject: [PATCH 026/225] refactor: remove API key parameter and switch to AAD authentication for AI Foundry connection --- infra/main.bicep | 1 - infra/modules/aifp-connections.bicep | 18 ++++++++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/infra/main.bicep b/infra/main.bicep index b25b5a691..56dee11e1 100644 --- a/infra/main.bicep +++ b/infra/main.bicep @@ -1759,7 +1759,6 @@ module aiSearchFoundryConnection 'modules/aifp-connections.bicep' = { searchServiceResourceId: searchService.id searchServiceLocation: searchService.location searchServiceName: searchService.name - searchApiKey: searchService.listAdminKeys().primaryKey } dependsOn: [ aiFoundryAiServices diff --git a/infra/modules/aifp-connections.bicep b/infra/modules/aifp-connections.bicep index 8afa883b3..25af63836 100644 --- a/infra/modules/aifp-connections.bicep +++ b/infra/modules/aifp-connections.bicep @@ -1,21 +1,27 @@ +@description('Name of the AI Foundry search connection') param aifSearchConnectionName string + +@description('Name of the Azure AI Search service') param searchServiceName string + +@description('Resource ID of the Azure AI Search service') param searchServiceResourceId string + +@description('Location/region of the Azure AI Search service') param searchServiceLocation string + +@description('Name of the AI Foundry account') param aiFoundryName string + +@description('Name of the AI Foundry project') param aiFoundryProjectName string -@secure() -param searchApiKey string resource aiSearchFoundryConnection 'Microsoft.CognitiveServices/accounts/projects/connections@2025-04-01-preview' = { name: '${aiFoundryName}/${aiFoundryProjectName}/${aifSearchConnectionName}' properties: { category: 'CognitiveSearch' target: 'https://${searchServiceName}.search.windows.net' - authType: 'ApiKey' - credentials: { - key: searchApiKey - } + authType: 'AAD' isSharedToAll: true metadata: { ApiType: 'Azure' From 3648a945d0739977ba0bd9ff93cb7fb38aa124da Mon Sep 17 00:00:00 2001 From: Abdul-Microsoft Date: Fri, 27 Feb 2026 00:10:19 +0530 Subject: [PATCH 027/225] refactor: remove Azure AI Search API key references and switch to AAD authentication --- infra/main.bicep | 27 ++------------ infra/main.json | 83 ++++++++++++++++------------------------- infra/main_custom.bicep | 21 +---------- 3 files changed, 37 insertions(+), 94 deletions(-) diff --git a/infra/main.bicep b/infra/main.bicep index 56dee11e1..3e48d4742 100644 --- a/infra/main.bicep +++ b/infra/main.bicep @@ -1330,10 +1330,6 @@ module containerApp 'br/public:avm/res/app/container-app:0.18.1' = { name: 'SUPPORTED_MODELS' value: '["o3","o4-mini","gpt-4.1","gpt-4.1-mini"]' } - { - name: 'AZURE_AI_SEARCH_API_KEY' - secretRef: 'azure-ai-search-api-key' - } { name: 'AZURE_STORAGE_BLOB_URL' value: avmStorageAccount.outputs.serviceEndpoints.blob @@ -1369,13 +1365,7 @@ module containerApp 'br/public:avm/res/app/container-app:0.18.1' = { ] } ] - secrets: [ - { - name: 'azure-ai-search-api-key' - keyVaultUrl: keyvault.outputs.secrets[0].uriWithVersion - identity: userAssignedIdentity.outputs.resourceId - } - ] + secrets: [] } } @@ -1675,12 +1665,7 @@ module searchServiceUpdate 'br/public:avm/res/search/search-service:0.11.1' = { name: take('avm.res.search.update.${solutionSuffix}', 64) params: { name: searchServiceName - authOptions: { - aadOrApiKey: { - aadAuthFailureMode: 'http401WithBearerChallenge' - } - } - disableLocalAuth: false + disableLocalAuth: true hostingMode: 'default' managedIdentities: { systemAssigned: true @@ -1809,12 +1794,7 @@ module keyvault 'br/public:avm/res/key-vault/vault:0.12.1' = { roleDefinitionIdOrName: 'Key Vault Administrator' } ] - secrets: [ - { - name: 'AzureAISearchAPIKey' - value: searchService.listAdminKeys().primaryKey - } - ] + secrets: [] enableTelemetry: enableTelemetry } } @@ -1864,7 +1844,6 @@ output REASONING_MODEL_NAME string = aiFoundryAiServicesReasoningModelDeployment output MCP_SERVER_NAME string = 'MacaeMcpServer' output MCP_SERVER_DESCRIPTION string = 'MCP server with greeting, HR, and planning tools' output SUPPORTED_MODELS string = '["o3","o4-mini","gpt-4.1","gpt-4.1-mini"]' -output AZURE_AI_SEARCH_API_KEY string = '' output BACKEND_URL string = 'https://${containerApp.outputs.fqdn}' output AZURE_AI_PROJECT_ENDPOINT string = aiFoundryAiProjectEndpoint output AZURE_AI_AGENT_ENDPOINT string = aiFoundryAiProjectEndpoint diff --git a/infra/main.json b/infra/main.json index a9b8af6b6..19cf8a1f7 100644 --- a/infra/main.json +++ b/infra/main.json @@ -6,10 +6,10 @@ "_generator": { "name": "bicep", "version": "0.40.2.10011", - "templateHash": "16839096090855786967" + "templateHash": "17476534152468179054" }, "name": "Multi-Agent Custom Automation Engine", - "description": "This module contains the resources required to deploy the [Multi-Agent Custom Automation Engine solution accelerator](https://github.com/microsoft/Multi-Agent-Custom-Automation-Engine-Solution-Accelerator) for both Sandbox environments and WAF aligned environments.\n\n> **Note:** This module is not intended for broad, generic use, as it was designed by the Commercial Solution Areas CTO team, as a Microsoft Solution Accelerator. Feature requests and bug fix requests are welcome if they support the needs of this organization but may not be incorporated if they aim to make this module more generic than what it needs to be for its primary use case. This module will likely be updated to leverage AVM resource modules in the future. This may result in breaking changes in upcoming versions when these features are implemented.\n" + "description": "This module contains the resources required to deploy the [Multi-Agent Custom Automation Engine solution accelerator](https://github.com/microsoft/Multi-Agent-Custom-Automation-Engine-Solution-Accelerator) for both Sandbox environments and WAF aligned environments.\r\n\r\n> **Note:** This module is not intended for broad, generic use, as it was designed by the Commercial Solution Areas CTO team, as a Microsoft Solution Accelerator. Feature requests and bug fix requests are welcome if they support the needs of this organization but may not be incorporated if they aim to make this module more generic than what it needs to be for its primary use case. This module will likely be updated to leverage AVM resource modules in the future. This may result in breaking changes in upcoming versions when these features are implemented.\r\n" }, "parameters": { "solutionName": { @@ -25441,8 +25441,8 @@ }, "dependsOn": [ "[format('avmPrivateDnsZones[{0}]', variables('dnsZoneIndex').openAI)]", - "[format('avmPrivateDnsZones[{0}]', variables('dnsZoneIndex').cognitiveServices)]", "[format('avmPrivateDnsZones[{0}]', variables('dnsZoneIndex').aiServices)]", + "[format('avmPrivateDnsZones[{0}]', variables('dnsZoneIndex').cognitiveServices)]", "logAnalyticsWorkspace", "userAssignedIdentity", "virtualNetwork" @@ -30521,10 +30521,6 @@ "name": "SUPPORTED_MODELS", "value": "[[\"o3\",\"o4-mini\",\"gpt-4.1\",\"gpt-4.1-mini\"]" }, - { - "name": "AZURE_AI_SEARCH_API_KEY", - "secretRef": "azure-ai-search-api-key" - }, { "name": "AZURE_STORAGE_BLOB_URL", "value": "[reference('avmStorageAccount').outputs.serviceEndpoints.value.blob]" @@ -30562,13 +30558,7 @@ ] }, "secrets": { - "value": [ - { - "name": "azure-ai-search-api-key", - "keyVaultUrl": "[reference('keyvault').outputs.secrets.value[0].uriWithVersion]", - "identity": "[reference('userAssignedIdentity').outputs.resourceId.value]" - } - ] + "value": [] } }, "template": { @@ -32140,7 +32130,6 @@ "containerAppEnvironment", "containerAppMcp", "existingAiFoundryAiServicesProject", - "keyvault", "searchServiceUpdate", "userAssignedIdentity" ] @@ -42268,15 +42257,8 @@ "name": { "value": "[variables('searchServiceName')]" }, - "authOptions": { - "value": { - "aadOrApiKey": { - "aadAuthFailureMode": "http401WithBearerChallenge" - } - } - }, "disableLocalAuth": { - "value": false + "value": true }, "hostingMode": { "value": "default" @@ -44654,9 +44636,6 @@ }, "searchServiceName": { "value": "[variables('searchServiceName')]" - }, - "searchApiKey": { - "value": "[listAdminKeys('searchService', '2024-06-01-preview').primaryKey]" } }, "template": { @@ -44666,30 +44645,45 @@ "_generator": { "name": "bicep", "version": "0.40.2.10011", - "templateHash": "14874963049736669838" + "templateHash": "15348022841521786626" } }, "parameters": { "aifSearchConnectionName": { - "type": "string" + "type": "string", + "metadata": { + "description": "Name of the AI Foundry search connection" + } }, "searchServiceName": { - "type": "string" + "type": "string", + "metadata": { + "description": "Name of the Azure AI Search service" + } }, "searchServiceResourceId": { - "type": "string" + "type": "string", + "metadata": { + "description": "Resource ID of the Azure AI Search service" + } }, "searchServiceLocation": { - "type": "string" + "type": "string", + "metadata": { + "description": "Location/region of the Azure AI Search service" + } }, "aiFoundryName": { - "type": "string" + "type": "string", + "metadata": { + "description": "Name of the AI Foundry account" + } }, "aiFoundryProjectName": { - "type": "string" - }, - "searchApiKey": { - "type": "securestring" + "type": "string", + "metadata": { + "description": "Name of the AI Foundry project" + } } }, "resources": [ @@ -44700,10 +44694,7 @@ "properties": { "category": "CognitiveSearch", "target": "[format('https://{0}.search.windows.net', parameters('searchServiceName'))]", - "authType": "ApiKey", - "credentials": { - "key": "[parameters('searchApiKey')]" - }, + "authType": "AAD", "isSharedToAll": true, "metadata": { "ApiType": "Azure", @@ -44777,12 +44768,7 @@ ] }, "secrets": { - "value": [ - { - "name": "AzureAISearchAPIKey", - "value": "[listAdminKeys('searchService', '2024-06-01-preview').primaryKey]" - } - ] + "value": [] }, "enableTelemetry": { "value": "[parameters('enableTelemetry')]" @@ -47908,7 +47894,6 @@ "dependsOn": [ "[format('avmPrivateDnsZones[{0}]', variables('dnsZoneIndex').keyVault)]", "logAnalyticsWorkspace", - "searchService", "userAssignedIdentity", "virtualNetwork" ] @@ -48041,10 +48026,6 @@ "type": "string", "value": "[[\"o3\",\"o4-mini\",\"gpt-4.1\",\"gpt-4.1-mini\"]" }, - "AZURE_AI_SEARCH_API_KEY": { - "type": "string", - "value": "" - }, "BACKEND_URL": { "type": "string", "value": "[format('https://{0}', reference('containerApp').outputs.fqdn.value)]" diff --git a/infra/main_custom.bicep b/infra/main_custom.bicep index bc5134492..a6fb56a20 100644 --- a/infra/main_custom.bicep +++ b/infra/main_custom.bicep @@ -1365,10 +1365,6 @@ module containerApp 'br/public:avm/res/app/container-app:0.18.1' = { name: 'SUPPORTED_MODELS' value: '["o3","o4-mini","gpt-4.1","gpt-4.1-mini"]' } - { - name: 'AZURE_AI_SEARCH_API_KEY' - secretRef: 'azure-ai-search-api-key' - } { name: 'AZURE_STORAGE_BLOB_URL' value: avmStorageAccount.outputs.serviceEndpoints.blob @@ -1412,13 +1408,7 @@ module containerApp 'br/public:avm/res/app/container-app:0.18.1' = { ] } ] - secrets: [ - { - name: 'azure-ai-search-api-key' - keyVaultUrl: keyvault.outputs.secrets[0].uriWithVersion - identity: userAssignedIdentity.outputs.resourceId - } - ] + secrets: [] } } @@ -1801,7 +1791,6 @@ module aiSearchFoundryConnection 'modules/aifp-connections.bicep' = { searchServiceResourceId: searchService.outputs.resourceId searchServiceLocation: searchService.outputs.location searchServiceName: searchService.outputs.name - searchApiKey: searchService.outputs.primaryKey } dependsOn: [ aiFoundryAiServices @@ -1852,12 +1841,7 @@ module keyvault 'br/public:avm/res/key-vault/vault:0.12.1' = { roleDefinitionIdOrName: 'Key Vault Administrator' } ] - secrets: [ - { - name: 'AzureAISearchAPIKey' - value: searchService.outputs.primaryKey - } - ] + secrets: [] enableTelemetry: enableTelemetry } } @@ -1908,7 +1892,6 @@ output REASONING_MODEL_NAME string = aiFoundryAiServicesReasoningModelDeployment output MCP_SERVER_NAME string = 'MacaeMcpServer' output MCP_SERVER_DESCRIPTION string = 'MCP server with greeting, HR, and planning tools' output SUPPORTED_MODELS string = '["o3","o4-mini","gpt-4.1","gpt-4.1-mini"]' -output AZURE_AI_SEARCH_API_KEY string = '' output BACKEND_URL string = 'https://${containerApp.outputs.fqdn}' output AZURE_AI_PROJECT_ENDPOINT string = aiFoundryAiProjectEndpoint output AZURE_AI_AGENT_ENDPOINT string = aiFoundryAiProjectEndpoint From bb9b76c91fc125b76dec422709b9b23221254cc5 Mon Sep 17 00:00:00 2001 From: Ayaz-Microsoft Date: Fri, 27 Feb 2026 00:10:19 +0530 Subject: [PATCH 028/225] update azure-ai-projects version to 1.0.0 --- src/backend/pyproject.toml | 2 +- src/backend/requirements.txt | 2 +- src/backend/uv.lock | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/backend/pyproject.toml b/src/backend/pyproject.toml index 1e9735017..be05a724f 100644 --- a/src/backend/pyproject.toml +++ b/src/backend/pyproject.toml @@ -7,7 +7,7 @@ requires-python = ">=3.11" dependencies = [ "azure-ai-evaluation==1.11.0", "azure-ai-inference==1.0.0b9", - "azure-ai-projects==1.0.0b12", + "azure-ai-projects==1.0.0", "azure-ai-agents==1.2.0b5", "azure-cosmos==4.9.0", "azure-identity==1.24.0", diff --git a/src/backend/requirements.txt b/src/backend/requirements.txt index cbd31dc32..b7c42b455 100644 --- a/src/backend/requirements.txt +++ b/src/backend/requirements.txt @@ -15,7 +15,7 @@ opentelemetry-instrumentation-openai opentelemetry-exporter-otlp-proto-http semantic-kernel[azure]==1.39.4 -azure-ai-projects==1.0.0b12 +azure-ai-projects==1.0.0 openai==1.105.0 azure-ai-inference==1.0.0b9 azure-search-documents diff --git a/src/backend/uv.lock b/src/backend/uv.lock index 0302117fa..1a678fb49 100644 --- a/src/backend/uv.lock +++ b/src/backend/uv.lock @@ -563,7 +563,7 @@ wheels = [ [[package]] name = "azure-ai-projects" -version = "1.0.0b12" +version = "1.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "azure-ai-agents" }, @@ -572,9 +572,9 @@ dependencies = [ { name = "isodate" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a5/57/9a89c1978ec9ce29a3be454b83b66885982261762d7a436cad73c47c9225/azure_ai_projects-1.0.0b12.tar.gz", hash = "sha256:1a3784e4be6af3b0fc76e9e4a64158a38f6679fe3a1f8b9c33f12bc8914ae36c", size = 144358, upload-time = "2025-06-27T04:12:48.334Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dd/95/9c04cb5f658c7f856026aa18432e0f0fa254ead2983a3574a0f5558a7234/azure_ai_projects-1.0.0.tar.gz", hash = "sha256:b5f03024ccf0fd543fbe0f5abcc74e45b15eccc1c71ab87fc71c63061d9fd63c", size = 130798, upload-time = "2025-07-31T02:09:27.912Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/73/e4/50cd2c3bd5ab745e85a4a1bd591bf4343d6e3470580f1eadceed55fd57c0/azure_ai_projects-1.0.0b12-py3-none-any.whl", hash = "sha256:4e3d3ef275f7409ea8030e474626968848055d4b3717ff7ef03681da809c096f", size = 129783, upload-time = "2025-06-27T04:12:49.837Z" }, + { url = "https://files.pythonhosted.org/packages/b5/db/7149cdf71e12d9737f186656176efc94943ead4f205671768c1549593efe/azure_ai_projects-1.0.0-py3-none-any.whl", hash = "sha256:81369ed7a2f84a65864f57d3fa153e16c30f411a1504d334e184fb070165a3fa", size = 115188, upload-time = "2025-07-31T02:09:29.362Z" }, ] [[package]] @@ -775,7 +775,7 @@ requires-dist = [ { name = "azure-ai-agents", specifier = "==1.2.0b5" }, { name = "azure-ai-evaluation", specifier = "==1.11.0" }, { name = "azure-ai-inference", specifier = "==1.0.0b9" }, - { name = "azure-ai-projects", specifier = "==1.0.0b12" }, + { name = "azure-ai-projects", specifier = "==1.0.0" }, { name = "azure-core", specifier = "==1.38.0" }, { name = "azure-cosmos", specifier = "==4.9.0" }, { name = "azure-identity", specifier = "==1.24.0" }, From 6aabe72e97c98a3b23bc53d38ef927d31dfb2691 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 27 Feb 2026 05:28:57 +0000 Subject: [PATCH 029/225] Initial plan From 2bde80027e7154b9435ffe3872129c12d49d590e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 27 Feb 2026 05:31:23 +0000 Subject: [PATCH 030/225] fix: set disableLocalAuth: true in main_custom.bicep and fix CRLF in main.json Co-authored-by: Abdul-Microsoft <192570837+Abdul-Microsoft@users.noreply.github.com> --- infra/main.json | 2 +- infra/main_custom.bicep | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/infra/main.json b/infra/main.json index 19cf8a1f7..7c6043215 100644 --- a/infra/main.json +++ b/infra/main.json @@ -9,7 +9,7 @@ "templateHash": "17476534152468179054" }, "name": "Multi-Agent Custom Automation Engine", - "description": "This module contains the resources required to deploy the [Multi-Agent Custom Automation Engine solution accelerator](https://github.com/microsoft/Multi-Agent-Custom-Automation-Engine-Solution-Accelerator) for both Sandbox environments and WAF aligned environments.\r\n\r\n> **Note:** This module is not intended for broad, generic use, as it was designed by the Commercial Solution Areas CTO team, as a Microsoft Solution Accelerator. Feature requests and bug fix requests are welcome if they support the needs of this organization but may not be incorporated if they aim to make this module more generic than what it needs to be for its primary use case. This module will likely be updated to leverage AVM resource modules in the future. This may result in breaking changes in upcoming versions when these features are implemented.\r\n" + "description": "This module contains the resources required to deploy the [Multi-Agent Custom Automation Engine solution accelerator](https://github.com/microsoft/Multi-Agent-Custom-Automation-Engine-Solution-Accelerator) for both Sandbox environments and WAF aligned environments.\n\n> **Note:** This module is not intended for broad, generic use, as it was designed by the Commercial Solution Areas CTO team, as a Microsoft Solution Accelerator. Feature requests and bug fix requests are welcome if they support the needs of this organization but may not be incorporated if they aim to make this module more generic than what it needs to be for its primary use case. This module will likely be updated to leverage AVM resource modules in the future. This may result in breaking changes in upcoming versions when these features are implemented.\n" }, "parameters": { "solutionName": { diff --git a/infra/main_custom.bicep b/infra/main_custom.bicep index a6fb56a20..1aeebeea4 100644 --- a/infra/main_custom.bicep +++ b/infra/main_custom.bicep @@ -1710,12 +1710,7 @@ module searchService 'br/public:avm/res/search/search-service:0.11.1' = { name: take('avm.res.search.search-service.${solutionSuffix}', 64) params: { name: searchServiceName - authOptions: { - aadOrApiKey: { - aadAuthFailureMode: 'http401WithBearerChallenge' - } - } - disableLocalAuth: false + disableLocalAuth: true hostingMode: 'default' managedIdentities: { systemAssigned: true From 6a0462bb898395c7374f4933c95b60208788913a Mon Sep 17 00:00:00 2001 From: Abdul-Microsoft Date: Fri, 27 Feb 2026 11:54:44 +0530 Subject: [PATCH 031/225] resolved pylint issues --- src/backend/app.py | 4 +-- src/backend/v4/callbacks/response_handlers.py | 2 +- .../v4/magentic_agents/common/lifecycle.py | 4 +-- .../v4/magentic_agents/foundry_agent.py | 1 - .../orchestration/human_approval_manager.py | 4 +-- .../v4/orchestration/orchestration_manager.py | 30 +++++++++---------- 6 files changed, 22 insertions(+), 23 deletions(-) diff --git a/src/backend/app.py b/src/backend/app.py index 65381236a..2cf7d6a6b 100644 --- a/src/backend/app.py +++ b/src/backend/app.py @@ -10,7 +10,7 @@ from azure.monitor.opentelemetry import configure_azure_monitor -#from common.config.app_config import config +# from common.config.app_config import config from common.models.messages_af import UserLanguage # FastAPI imports @@ -66,7 +66,7 @@ async def lifespan(app: FastAPI): ) # Configure logging levels from environment variables -#logging.basicConfig(level=getattr(logging, config.AZURE_BASIC_LOGGING_LEVEL.upper(), logging.INFO)) +# logging.basicConfig(level=getattr(logging, config.AZURE_BASIC_LOGGING_LEVEL.upper(), logging.INFO)) # Configure Azure package logging levels azure_level = getattr(logging, config.AZURE_PACKAGE_LOGGING_LEVEL.upper(), logging.WARNING) diff --git a/src/backend/v4/callbacks/response_handlers.py b/src/backend/v4/callbacks/response_handlers.py index f034e4168..0a817ef94 100644 --- a/src/backend/v4/callbacks/response_handlers.py +++ b/src/backend/v4/callbacks/response_handlers.py @@ -121,7 +121,7 @@ async def streaming_agent_response_callback( try: # Handle various streaming update object shapes chunk_text = getattr(update, "text", None) - + # If text is None, don't fall back to str(update) as that would show object repr # Just skip if there's no actual text content if chunk_text is None: diff --git a/src/backend/v4/magentic_agents/common/lifecycle.py b/src/backend/v4/magentic_agents/common/lifecycle.py index c9093c318..b38e31eed 100644 --- a/src/backend/v4/magentic_agents/common/lifecycle.py +++ b/src/backend/v4/magentic_agents/common/lifecycle.py @@ -149,7 +149,7 @@ async def _after_open(self) -> None: def get_chat_client(self) -> AzureAIClient: """Return the underlying ChatClientProtocol (AzureAIClient). - + Uses agent_name with use_latest_version=True to get the latest agent version. Agent reuse is handled automatically by the SDK via agent_name. """ @@ -173,7 +173,7 @@ def get_chat_client(self) -> AzureAIClient: def get_agent_id(self) -> str: """Generate a local agent ID for the ChatAgent wrapper. - + The new AzureAIClient identifies agents by name (not ID) on the server side. This ID is only used locally for the ChatAgent wrapper instance. """ diff --git a/src/backend/v4/magentic_agents/foundry_agent.py b/src/backend/v4/magentic_agents/foundry_agent.py index 6d3974010..38fd0cc6b 100644 --- a/src/backend/v4/magentic_agents/foundry_agent.py +++ b/src/backend/v4/magentic_agents/foundry_agent.py @@ -174,7 +174,6 @@ async def _create_azure_search_enabled_client(self) -> Optional[AzureAIClient]: f"{self.agent_instructions} " "Always use the Azure AI Search tool and configured index for knowledge retrieval." ) - azure_agent = await self.project_client.agents.create_version( agent_name=self.agent_name, # Use original name diff --git a/src/backend/v4/orchestration/human_approval_manager.py b/src/backend/v4/orchestration/human_approval_manager.py index 00850ec26..7f33c9ac4 100644 --- a/src/backend/v4/orchestration/human_approval_manager.py +++ b/src/backend/v4/orchestration/human_approval_manager.py @@ -85,7 +85,7 @@ def __init__(self, user_id: str, agent, *args, **kwargs): ORCHESTRATOR_TASK_LEDGER_PLAN_UPDATE_PROMPT + plan_append ) kwargs["final_answer_prompt"] = ORCHESTRATOR_FINAL_ANSWER_PROMPT + final_append - + # Override progress ledger prompt to discourage re-calling agents from agent_framework._workflows._magentic import ORCHESTRATOR_PROGRESS_LEDGER_PROMPT kwargs["progress_ledger_prompt"] = ORCHESTRATOR_PROGRESS_LEDGER_PROMPT + progress_append @@ -319,4 +319,4 @@ def plan_to_obj(self, magentic_context: MagenticContext, ledger) -> MPlan: task=task_text, ) - return return_plan \ No newline at end of file + return return_plan diff --git a/src/backend/v4/orchestration/orchestration_manager.py b/src/backend/v4/orchestration/orchestration_manager.py index 6d6811850..d38748d83 100644 --- a/src/backend/v4/orchestration/orchestration_manager.py +++ b/src/backend/v4/orchestration/orchestration_manager.py @@ -50,7 +50,7 @@ def __init__(self): def _extract_response_text(self, data) -> str: """ Extract text content from various agent_framework response types. - + Handles: - ChatMessage: Extract .text - AgentResponse: Extract .text @@ -59,15 +59,15 @@ def _extract_response_text(self, data) -> str: """ if data is None: return "" - + # Direct ChatMessage if isinstance(data, ChatMessage): return data.text or "" - + # Has .text attribute directly (AgentResponse, etc.) if hasattr(data, "text") and data.text: return data.text - + # AgentExecutorResponse - has agent_response and full_conversation if hasattr(data, "agent_response"): # Try to get text from agent_response first @@ -79,7 +79,7 @@ def _extract_response_text(self, data) -> str: last_msg = data.full_conversation[-1] if isinstance(last_msg, ChatMessage) and last_msg.text: return last_msg.text - + # List of items - could be AgentExecutorResponse, ChatMessage, etc. if isinstance(data, list) and len(data) > 0: texts = [] @@ -91,7 +91,7 @@ def _extract_response_text(self, data) -> str: if texts: # Return the last non-empty response (most recent) return texts[-1] - + return "" # --------------------------- @@ -195,12 +195,12 @@ async def init_orchestration( # Assemble workflow with callback storage = InMemoryCheckpointStorage() - + # New SDK: participants() accepts a Sequence (list) of agents # The orchestrator uses agent.name to identify them participant_list = list(participants.values()) cls.logger.info("Participants for workflow: %s", list(participants.keys())) - + builder = ( MagenticBuilder() .participants(participant_list) # New SDK: pass as list @@ -241,7 +241,7 @@ async def get_current_or_new_orchestration( """ current = orchestration_config.get_current_orchestration(user_id) needs_rebuild = current is None or team_switched or force_rebuild - + if needs_rebuild: if current is not None and (team_switched or force_rebuild): reason = "team switched" if team_switched else "force rebuild for new task" @@ -387,7 +387,7 @@ async def run_orchestration(self, user_id: str, input_task) -> None: event_type_name = type(event).__name__ if event_type_name != "AgentRunUpdateEvent": self.logger.info("[EVENT] %s", event_type_name) - + # Handle orchestrator events (plan, progress ledger) if isinstance(event, MagenticOrchestratorEvent): self.logger.info( @@ -403,7 +403,7 @@ async def run_orchestration(self, user_id: str, input_task) -> None: elif isinstance(event, AgentRunUpdateEvent): message_id = event.data.message_id if hasattr(event.data, 'message_id') else None executor_id = event.executor_id - + # Stream the update try: await streaming_agent_response_callback( @@ -417,7 +417,7 @@ async def run_orchestration(self, user_id: str, input_task) -> None: "Error in streaming callback for agent %s: %s", executor_id, e ) - + # Track message for formatting if message_id != last_message_id: last_message_id = message_id @@ -427,14 +427,14 @@ async def run_orchestration(self, user_id: str, input_task) -> None: agent_name = event.participant_name agent_call_counts[agent_name] = agent_call_counts.get(agent_name, 0) + 1 call_num = agent_call_counts[agent_name] - + self.logger.info( "[REQUEST SENT (round %d)] to agent: %s (call #%d)", event.round_index, agent_name, call_num ) - + if call_num > 1: self.logger.warning("Agent '%s' called %d times", agent_name, call_num) @@ -448,7 +448,7 @@ async def run_orchestration(self, user_id: str, input_task) -> None: # Send the agent response to the UI if event.data: response_text = self._extract_response_text(event.data) - + if response_text: self.logger.info("Sending agent response to UI from %s", event.participant_name) agent_response_callback( From 5ed11585a40b7d5f382a45e05607c5977e518ed7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Mar 2026 10:39:15 +0000 Subject: [PATCH 032/225] build: bump the python-deps group in /src/backend with 27 updates Bumps the python-deps group in /src/backend with 27 updates: | Package | From | To | | --- | --- | --- | | [azure-ai-evaluation](https://github.com/Azure/azure-sdk-for-python) | `1.11.0` | `1.15.3` | | [azure-ai-projects](https://github.com/Azure/azure-sdk-for-python) | `1.0.0b11` | `2.0.0b4` | | [azure-ai-agents](https://github.com/Azure/azure-sdk-for-python) | `1.2.0b5` | `1.2.0b6` | | [azure-cosmos](https://github.com/Azure/azure-sdk-for-python) | `4.9.0` | `4.15.0` | | [azure-identity](https://github.com/Azure/azure-sdk-for-python) | `1.24.0` | `1.25.2` | | [azure-monitor-opentelemetry](https://github.com/Azure/azure-sdk-for-python) | `1.7.0` | `1.8.6` | | [azure-search-documents](https://github.com/Azure/azure-sdk-for-python) | `11.5.3` | `11.6.0` | | [fastapi](https://github.com/fastapi/fastapi) | `0.116.1` | `0.135.0` | | [openai](https://github.com/openai/openai-python) | `1.84.0` | `2.24.0` | | [opentelemetry-api](https://github.com/open-telemetry/opentelemetry-python) | `1.36.0` | `1.39.1` | | [opentelemetry-exporter-otlp-proto-grpc](https://github.com/open-telemetry/opentelemetry-python) | `1.36.0` | `1.39.1` | | [opentelemetry-exporter-otlp-proto-http](https://github.com/open-telemetry/opentelemetry-python) | `1.36.0` | `1.39.1` | | [opentelemetry-instrumentation-fastapi](https://github.com/open-telemetry/opentelemetry-python-contrib) | `0.57b0` | `0.60b1` | | [opentelemetry-instrumentation-openai](https://github.com/traceloop/openllmetry) | `0.46.2` | `0.52.6` | | [opentelemetry-sdk](https://github.com/open-telemetry/opentelemetry-python) | `1.36.0` | `1.39.1` | | [pytest](https://github.com/pytest-dev/pytest) | `8.4.1` | `9.0.2` | | [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) | `0.24.0` | `1.3.0` | | [pytest-cov](https://github.com/pytest-dev/pytest-cov) | `5.0.0` | `7.0.0` | | [python-dotenv](https://github.com/theskumar/python-dotenv) | `1.1.1` | `1.2.1` | | [python-multipart](https://github.com/Kludex/python-multipart) | `0.0.20` | `0.0.22` | | [semantic-kernel](https://github.com/microsoft/semantic-kernel) | `1.39.3` | `1.39.4` | | [uvicorn](https://github.com/Kludex/uvicorn) | `0.35.0` | `0.41.0` | | [pylint-pydantic](https://github.com/fcfangcc/pylint-pydantic) | `0.3.5` | `0.4.1` | | [mcp](https://github.com/modelcontextprotocol/python-sdk) | `1.23.0` | `1.26.0` | | [werkzeug](https://github.com/pallets/werkzeug) | `3.1.5` | `3.1.6` | | [azure-core](https://github.com/Azure/azure-sdk-for-python) | `1.38.0` | `1.38.2` | | [semantic-kernel[azure]](https://github.com/microsoft/semantic-kernel) | `1.32.2` | `1.39.4` | Updates `azure-ai-evaluation` from 1.11.0 to 1.15.3 - [Release notes](https://github.com/Azure/azure-sdk-for-python/releases) - [Commits](https://github.com/Azure/azure-sdk-for-python/compare/azure-ai-evaluation_1.11.0...azure-ai-evaluation_1.15.3) Updates `azure-ai-projects` from 1.0.0b11 to 2.0.0b4 - [Release notes](https://github.com/Azure/azure-sdk-for-python/releases) - [Commits](https://github.com/Azure/azure-sdk-for-python/compare/azure-ai-projects_1.0.0b11...azure-ai-projects_2.0.0b4) Updates `azure-ai-agents` from 1.2.0b5 to 1.2.0b6 - [Release notes](https://github.com/Azure/azure-sdk-for-python/releases) - [Commits](https://github.com/Azure/azure-sdk-for-python/compare/azure-ai-agents_1.2.0b5...azure-ai-agents_1.2.0b6) Updates `azure-cosmos` from 4.9.0 to 4.15.0 - [Release notes](https://github.com/Azure/azure-sdk-for-python/releases) - [Commits](https://github.com/Azure/azure-sdk-for-python/compare/azure-cosmos_4.9.0...azure-cosmos_4.15.0) Updates `azure-identity` from 1.24.0 to 1.25.2 - [Release notes](https://github.com/Azure/azure-sdk-for-python/releases) - [Commits](https://github.com/Azure/azure-sdk-for-python/compare/azure-identity_1.24.0...azure-identity_1.25.2) Updates `azure-monitor-opentelemetry` from 1.7.0 to 1.8.6 - [Release notes](https://github.com/Azure/azure-sdk-for-python/releases) - [Commits](https://github.com/Azure/azure-sdk-for-python/compare/azure-monitor-opentelemetry_1.7.0...azure-monitor-opentelemetry_1.8.6) Updates `azure-search-documents` from 11.5.3 to 11.6.0 - [Release notes](https://github.com/Azure/azure-sdk-for-python/releases) - [Changelog](https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/search/azure-search-documents/CHANGELOG.md) - [Commits](https://github.com/Azure/azure-sdk-for-python/compare/azure-search-documents_11.5.3...azure-search-documents_11.6.0) Updates `fastapi` from 0.116.1 to 0.135.0 - [Release notes](https://github.com/fastapi/fastapi/releases) - [Commits](https://github.com/fastapi/fastapi/compare/0.116.1...0.135.0) Updates `openai` from 1.84.0 to 2.24.0 - [Release notes](https://github.com/openai/openai-python/releases) - [Changelog](https://github.com/openai/openai-python/blob/main/CHANGELOG.md) - [Commits](https://github.com/openai/openai-python/compare/v1.84.0...v2.24.0) Updates `opentelemetry-api` from 1.36.0 to 1.39.1 - [Release notes](https://github.com/open-telemetry/opentelemetry-python/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-python/blob/v1.39.1/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-python/compare/v1.36.0...v1.39.1) Updates `opentelemetry-exporter-otlp-proto-grpc` from 1.36.0 to 1.39.1 - [Release notes](https://github.com/open-telemetry/opentelemetry-python/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-python/blob/v1.39.1/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-python/compare/v1.36.0...v1.39.1) Updates `opentelemetry-exporter-otlp-proto-http` from 1.36.0 to 1.39.1 - [Release notes](https://github.com/open-telemetry/opentelemetry-python/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-python/blob/v1.39.1/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-python/compare/v1.36.0...v1.39.1) Updates `opentelemetry-instrumentation-fastapi` from 0.57b0 to 0.60b1 - [Release notes](https://github.com/open-telemetry/opentelemetry-python-contrib/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-python-contrib/blob/main/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-python-contrib/commits) Updates `opentelemetry-instrumentation-openai` from 0.46.2 to 0.52.6 - [Release notes](https://github.com/traceloop/openllmetry/releases) - [Changelog](https://github.com/traceloop/openllmetry/blob/main/CHANGELOG.md) - [Commits](https://github.com/traceloop/openllmetry/compare/0.46.2...0.52.6) Updates `opentelemetry-sdk` from 1.36.0 to 1.39.1 - [Release notes](https://github.com/open-telemetry/opentelemetry-python/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-python/blob/v1.39.1/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-python/compare/v1.36.0...v1.39.1) Updates `pytest` from 8.4.1 to 9.0.2 - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/8.4.1...9.0.2) Updates `pytest-asyncio` from 0.24.0 to 1.3.0 - [Release notes](https://github.com/pytest-dev/pytest-asyncio/releases) - [Commits](https://github.com/pytest-dev/pytest-asyncio/compare/v0.24.0...v1.3.0) Updates `pytest-cov` from 5.0.0 to 7.0.0 - [Changelog](https://github.com/pytest-dev/pytest-cov/blob/master/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest-cov/compare/v5.0.0...v7.0.0) Updates `python-dotenv` from 1.1.1 to 1.2.1 - [Release notes](https://github.com/theskumar/python-dotenv/releases) - [Changelog](https://github.com/theskumar/python-dotenv/blob/main/CHANGELOG.md) - [Commits](https://github.com/theskumar/python-dotenv/compare/v1.1.1...v1.2.1) Updates `python-multipart` from 0.0.20 to 0.0.22 - [Release notes](https://github.com/Kludex/python-multipart/releases) - [Changelog](https://github.com/Kludex/python-multipart/blob/master/CHANGELOG.md) - [Commits](https://github.com/Kludex/python-multipart/compare/0.0.20...0.0.22) Updates `semantic-kernel` from 1.39.3 to 1.39.4 - [Release notes](https://github.com/microsoft/semantic-kernel/releases) - [Commits](https://github.com/microsoft/semantic-kernel/compare/python-1.39.3...python-1.39.4) Updates `uvicorn` from 0.35.0 to 0.41.0 - [Release notes](https://github.com/Kludex/uvicorn/releases) - [Changelog](https://github.com/Kludex/uvicorn/blob/main/docs/release-notes.md) - [Commits](https://github.com/Kludex/uvicorn/compare/0.35.0...0.41.0) Updates `pylint-pydantic` from 0.3.5 to 0.4.1 - [Release notes](https://github.com/fcfangcc/pylint-pydantic/releases) - [Commits](https://github.com/fcfangcc/pylint-pydantic/compare/v0.3.5...v0.4.1) Updates `mcp` from 1.23.0 to 1.26.0 - [Release notes](https://github.com/modelcontextprotocol/python-sdk/releases) - [Changelog](https://github.com/modelcontextprotocol/python-sdk/blob/main/RELEASE.md) - [Commits](https://github.com/modelcontextprotocol/python-sdk/compare/v1.23.0...v1.26.0) Updates `werkzeug` from 3.1.5 to 3.1.6 - [Release notes](https://github.com/pallets/werkzeug/releases) - [Changelog](https://github.com/pallets/werkzeug/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/werkzeug/compare/3.1.5...3.1.6) Updates `azure-core` from 1.38.0 to 1.38.2 - [Release notes](https://github.com/Azure/azure-sdk-for-python/releases) - [Commits](https://github.com/Azure/azure-sdk-for-python/compare/azure-core_1.38.0...azure-core_1.38.2) Updates `semantic-kernel[azure]` from 1.32.2 to 1.39.4 - [Release notes](https://github.com/microsoft/semantic-kernel/releases) - [Commits](https://github.com/microsoft/semantic-kernel/compare/python-1.32.2...python-1.39.4) --- updated-dependencies: - dependency-name: azure-ai-evaluation dependency-version: 1.15.3 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-deps - dependency-name: azure-ai-projects dependency-version: 2.0.0b4 dependency-type: direct:production update-type: version-update:semver-major dependency-group: python-deps - dependency-name: azure-ai-agents dependency-version: 1.2.0b6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: python-deps - dependency-name: azure-cosmos dependency-version: 4.15.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-deps - dependency-name: azure-identity dependency-version: 1.25.2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-deps - dependency-name: azure-monitor-opentelemetry dependency-version: 1.8.6 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-deps - dependency-name: azure-search-documents dependency-version: 11.6.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-deps - dependency-name: fastapi dependency-version: 0.135.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-deps - dependency-name: openai dependency-version: 2.24.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: python-deps - dependency-name: opentelemetry-api dependency-version: 1.39.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-deps - dependency-name: opentelemetry-exporter-otlp-proto-grpc dependency-version: 1.39.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-deps - dependency-name: opentelemetry-exporter-otlp-proto-http dependency-version: 1.39.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-deps - dependency-name: opentelemetry-instrumentation-fastapi dependency-version: 0.60b1 dependency-type: direct:production dependency-group: python-deps - dependency-name: opentelemetry-instrumentation-openai dependency-version: 0.52.6 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-deps - dependency-name: opentelemetry-sdk dependency-version: 1.39.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-deps - dependency-name: pytest dependency-version: 9.0.2 dependency-type: direct:production update-type: version-update:semver-major dependency-group: python-deps - dependency-name: pytest-asyncio dependency-version: 1.3.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: python-deps - dependency-name: pytest-cov dependency-version: 7.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: python-deps - dependency-name: python-dotenv dependency-version: 1.2.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-deps - dependency-name: python-multipart dependency-version: 0.0.22 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: python-deps - dependency-name: semantic-kernel dependency-version: 1.39.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: python-deps - dependency-name: uvicorn dependency-version: 0.41.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-deps - dependency-name: pylint-pydantic dependency-version: 0.4.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-deps - dependency-name: mcp dependency-version: 1.26.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-deps - dependency-name: werkzeug dependency-version: 3.1.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: python-deps - dependency-name: azure-core dependency-version: 1.38.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: python-deps - dependency-name: semantic-kernel[azure] dependency-version: 1.39.4 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-deps ... Signed-off-by: dependabot[bot] --- src/backend/pyproject.toml | 52 ++++++++++++++++++------------------ src/backend/requirements.txt | 12 ++++----- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/src/backend/pyproject.toml b/src/backend/pyproject.toml index ceb686577..fb41fe8c5 100644 --- a/src/backend/pyproject.toml +++ b/src/backend/pyproject.toml @@ -5,34 +5,34 @@ description = "Add your description here" readme = "README.md" requires-python = ">=3.11" dependencies = [ - "azure-ai-evaluation==1.11.0", + "azure-ai-evaluation==1.15.3", "azure-ai-inference==1.0.0b9", - "azure-ai-projects==1.0.0", - "azure-ai-agents==1.2.0b5", - "azure-cosmos==4.9.0", - "azure-identity==1.24.0", + "azure-ai-projects==2.0.0b4", + "azure-ai-agents==1.2.0b6", + "azure-cosmos==4.15.0", + "azure-identity==1.25.2", "azure-monitor-events-extension==0.1.0", - "azure-monitor-opentelemetry==1.7.0", - "azure-search-documents==11.5.3", - "fastapi==0.116.1", - "openai==1.105.0", - "opentelemetry-api==1.36.0", - "opentelemetry-exporter-otlp-proto-grpc==1.36.0", - "opentelemetry-exporter-otlp-proto-http==1.36.0", - "opentelemetry-instrumentation-fastapi==0.57b0", - "opentelemetry-instrumentation-openai==0.46.2", - "opentelemetry-sdk==1.36.0", - "pytest==8.4.1", - "pytest-asyncio==0.24.0", - "pytest-cov==5.0.0", - "python-dotenv==1.1.1", - "python-multipart==0.0.20", - "semantic-kernel==1.39.3", - "uvicorn==0.35.0", - "pylint-pydantic==0.3.5", + "azure-monitor-opentelemetry==1.8.6", + "azure-search-documents==11.6.0", + "fastapi==0.135.0", + "openai==2.24.0", + "opentelemetry-api==1.39.1", + "opentelemetry-exporter-otlp-proto-grpc==1.39.1", + "opentelemetry-exporter-otlp-proto-http==1.39.1", + "opentelemetry-instrumentation-fastapi==0.60b1", + "opentelemetry-instrumentation-openai==0.52.6", + "opentelemetry-sdk==1.39.1", + "pytest==9.0.2", + "pytest-asyncio==1.3.0", + "pytest-cov==7.0.0", + "python-dotenv==1.2.1", + "python-multipart==0.0.22", + "semantic-kernel==1.39.4", + "uvicorn==0.41.0", + "pylint-pydantic==0.4.1", "pexpect==4.9.0", - "mcp==1.23.0", - "werkzeug==3.1.5", - "azure-core==1.38.0", + "mcp==1.26.0", + "werkzeug==3.1.6", + "azure-core==1.38.2", "agent-framework>=1.0.0b251105", ] diff --git a/src/backend/requirements.txt b/src/backend/requirements.txt index b785f4776..924764999 100644 --- a/src/backend/requirements.txt +++ b/src/backend/requirements.txt @@ -14,9 +14,9 @@ opentelemetry-instrumentation-fastapi opentelemetry-instrumentation-openai opentelemetry-exporter-otlp-proto-http -semantic-kernel[azure]==1.32.2 -azure-ai-projects==1.0.0b11 -openai==1.84.0 +semantic-kernel[azure]==1.39.4 +azure-ai-projects==2.0.0b4 +openai==2.24.0 azure-ai-inference==1.0.0b9 azure-search-documents azure-ai-evaluation @@ -27,7 +27,7 @@ opentelemetry-exporter-otlp-proto-grpc babel>=2.9.0 # Testing tools -pytest>=8.2,<9 # Compatible version for pytest-asyncio -pytest-asyncio==0.24.0 -pytest-cov==5.0.0 +pytest>=8.2,<10 # Compatible version for pytest-asyncio +pytest-asyncio==1.3.0 +pytest-cov==7.0.0 From 95a7d0d0fada2833a93f10fb47755778b0150754 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Mar 2026 10:36:54 +0000 Subject: [PATCH 033/225] build: bump the all-actions group with 8 updates Bumps the all-actions group with 8 updates: | Package | From | To | | --- | --- | --- | | [actions/checkout](https://github.com/actions/checkout) | `4` | `6` | | [tj-actions/changed-files](https://github.com/tj-actions/changed-files) | `46.0.5` | `47.0.4` | | [lycheeverse/lychee-action](https://github.com/lycheeverse/lychee-action) | `2.4.1` | `2.8.0` | | [codfish/semantic-release-action](https://github.com/codfish/semantic-release-action) | `4` | `5` | | [amannn/action-semantic-pull-request](https://github.com/amannn/action-semantic-pull-request) | `5` | `6` | | [actions/setup-python](https://github.com/actions/setup-python) | `4` | `6` | | [actions/stale](https://github.com/actions/stale) | `9` | `10` | | [actions/upload-artifact](https://github.com/actions/upload-artifact) | `4` | `7` | Updates `actions/checkout` from 4 to 6 - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v4...v6) Updates `tj-actions/changed-files` from 46.0.5 to 47.0.4 - [Release notes](https://github.com/tj-actions/changed-files/releases) - [Changelog](https://github.com/tj-actions/changed-files/blob/main/HISTORY.md) - [Commits](https://github.com/tj-actions/changed-files/compare/ed68ef82c095e0d48ec87eccea555d944a631a4c...7dee1b0c1557f278e5c7dc244927139d78c0e22a) Updates `lycheeverse/lychee-action` from 2.4.1 to 2.8.0 - [Release notes](https://github.com/lycheeverse/lychee-action/releases) - [Commits](https://github.com/lycheeverse/lychee-action/compare/v2.4.1...v2.8.0) Updates `codfish/semantic-release-action` from 4 to 5 - [Release notes](https://github.com/codfish/semantic-release-action/releases) - [Changelog](https://github.com/codfish/semantic-release-action/blob/main/RELEASE_NOTES_V5.md) - [Commits](https://github.com/codfish/semantic-release-action/compare/v4...v5) Updates `amannn/action-semantic-pull-request` from 5 to 6 - [Release notes](https://github.com/amannn/action-semantic-pull-request/releases) - [Changelog](https://github.com/amannn/action-semantic-pull-request/blob/main/CHANGELOG.md) - [Commits](https://github.com/amannn/action-semantic-pull-request/compare/v5...v6) Updates `actions/setup-python` from 4 to 6 - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](https://github.com/actions/setup-python/compare/v4...v6) Updates `actions/stale` from 9 to 10 - [Release notes](https://github.com/actions/stale/releases) - [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/stale/compare/v9...v10) Updates `actions/upload-artifact` from 4 to 7 - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v4...v7) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major dependency-group: all-actions - dependency-name: tj-actions/changed-files dependency-version: 47.0.4 dependency-type: direct:production update-type: version-update:semver-major dependency-group: all-actions - dependency-name: lycheeverse/lychee-action dependency-version: 2.8.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all-actions - dependency-name: codfish/semantic-release-action dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major dependency-group: all-actions - dependency-name: amannn/action-semantic-pull-request dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major dependency-group: all-actions - dependency-name: actions/setup-python dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major dependency-group: all-actions - dependency-name: actions/stale dependency-version: '10' dependency-type: direct:production update-type: version-update:semver-major dependency-group: all-actions - dependency-name: actions/upload-artifact dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major dependency-group: all-actions ... Signed-off-by: dependabot[bot] --- .github/workflows/azure-dev.yml | 2 +- .github/workflows/broken-links-checker.yml | 8 ++++---- .github/workflows/codeql.yml | 2 +- .github/workflows/create-release.yml | 4 ++-- .github/workflows/deploy-waf.yml | 2 +- .github/workflows/deploy.yml | 2 +- .github/workflows/docker-build-and-push.yml | 2 +- .github/workflows/job-deploy-linux.yml | 2 +- .github/workflows/job-deploy-windows.yml | 2 +- .github/workflows/job-deploy.yml | 2 +- .github/workflows/job-docker-build.yml | 2 +- .github/workflows/pr-title-checker.yml | 2 +- .github/workflows/pylint.yml | 4 ++-- .github/workflows/scheduled-Dependabot-PRs-Auto-Merge.yml | 2 +- .github/workflows/stale-bot.yml | 6 +++--- .github/workflows/telemetry-template-check.yml | 2 +- .github/workflows/test-automation-v2.yml | 4 ++-- .github/workflows/test-automation.yml | 6 +++--- .github/workflows/test.yml | 4 ++-- 19 files changed, 30 insertions(+), 30 deletions(-) diff --git a/.github/workflows/azure-dev.yml b/.github/workflows/azure-dev.yml index 93aa7483e..d7bf2e320 100644 --- a/.github/workflows/azure-dev.yml +++ b/.github/workflows/azure-dev.yml @@ -15,7 +15,7 @@ jobs: steps: # Step 1: Checkout the code from your repository - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 # Step 2: Validate the Azure template using microsoft/template-validation-action - name: Validate Azure Template uses: microsoft/template-validation-action@bae4895d0a8abd4f0d5aad68ae8647b3027f4c91 diff --git a/.github/workflows/broken-links-checker.yml b/.github/workflows/broken-links-checker.yml index 51984487e..f62283392 100644 --- a/.github/workflows/broken-links-checker.yml +++ b/.github/workflows/broken-links-checker.yml @@ -16,7 +16,7 @@ jobs: steps: - name: Checkout Repo - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: fetch-depth: 0 @@ -24,7 +24,7 @@ jobs: - name: Get changed markdown files (PR only) id: changed-markdown-files if: github.event_name == 'pull_request' - uses: tj-actions/changed-files@ed68ef82c095e0d48ec87eccea555d944a631a4c # v46 + uses: tj-actions/changed-files@7dee1b0c1557f278e5c7dc244927139d78c0e22a # v47.0.4 with: files: | **/*.md @@ -34,7 +34,7 @@ jobs: - name: Check Broken Links in Changed Markdown Files id: lychee-check-pr if: github.event_name == 'pull_request' && steps.changed-markdown-files.outputs.any_changed == 'true' - uses: lycheeverse/lychee-action@v2.4.1 + uses: lycheeverse/lychee-action@v2.8.0 with: args: > --verbose --exclude-mail --no-progress --exclude ^https?:// @@ -47,7 +47,7 @@ jobs: - name: Check Broken Links in All Markdown Files in Entire Repo (Manual Trigger) id: lychee-check-manual if: github.event_name == 'workflow_dispatch' - uses: lycheeverse/lychee-action@v2.4.1 + uses: lycheeverse/lychee-action@v2.8.0 with: args: > --verbose --exclude-mail --no-progress --exclude ^https?:// diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index e6a86692e..56643c391 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -71,7 +71,7 @@ jobs: # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 0539e2ff9..618cdd0c1 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -14,11 +14,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: ref: ${{ github.event.workflow_run.head_sha }} - - uses: codfish/semantic-release-action@v4 + - uses: codfish/semantic-release-action@v5 id: semantic with: tag-format: 'v${version}' diff --git a/.github/workflows/deploy-waf.yml b/.github/workflows/deploy-waf.yml index a879b2000..814e7ca3b 100644 --- a/.github/workflows/deploy-waf.yml +++ b/.github/workflows/deploy-waf.yml @@ -19,7 +19,7 @@ jobs: GPT41_MINI_MIN_CAPACITY: 1 steps: - name: Checkout Code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Run Quota Check id: quota-check diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index e3550c5b3..b9adff429 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -32,7 +32,7 @@ jobs: CONTAINER_APP: ${{steps.get_backend_url.outputs.CONTAINER_APP}} steps: - name: Checkout Code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Run Quota Check id: quota-check diff --git a/.github/workflows/docker-build-and-push.yml b/.github/workflows/docker-build-and-push.yml index d9301a6d4..00c45d053 100644 --- a/.github/workflows/docker-build-and-push.yml +++ b/.github/workflows/docker-build-and-push.yml @@ -54,7 +54,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 diff --git a/.github/workflows/job-deploy-linux.yml b/.github/workflows/job-deploy-linux.yml index f941a2027..5754a6d51 100644 --- a/.github/workflows/job-deploy-linux.yml +++ b/.github/workflows/job-deploy-linux.yml @@ -56,7 +56,7 @@ jobs: MACAE_URL_API: ${{ steps.get_output_linux.outputs.BACKEND_URL }} steps: - name: Checkout Code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Validate Workflow Input Parameters shell: bash diff --git a/.github/workflows/job-deploy-windows.yml b/.github/workflows/job-deploy-windows.yml index 1ee301d5c..4d97360d7 100644 --- a/.github/workflows/job-deploy-windows.yml +++ b/.github/workflows/job-deploy-windows.yml @@ -55,7 +55,7 @@ jobs: MACAE_URL_API: ${{ steps.get_output_windows.outputs.BACKEND_URL }} steps: - name: Checkout Code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Validate Workflow Input Parameters shell: bash diff --git a/.github/workflows/job-deploy.yml b/.github/workflows/job-deploy.yml index 2046488e5..9da1cb828 100644 --- a/.github/workflows/job-deploy.yml +++ b/.github/workflows/job-deploy.yml @@ -287,7 +287,7 @@ jobs: echo "Final EXP status: $EXP_ENABLED" - name: Checkout Code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Login to Azure shell: bash diff --git a/.github/workflows/job-docker-build.yml b/.github/workflows/job-docker-build.yml index b62fdf686..8e93c96bb 100644 --- a/.github/workflows/job-docker-build.yml +++ b/.github/workflows/job-docker-build.yml @@ -30,7 +30,7 @@ jobs: IMAGE_TAG: ${{ steps.generate_docker_tag.outputs.IMAGE_TAG }} steps: - name: Checkout Code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Generate Unique Docker Image Tag id: generate_docker_tag diff --git a/.github/workflows/pr-title-checker.yml b/.github/workflows/pr-title-checker.yml index debfc53f4..9a3090fc8 100644 --- a/.github/workflows/pr-title-checker.yml +++ b/.github/workflows/pr-title-checker.yml @@ -17,6 +17,6 @@ jobs: runs-on: ubuntu-latest if: ${{ github.event_name != 'merge_group' }} steps: - - uses: amannn/action-semantic-pull-request@v5 + - uses: amannn/action-semantic-pull-request@v6 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/pylint.yml b/.github/workflows/pylint.yml index aa973c5c7..79f5904d3 100644 --- a/.github/workflows/pylint.yml +++ b/.github/workflows/pylint.yml @@ -17,10 +17,10 @@ jobs: matrix: python-version: ["3.11"] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 + uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} diff --git a/.github/workflows/scheduled-Dependabot-PRs-Auto-Merge.yml b/.github/workflows/scheduled-Dependabot-PRs-Auto-Merge.yml index 1cfc09759..e29507533 100644 --- a/.github/workflows/scheduled-Dependabot-PRs-Auto-Merge.yml +++ b/.github/workflows/scheduled-Dependabot-PRs-Auto-Merge.yml @@ -36,7 +36,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Install GitHub CLI run: | diff --git a/.github/workflows/stale-bot.yml b/.github/workflows/stale-bot.yml index c91575804..ea2d288f2 100644 --- a/.github/workflows/stale-bot.yml +++ b/.github/workflows/stale-bot.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Mark Stale Issues and PRs - uses: actions/stale@v9 + uses: actions/stale@v10 with: stale-issue-message: "This issue is stale because it has been open 180 days with no activity. Remove stale label or comment, or it will be closed in 30 days." stale-pr-message: "This PR is stale because it has been open 180 days with no activity. Please update or it will be closed in 30 days." @@ -24,7 +24,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout Repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: fetch-depth: 0 # Fetch full history for accurate branch checks - name: Fetch All Branches @@ -75,7 +75,7 @@ jobs: env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Upload CSV Report of Inactive Branches - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: merged-branches-report path: merged_branches_report.csv diff --git a/.github/workflows/telemetry-template-check.yml b/.github/workflows/telemetry-template-check.yml index 634b9d73d..ddf173926 100644 --- a/.github/workflows/telemetry-template-check.yml +++ b/.github/workflows/telemetry-template-check.yml @@ -14,7 +14,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Check for required metadata template line run: | diff --git a/.github/workflows/test-automation-v2.yml b/.github/workflows/test-automation-v2.yml index 07267617e..2664ec11e 100644 --- a/.github/workflows/test-automation-v2.yml +++ b/.github/workflows/test-automation-v2.yml @@ -42,7 +42,7 @@ jobs: TEST_REPORT_URL: ${{ steps.upload_report.outputs.artifact-url }} steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Set up Python uses: actions/setup-python@v6 @@ -135,7 +135,7 @@ jobs: - name: Upload test report id: upload_report - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 if: ${{ !cancelled() }} with: name: test-report diff --git a/.github/workflows/test-automation.yml b/.github/workflows/test-automation.yml index 0982bab40..5f7b5f896 100644 --- a/.github/workflows/test-automation.yml +++ b/.github/workflows/test-automation.yml @@ -35,10 +35,10 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v6 with: python-version: "3.13" @@ -132,7 +132,7 @@ jobs: - name: Upload test report id: upload_report - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 if: ${{ !cancelled() }} with: name: test-report-${{ github.run_id }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 428882567..e6b4833d3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -41,10 +41,10 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v6 with: python-version: '3.11' From 42b3e12ba6d5ad205f2ea071116249455d870c12 Mon Sep 17 00:00:00 2001 From: "Niraj Chaudhari (Persistent Systems Inc)" Date: Wed, 4 Mar 2026 14:21:24 +0530 Subject: [PATCH 034/225] Reafctor MACAE-V4 UI --- src/frontend/src/api/apiClient.tsx | 138 +-- src/frontend/src/api/apiService.tsx | 10 - src/frontend/src/api/apiUtils.ts | 149 +++ src/frontend/src/api/config.tsx | 23 - src/frontend/src/api/httpClient.ts | 246 +++++ src/frontend/src/api/index.tsx | 6 + .../src/components/common/TeamSelector.tsx | 10 +- .../src/components/content/HomeInput.tsx | 10 +- .../src/components/content/PlanChat.tsx | 4 +- .../src/components/content/PlanChatBody.tsx | 5 +- .../src/components/content/PlanPanelLeft.tsx | 8 +- .../src/components/content/PlanPanelRight.tsx | 4 +- .../src/components/content/TaskList.tsx | 4 +- .../streaming/StreamingBufferMessage.tsx | 4 +- src/frontend/src/coral/modules/Chat.tsx | 17 +- src/frontend/src/hooks/index.tsx | 5 +- src/frontend/src/hooks/useAutoScroll.tsx | 22 + src/frontend/src/hooks/usePlanActions.tsx | 91 ++ .../src/hooks/usePlanCancellationAlert.tsx | 3 +- src/frontend/src/hooks/usePlanWebSocket.tsx | 313 ++++++ src/frontend/src/hooks/useTeamSelection.tsx | 5 - src/frontend/src/hooks/useWebSocket.tsx | 6 +- src/frontend/src/index.tsx | 19 +- src/frontend/src/models/taskDetails.tsx | 2 +- src/frontend/src/pages/HomePage.tsx | 237 ++--- src/frontend/src/pages/PlanPage.tsx | 890 +++++------------- src/frontend/src/services/PlanDataService.tsx | 7 +- src/frontend/src/services/TeamService.tsx | 13 +- .../src/services/WebSocketService.tsx | 63 +- src/frontend/src/state/hooks.ts | 14 + src/frontend/src/state/index.ts | 13 + src/frontend/src/state/slices/appSlice.ts | 49 + src/frontend/src/state/slices/chatSlice.ts | 82 ++ src/frontend/src/state/slices/planSlice.ts | 282 ++++++ .../src/state/slices/streamingSlice.ts | 76 ++ src/frontend/src/state/slices/teamSlice.ts | 60 ++ src/frontend/src/state/store.ts | 42 + src/frontend/src/utils/index.ts | 20 + src/frontend/src/utils/messageUtils.ts | 48 + 39 files changed, 1979 insertions(+), 1021 deletions(-) create mode 100644 src/frontend/src/api/apiUtils.ts create mode 100644 src/frontend/src/api/httpClient.ts create mode 100644 src/frontend/src/hooks/useAutoScroll.tsx create mode 100644 src/frontend/src/hooks/usePlanActions.tsx create mode 100644 src/frontend/src/hooks/usePlanWebSocket.tsx create mode 100644 src/frontend/src/state/hooks.ts create mode 100644 src/frontend/src/state/index.ts create mode 100644 src/frontend/src/state/slices/appSlice.ts create mode 100644 src/frontend/src/state/slices/chatSlice.ts create mode 100644 src/frontend/src/state/slices/planSlice.ts create mode 100644 src/frontend/src/state/slices/streamingSlice.ts create mode 100644 src/frontend/src/state/slices/teamSlice.ts create mode 100644 src/frontend/src/state/store.ts create mode 100644 src/frontend/src/utils/index.ts create mode 100644 src/frontend/src/utils/messageUtils.ts diff --git a/src/frontend/src/api/apiClient.tsx b/src/frontend/src/api/apiClient.tsx index 88bc4d606..7eaab10f2 100644 --- a/src/frontend/src/api/apiClient.tsx +++ b/src/frontend/src/api/apiClient.tsx @@ -1,104 +1,52 @@ -import { headerBuilder, getApiUrl } from './config'; - -// Helper function to build URL with query parameters -const buildUrl = (url: string, params?: Record): string => { - if (!params) return url; - - const searchParams = new URLSearchParams(); - Object.entries(params).forEach(([key, value]) => { - if (value !== undefined && value !== null) { - searchParams.append(key, String(value)); - } - }); - - const queryString = searchParams.toString(); - return queryString ? `${url}?${queryString}` : url; -}; - -// Fetch with Authentication Headers -const fetchWithAuth = async (url: string, method: string = "GET", body: BodyInit | null = null) => { - const token = localStorage.getItem('token'); // Get the token from localStorage - const authHeaders = headerBuilder(); // Get authentication headers - - const headers: Record = { - ...authHeaders, // Include auth headers from headerBuilder - }; - - if (token) { - headers['Authorization'] = `Bearer ${token}`; // Add the token to the Authorization header - } - - // If body is FormData, do not set Content-Type header - if (body && body instanceof FormData) { - delete headers['Content-Type']; - } else { - headers['Content-Type'] = 'application/json'; - body = body ? JSON.stringify(body) : null; +/** + * API Client — thin adapter over the centralized httpClient. + * + * Auth headers (x-ms-client-principal-id, Authorization) are now injected + * automatically by httpClient's request interceptor, eliminating all manual + * headerBuilder() / localStorage.getItem('token') calls. + */ +import httpClient from './httpClient'; +import { getApiUrl } from './config'; + +/** + * Ensure httpClient's base URL stays in sync with the runtime config. + * Called lazily on every request so it picks up late-initialized API_URL. + */ +function syncBaseUrl(): void { + const apiUrl = getApiUrl(); + if (apiUrl && httpClient.getBaseUrl() !== apiUrl) { + httpClient.setBaseUrl(apiUrl); } +} - const options: RequestInit = { - method, - headers, - body: body || undefined, - }; - - try { - const apiUrl = getApiUrl(); - const finalUrl = `${apiUrl}${url}`; - // Log the request details - const response = await fetch(finalUrl, options); - - if (!response.ok) { - const errorText = await response.text(); - throw new Error(errorText || 'Something went wrong'); - } - - const isJson = response.headers.get('content-type')?.includes('application/json'); - const responseData = isJson ? await response.json() : null; - return responseData; - } catch (error) { - console.info('API Error:', (error as Error).message); - throw error; - } -}; +export const apiClient = { + get: (url: string, config?: { params?: Record }): Promise => { + syncBaseUrl(); + return httpClient.get(url, { params: config?.params }); + }, -// Vanilla Fetch without Auth for Login -const fetchWithoutAuth = async (url: string, method: string = "POST", body: BodyInit | null = null) => { - const headers: Record = { - 'Content-Type': 'application/json', - }; + post: (url: string, body?: unknown): Promise => { + syncBaseUrl(); + return httpClient.post(url, body); + }, - const options: RequestInit = { - method, - headers, - body: body ? JSON.stringify(body) : undefined, - }; + put: (url: string, body?: unknown): Promise => { + syncBaseUrl(); + return httpClient.put(url, body); + }, - try { - const apiUrl = getApiUrl(); - const response = await fetch(`${apiUrl}${url}`, options); + delete: (url: string): Promise => { + syncBaseUrl(); + return httpClient.del(url); + }, - if (!response.ok) { - const errorText = await response.text(); - throw new Error(errorText || 'Login failed'); - } - const isJson = response.headers.get('content-type')?.includes('application/json'); - return isJson ? await response.json() : null; - } catch (error) { - console.log('Login Error:', (error as Error).message); - throw error; - } -}; + upload: (url: string, formData: FormData): Promise => { + syncBaseUrl(); + return httpClient.upload(url, formData); + }, -// Authenticated requests (with token) and login (without token) -export const apiClient = { - get: (url: string, config?: { params?: Record }) => { - const finalUrl = buildUrl(url, config?.params); - return fetchWithAuth(finalUrl, 'GET'); + login: (url: string, body?: unknown): Promise => { + syncBaseUrl(); + return httpClient.postWithoutAuth(url, body); }, - post: (url: string, body?: any) => fetchWithAuth(url, 'POST', body), - put: (url: string, body?: any) => fetchWithAuth(url, 'PUT', body), - delete: (url: string) => fetchWithAuth(url, 'DELETE'), - upload: (url: string, formData: FormData) => fetchWithAuth(url, 'POST', formData), - login: (url: string, body?: any) => fetchWithoutAuth(url, 'POST', body), // For login without auth }; diff --git a/src/frontend/src/api/apiService.tsx b/src/frontend/src/api/apiService.tsx index 064154420..f6f6ba3d9 100644 --- a/src/frontend/src/api/apiService.tsx +++ b/src/frontend/src/api/apiService.tsx @@ -156,7 +156,6 @@ export class APIService { if (!data) { throw new Error(`Plan with ID ${planId} not found`); } - console.log('Fetched plan by ID:', data); const results = { plan: data.plan as Plan, messages: data.messages as AgentMessageBE[], @@ -190,8 +189,6 @@ export class APIService { const requestKey = `approve-plan-${planApprovalData.m_plan_id}`; return this._requestTracker.trackRequest(requestKey, async () => { - console.log('📤 Approving plan via v4 API:', planApprovalData); - const response = await apiClient.post(API_ENDPOINTS.PLAN_APPROVAL, planApprovalData); // Invalidate cache since plan execution will start @@ -200,7 +197,6 @@ export class APIService { this._cache.invalidate(new RegExp(`^plan.*_${planApprovalData.plan_id}`)); } - console.log('✅ Plan approval successful:', response); return response; }); } @@ -260,13 +256,7 @@ export class APIService { return response; } async sendAgentMessage(data: AgentMessageResponse): Promise { - const t0 = performance.now(); const result = await apiClient.post(API_ENDPOINTS.AGENT_MESSAGE, data); - console.log('[agent_message] sent', { - ms: +(performance.now() - t0).toFixed(1), - agent: data.agent, - type: data.agent_type - }); return result; } } diff --git a/src/frontend/src/api/apiUtils.ts b/src/frontend/src/api/apiUtils.ts new file mode 100644 index 000000000..f3872025b --- /dev/null +++ b/src/frontend/src/api/apiUtils.ts @@ -0,0 +1,149 @@ +/** + * API Utility Functions + * + * Centralized helpers for error response construction, retry logic, + * and request deduplication. Single source of truth — eliminates + * duplicated error patterns across API functions. + */ + +/** + * Create a standardized error response object. + * Replaces repeated `{ ...new Response(), ok: false, status: 500 }` patterns. + */ +export function createErrorResponse(status: number, message: string): Response { + return new Response(JSON.stringify({ error: message }), { + status, + statusText: message, + headers: { 'Content-Type': 'application/json' }, + }); +} + +/** + * Retry a request with exponential backoff. + * @param fn - The async function to retry + * @param maxRetries - Maximum number of retry attempts (default: 3) + * @param baseDelay - Base delay in ms before exponential increase (default: 1000) + */ +export async function retryRequest( + fn: () => Promise, + maxRetries = 3, + baseDelay = 1000 +): Promise { + for (let attempt = 0; attempt <= maxRetries; attempt++) { + try { + return await fn(); + } catch (error) { + if (attempt === maxRetries) throw error; + const delay = baseDelay * Math.pow(2, attempt); + await new Promise((resolve) => setTimeout(resolve, delay)); + } + } + throw new Error('Max retries exceeded'); +} + +/** + * Request cache with TTL and deduplication of in-flight requests. + * Prevents duplicate API calls for the same data. + */ +interface CacheEntry { + data: T; + timestamp: number; + expiresAt: number; +} + +export class RequestCache { + private cache = new Map>(); + private pendingRequests = new Map>(); + + /** Get cached data or fetch it, deduplicating concurrent identical requests */ + async get( + key: string, + fetcher: () => Promise, + ttlMs = 30000 + ): Promise { + // Return cached data if still fresh + const cached = this.cache.get(key); + if (cached && Date.now() < cached.expiresAt) { + return cached.data as T; + } + + // Deduplicate concurrent identical requests + const pending = this.pendingRequests.get(key); + if (pending) { + return pending as Promise; + } + + const request = fetcher() + .then((data) => { + this.cache.set(key, { + data, + timestamp: Date.now(), + expiresAt: Date.now() + ttlMs, + }); + this.pendingRequests.delete(key); + return data; + }) + .catch((error) => { + this.pendingRequests.delete(key); + throw error; + }); + + this.pendingRequests.set(key, request); + return request; + } + + /** Invalidate cached entries matching a key pattern */ + invalidate(pattern?: string | RegExp): void { + if (!pattern) { + this.cache.clear(); + return; + } + for (const key of this.cache.keys()) { + const matches = typeof pattern === 'string' + ? key.includes(pattern) + : pattern.test(key); + if (matches) this.cache.delete(key); + } + } + + /** Clear all cached data */ + clear(): void { + this.cache.clear(); + this.pendingRequests.clear(); + } +} + +/** Shared request cache singleton */ +export const requestCache = new RequestCache(); + +/** + * Debounce utility — delays calling `fn` until `delayMs` has elapsed + * since the last invocation. + */ +export function debounce void>( + fn: T, + delayMs: number +): (...args: Parameters) => void { + let timer: ReturnType; + return (...args: Parameters) => { + clearTimeout(timer); + timer = setTimeout(() => fn(...args), delayMs); + }; +} + +/** + * Throttle utility — ensures `fn` is called at most once per `limitMs`. + */ +export function throttle void>( + fn: T, + limitMs: number +): (...args: Parameters) => void { + let lastCall = 0; + return (...args: Parameters) => { + const now = Date.now(); + if (now - lastCall >= limitMs) { + lastCall = now; + fn(...args); + } + }; +} diff --git a/src/frontend/src/api/config.tsx b/src/frontend/src/api/config.tsx index b7609e7ee..d3b216eec 100644 --- a/src/frontend/src/api/config.tsx +++ b/src/frontend/src/api/config.tsx @@ -52,9 +52,6 @@ export async function getUserInfo(): Promise { try { const response = await fetch("/.auth/me"); if (!response.ok) { - console.log( - "No identity provider found. Access to chat will be blocked." - ); return {} as UserInfo; } const payload = await response.json(); @@ -97,7 +94,6 @@ export function getUserInfoGlobal() { } if (!USER_INFO) { - // console.info('User info not yet configured'); return null; } @@ -105,7 +101,6 @@ export function getUserInfoGlobal() { } export function getUserId(): string { - // USER_ID = getUserInfoGlobal()?.user_id || null; if (!USER_ID) { USER_ID = getUserInfoGlobal()?.user_id || null; } @@ -113,24 +108,6 @@ export function getUserId(): string { return userId; } -/** - * Build headers with authentication information - * @param headers Optional additional headers to merge - * @returns Combined headers object with authentication - */ -export function headerBuilder(headers?: Record): Record { - let userId = getUserId(); - //console.log('headerBuilder: Using user ID:', userId); - let defaultHeaders = { - "x-ms-client-principal-id": String(userId) || "", // Custom header - }; - //console.log('headerBuilder: Created headers:', defaultHeaders); - return { - ...defaultHeaders, - ...(headers ? headers : {}) - }; -} - export const toBoolean = (value: any): boolean => { if (typeof value !== 'string') { return false; diff --git a/src/frontend/src/api/httpClient.ts b/src/frontend/src/api/httpClient.ts new file mode 100644 index 000000000..866709c34 --- /dev/null +++ b/src/frontend/src/api/httpClient.ts @@ -0,0 +1,246 @@ +/** + * Centralized HTTP Client with Interceptors + * + * Singleton class that wraps all API calls with: + * - Automatic auth header injection via request interceptors + * - Uniform error handling via response interceptors + * - Built-in timeout, configurable base URL, and params serialization + * + * Eliminates duplicated localStorage/header logic across API functions. + */ +import { getUserId } from './config'; + +type RequestConfig = RequestInit & { url: string }; +type RequestInterceptor = (config: RequestConfig) => RequestConfig; +type ResponseInterceptor = (response: Response) => Response | Promise; + +class HttpClient { + private baseUrl: string; + private requestInterceptors: RequestInterceptor[] = []; + private responseInterceptors: ResponseInterceptor[] = []; + private timeout: number; + + constructor(baseUrl = '', timeout = 30000) { + this.baseUrl = baseUrl; + this.timeout = timeout; + } + + /** Set or update the base URL at runtime (after config is loaded) */ + setBaseUrl(url: string): void { + this.baseUrl = url; + } + + getBaseUrl(): string { + return this.baseUrl; + } + + /** Register a request interceptor (runs before every request) */ + addRequestInterceptor(interceptor: RequestInterceptor): void { + this.requestInterceptors.push(interceptor); + } + + /** Register a response interceptor (runs after every response) */ + addResponseInterceptor(interceptor: ResponseInterceptor): void { + this.responseInterceptors.push(interceptor); + } + + /** Build URL with query parameters */ + private buildUrl(path: string, params?: Record): string { + const base = this.baseUrl ? `${this.baseUrl}${path}` : path; + if (!params) return base; + + const searchParams = new URLSearchParams(); + Object.entries(params).forEach(([key, value]) => { + if (value !== undefined && value !== null) { + searchParams.append(key, String(value)); + } + }); + + const queryString = searchParams.toString(); + return queryString ? `${base}?${queryString}` : base; + } + + /** Core request method — applies interceptors, timeout, and error handling */ + private async request( + path: string, + options: RequestInit & { params?: Record } = {} + ): Promise { + const { params, ...fetchOptions } = options; + const url = this.buildUrl(path, params); + + // Build initial config + let config: RequestConfig = { url, ...fetchOptions }; + + // Run request interceptors + for (const interceptor of this.requestInterceptors) { + config = interceptor(config); + } + + const { url: finalUrl, ...rest } = config; + + // Timeout via AbortController + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), this.timeout); + + try { + let response = await fetch(finalUrl, { + ...rest, + signal: controller.signal, + }); + + // Run response interceptors + for (const interceptor of this.responseInterceptors) { + response = await interceptor(response); + } + + return response; + } finally { + clearTimeout(timeoutId); + } + } + + /** HTTP GET */ + async get( + path: string, + config?: { params?: Record; headers?: Record } + ): Promise { + const response = await this.request(path, { + method: 'GET', + params: config?.params, + headers: config?.headers, + }); + + if (!response.ok) { + const errorText = await response.text(); + throw new Error(errorText || 'Request failed'); + } + + const isJson = response.headers.get('content-type')?.includes('application/json'); + return isJson ? response.json() : (null as T); + } + + /** HTTP POST */ + async post( + path: string, + body?: unknown, + config?: { headers?: Record } + ): Promise { + const response = await this.request(path, { + method: 'POST', + body: JSON.stringify(body), + headers: { + 'Content-Type': 'application/json', + ...config?.headers, + }, + }); + + if (!response.ok) { + const errorText = await response.text(); + throw new Error(errorText || 'Request failed'); + } + + const isJson = response.headers.get('content-type')?.includes('application/json'); + return isJson ? response.json() : (null as T); + } + + /** HTTP PUT */ + async put( + path: string, + body?: unknown, + config?: { headers?: Record } + ): Promise { + const response = await this.request(path, { + method: 'PUT', + body: JSON.stringify(body), + headers: { + 'Content-Type': 'application/json', + ...config?.headers, + }, + }); + + if (!response.ok) { + const errorText = await response.text(); + throw new Error(errorText || 'Request failed'); + } + + const isJson = response.headers.get('content-type')?.includes('application/json'); + return isJson ? response.json() : (null as T); + } + + /** HTTP DELETE */ + async del(path: string): Promise { + const response = await this.request(path, { method: 'DELETE' }); + + if (!response.ok) { + const errorText = await response.text(); + throw new Error(errorText || 'Request failed'); + } + + const isJson = response.headers.get('content-type')?.includes('application/json'); + return isJson ? response.json() : (null as T); + } + + /** Upload a FormData payload (multipart/form-data) */ + async upload(path: string, formData: FormData): Promise { + // Don't set Content-Type — browser sets multipart boundary automatically + const response = await this.request(path, { + method: 'POST', + body: formData, + }); + + if (!response.ok) { + const errorText = await response.text(); + throw new Error(errorText || 'Upload failed'); + } + + const isJson = response.headers.get('content-type')?.includes('application/json'); + return isJson ? response.json() : (null as T); + } + + /** HTTP POST without auth (used for login) */ + async postWithoutAuth(path: string, body?: unknown): Promise { + const url = this.baseUrl ? `${this.baseUrl}${path}` : path; + + const response = await fetch(url, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: body ? JSON.stringify(body) : undefined, + }); + + if (!response.ok) { + const errorText = await response.text(); + throw new Error(errorText || 'Request failed'); + } + + const isJson = response.headers.get('content-type')?.includes('application/json'); + return isJson ? response.json() : (null as T); + } +} + +// ────────────────────────────────────────────── +// Singleton instance with interceptors +// ────────────────────────────────────────────── + +const httpClient = new HttpClient(); + +/** + * Auth interceptor — single source of truth for userId header. + * Eliminates repeated localStorage.getItem("userId") and manual headerBuilder() calls. + */ +httpClient.addRequestInterceptor((config) => { + const userId = getUserId(); + const token = localStorage.getItem('token'); + + const headers = new Headers(config.headers as HeadersInit); + + if (userId) { + headers.set('x-ms-client-principal-id', String(userId)); + } + if (token) { + headers.set('Authorization', `Bearer ${token}`); + } + + return { ...config, headers }; +}); + +export default httpClient; diff --git a/src/frontend/src/api/index.tsx b/src/frontend/src/api/index.tsx index 462775bee..c88cde5fd 100644 --- a/src/frontend/src/api/index.tsx +++ b/src/frontend/src/api/index.tsx @@ -1,5 +1,11 @@ // Export our API services and utilities export * from './apiClient'; +// Centralized HTTP client with interceptors (Point 2) +export { default as httpClient } from './httpClient'; + +// API utilities: createErrorResponse, retryRequest, RequestCache (Points 6, 8) +export * from './apiUtils'; + // Unified API service - recommended for all new code export { apiService } from './apiService'; diff --git a/src/frontend/src/components/common/TeamSelector.tsx b/src/frontend/src/components/common/TeamSelector.tsx index 9c9aeadd4..2709d550e 100644 --- a/src/frontend/src/components/common/TeamSelector.tsx +++ b/src/frontend/src/components/common/TeamSelector.tsx @@ -116,7 +116,6 @@ const TeamSelector: React.FC = ({ try { // If this team was just uploaded, skip the selection API call and go directly to homepage if (uploadedTeam && uploadedTeam.team_id === tempSelectedTeam.team_id) { - console.log('Uploaded team selected, going directly to homepage:', tempSelectedTeam.name); onTeamSelect?.(tempSelectedTeam); setIsOpen(false); return; // Skip the selectTeam API call @@ -126,14 +125,12 @@ const TeamSelector: React.FC = ({ const result = await TeamService.selectTeam(tempSelectedTeam.team_id); if (result.success) { - console.log('Team selected:', result.data); onTeamSelect?.(tempSelectedTeam); setIsOpen(false); } else { setError(result.error || 'Failed to select team'); } - } catch (err: any) { - console.error('Error selecting team:', err); + } catch { setError('Failed to select team. Please try again.'); } finally { setSelectionLoading(false); @@ -243,7 +240,7 @@ const TeamSelector: React.FC = ({ let teamData; try { teamData = JSON.parse(fileText); - } catch (parseError) { + } catch { throw new Error('Invalid JSON file format'); } @@ -344,7 +341,7 @@ const TeamSelector: React.FC = ({ let teamData; try { teamData = JSON.parse(fileText); - } catch (parseError) { + } catch { throw new Error('Invalid JSON file format'); } @@ -563,7 +560,6 @@ const TeamSelector: React.FC = ({ placeholder="Search teams..." value={searchQuery} onChange={(e: React.ChangeEvent, data: InputOnChangeData) => { - console.log('Search changed:', data.value); setSearchQuery(data.value || ''); }} contentBefore={} diff --git a/src/frontend/src/components/content/HomeInput.tsx b/src/frontend/src/components/content/HomeInput.tsx index c46849185..4dd2a2ac2 100644 --- a/src/frontend/src/components/content/HomeInput.tsx +++ b/src/frontend/src/components/content/HomeInput.tsx @@ -100,7 +100,6 @@ const HomeInput: React.FC = ({ selectedTeam }) => { input.trim(), selectedTeam?.team_id ); - console.log("Plan created:", response); setInput(""); if (textareaRef.current) { @@ -117,15 +116,14 @@ const HomeInput: React.FC = ({ selectedTeam }) => { dismissToast(id); } } catch (error: any) { - console.log("Error creating plan:", error); let errorMessage = "Unable to create plan. Please try again."; dismissToast(id); // Check if this is an RAI validation error try { // errorDetail = JSON.parse(error); errorMessage = error?.message || errorMessage; - } catch (parseError) { - console.error("Error parsing error detail:", parseError); + } catch { + // ignore parse error } showToast(errorMessage, "error"); @@ -290,4 +288,6 @@ const HomeInput: React.FC = ({ selectedTeam }) => { ); }; -export default HomeInput; +const MemoizedHomeInput = React.memo(HomeInput); +MemoizedHomeInput.displayName = 'HomeInput'; +export default MemoizedHomeInput; diff --git a/src/frontend/src/components/content/PlanChat.tsx b/src/frontend/src/components/content/PlanChat.tsx index 81193d747..2a61e21ce 100644 --- a/src/frontend/src/components/content/PlanChat.tsx +++ b/src/frontend/src/components/content/PlanChat.tsx @@ -108,4 +108,6 @@ const PlanChat: React.FC = ({ ); }; -export default PlanChat; \ No newline at end of file +const MemoizedPlanChat = React.memo(PlanChat); +MemoizedPlanChat.displayName = 'PlanChat'; +export default MemoizedPlanChat; \ No newline at end of file diff --git a/src/frontend/src/components/content/PlanChatBody.tsx b/src/frontend/src/components/content/PlanChatBody.tsx index d91b37286..210b61b76 100644 --- a/src/frontend/src/components/content/PlanChatBody.tsx +++ b/src/frontend/src/components/content/PlanChatBody.tsx @@ -1,3 +1,4 @@ +import React from "react"; import ChatInput from "@/coral/modules/ChatInput"; import { PlanChatProps } from "@/models"; import { Button } from "@fluentui/react-components"; @@ -74,4 +75,6 @@ const PlanChatBody: React.FC = ({ ); } -export default PlanChatBody; \ No newline at end of file +const MemoizedPlanChatBody = React.memo(PlanChatBody); +MemoizedPlanChatBody.displayName = 'PlanChatBody'; +export default MemoizedPlanChatBody; \ No newline at end of file diff --git a/src/frontend/src/components/content/PlanPanelLeft.tsx b/src/frontend/src/components/content/PlanPanelLeft.tsx index 437fb1ed0..ffa48b9da 100644 --- a/src/frontend/src/components/content/PlanPanelLeft.tsx +++ b/src/frontend/src/components/content/PlanPanelLeft.tsx @@ -1,3 +1,4 @@ +import React from "react"; import PanelLeft from "@/coral/components/Panels/PanelLeft"; import PanelLeftToolbar from "@/coral/components/Panels/PanelLeftToolbar"; import { @@ -56,7 +57,6 @@ const PlanPanelLeft: React.FC = ({ const loadPlansData = useCallback(async (forceRefresh = false) => { try { - console.log("Loading plans, forceRefresh:", forceRefresh); setPlansLoading(true); setPlansError(null); const plansData = await apiService.getPlans(undefined, !forceRefresh); // Invert forceRefresh for useCache @@ -67,7 +67,6 @@ const PlanPanelLeft: React.FC = ({ restReload(); } } catch (error) { - console.log("Failed to load plans:", error); setPlansError( error instanceof Error ? error : new Error("Failed to load plans") ); @@ -92,7 +91,6 @@ const PlanPanelLeft: React.FC = ({ useEffect(() => { - console.log("Reload tasks changed:", reloadTasks); if (reloadTasks) { loadPlansData(true); // Force refresh when reloadTasks is true } @@ -265,4 +263,6 @@ const PlanPanelLeft: React.FC = ({ ); }; -export default PlanPanelLeft; +const MemoizedPlanPanelLeft = React.memo(PlanPanelLeft); +MemoizedPlanPanelLeft.displayName = 'PlanPanelLeft'; +export default MemoizedPlanPanelLeft; diff --git a/src/frontend/src/components/content/PlanPanelRight.tsx b/src/frontend/src/components/content/PlanPanelRight.tsx index 484425788..6072b471e 100644 --- a/src/frontend/src/components/content/PlanPanelRight.tsx +++ b/src/frontend/src/components/content/PlanPanelRight.tsx @@ -136,4 +136,6 @@ const PlanPanelRight: React.FC = ({ ); }; -export default PlanPanelRight; \ No newline at end of file +const MemoizedPlanPanelRight = React.memo(PlanPanelRight); +MemoizedPlanPanelRight.displayName = 'PlanPanelRight'; +export default MemoizedPlanPanelRight; \ No newline at end of file diff --git a/src/frontend/src/components/content/TaskList.tsx b/src/frontend/src/components/content/TaskList.tsx index aadb626c0..4a26f027f 100644 --- a/src/frontend/src/components/content/TaskList.tsx +++ b/src/frontend/src/components/content/TaskList.tsx @@ -98,4 +98,6 @@ const TaskList: React.FC = ({ ); }; -export default TaskList; +const MemoizedTaskList = React.memo(TaskList); +MemoizedTaskList.displayName = 'TaskList'; +export default MemoizedTaskList; diff --git a/src/frontend/src/components/content/streaming/StreamingBufferMessage.tsx b/src/frontend/src/components/content/streaming/StreamingBufferMessage.tsx index c3bd7c560..6c611754c 100644 --- a/src/frontend/src/components/content/streaming/StreamingBufferMessage.tsx +++ b/src/frontend/src/components/content/streaming/StreamingBufferMessage.tsx @@ -225,4 +225,6 @@ const StreamingBufferMessage: React.FC = ({ ); }; -export default StreamingBufferMessage; \ No newline at end of file +const MemoizedStreamingBufferMessage = React.memo(StreamingBufferMessage); +MemoizedStreamingBufferMessage.displayName = 'StreamingBufferMessage'; +export default MemoizedStreamingBufferMessage; \ No newline at end of file diff --git a/src/frontend/src/coral/modules/Chat.tsx b/src/frontend/src/coral/modules/Chat.tsx index e178cc105..d7516f96f 100644 --- a/src/frontend/src/coral/modules/Chat.tsx +++ b/src/frontend/src/coral/modules/Chat.tsx @@ -62,8 +62,8 @@ const Chat: React.FC = ({ } // const chatMessages = await chatService.getUserHistory(userId); // setMessages(chatMessages); - } catch (err) { - console.log("Failed to load chat history.", err); + } catch { + // Failed to load history — silent fail } }; loadHistory(); @@ -102,8 +102,8 @@ const Chat: React.FC = ({ }; const handleCopy = (text: string) => { - navigator.clipboard.writeText(text).catch((err) => { - console.log("Failed to copy text:", err); + navigator.clipboard.writeText(text).catch(() => { + // clipboard copy failed — silent }); }; @@ -150,8 +150,7 @@ const Chat: React.FC = ({ // const assistantMessage = { role: "assistant", content: response.assistant_response }; // setMessages([...updatedMessages, assistantMessage]); } - } catch (err) { - console.log("Send Message Error:", err); + } catch { setMessages([ ...updatedMessages, { role: "assistant", content: "Oops! Something went wrong sending your message." }, @@ -169,8 +168,8 @@ const Chat: React.FC = ({ // await chatService.clearChatHistory(userId); } setMessages([]); - } catch (err) { - console.log("Failed to clear chat history:", err); + } catch { + // clear history failed — silent } }; @@ -195,7 +194,7 @@ const Chat: React.FC = ({ icon={} />