From 6fd406679ee49a510a4c976577472df4b1923b63 Mon Sep 17 00:00:00 2001 From: Ankit Singhal <30610298+singankit@users.noreply.github.com> Date: Fri, 11 Apr 2025 09:24:37 -0700 Subject: [PATCH 1/7] Add files via upload --- .../ai/evaluation/_common/onedp/__init__.py | 32 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 787 bytes .../onedp/__pycache__/_client.cpython-312.pyc | Bin 0 -> 8630 bytes .../_configuration.cpython-312.pyc | Bin 0 -> 5150 bytes .../__pycache__/_model_base.cpython-312.pyc | Bin 0 -> 61510 bytes .../onedp/__pycache__/_patch.cpython-312.pyc | Bin 0 -> 805 bytes .../_serialization.cpython-312.pyc | Bin 0 -> 88988 bytes .../__pycache__/_validation.cpython-312.pyc | Bin 0 -> 2124 bytes .../__pycache__/_version.cpython-312.pyc | Bin 0 -> 240 bytes .../ai/evaluation/_common/onedp/_client.py | 139 + .../_common/onedp/_configuration.py | 73 + .../evaluation/_common/onedp/_model_base.py | 1235 ++++ .../ai/evaluation/_common/onedp/_patch.py | 20 + .../_common/onedp/_serialization.py | 2050 ++++++ .../ai/evaluation/_common/onedp/_types.py | 21 + .../evaluation/_common/onedp/_validation.py | 50 + .../ai/evaluation/_common/onedp/_vendor.py | 50 + .../ai/evaluation/_common/onedp/_version.py | 9 + .../evaluation/_common/onedp/aio/__init__.py | 29 + .../evaluation/_common/onedp/aio/_client.py | 143 + .../_common/onedp/aio/_configuration.py | 75 + .../ai/evaluation/_common/onedp/aio/_patch.py | 20 + .../evaluation/_common/onedp/aio/_vendor.py | 40 + .../_common/onedp/aio/operations/__init__.py | 39 + .../onedp/aio/operations/_operations.py | 4613 +++++++++++++ .../_common/onedp/aio/operations/_patch.py | 247 + .../_common/onedp/models/__init__.py | 96 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1689 bytes .../models/__pycache__/_enums.cpython-312.pyc | Bin 0 -> 4417 bytes .../__pycache__/_models.cpython-312.pyc | Bin 0 -> 49298 bytes .../models/__pycache__/_patch.cpython-312.pyc | Bin 0 -> 812 bytes .../evaluation/_common/onedp/models/_enums.py | 171 + .../_common/onedp/models/_models.py | 2027 ++++++ .../evaluation/_common/onedp/models/_patch.py | 30 + .../_common/onedp/operations/__init__.py | 39 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1008 bytes .../__pycache__/_patch.cpython-312.pyc | Bin 0 -> 10648 bytes .../_common/onedp/operations/_operations.py | 5856 +++++++++++++++++ .../_common/onedp/operations/_patch.py | 245 + .../ai/evaluation/_common/onedp/py.typed | 1 + .../_common/onedp/servicepatterns/__init__.py | 1 + .../onedp/servicepatterns/aio/__init__.py | 1 + .../aio/operations/__init__.py | 25 + .../aio/operations/_operations.py | 34 + .../servicepatterns/aio/operations/_patch.py | 20 + .../buildingblocks/__init__.py | 1 + .../buildingblocks/aio/__init__.py | 1 + .../buildingblocks/aio/operations/__init__.py | 22 + .../aio/operations/_operations.py | 29 + .../buildingblocks/aio/operations/_patch.py | 20 + .../buildingblocks/operations/__init__.py | 22 + .../buildingblocks/operations/_operations.py | 29 + .../buildingblocks/operations/_patch.py | 20 + .../servicepatterns/operations/__init__.py | 25 + .../servicepatterns/operations/_operations.py | 34 + .../servicepatterns/operations/_patch.py | 20 + 56 files changed, 17654 insertions(+) create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__init__.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__pycache__/__init__.cpython-312.pyc create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__pycache__/_client.cpython-312.pyc create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__pycache__/_configuration.cpython-312.pyc create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__pycache__/_model_base.cpython-312.pyc create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__pycache__/_patch.cpython-312.pyc create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__pycache__/_serialization.cpython-312.pyc create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__pycache__/_validation.cpython-312.pyc create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__pycache__/_version.cpython-312.pyc create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/_client.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/_configuration.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/_model_base.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/_patch.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/_serialization.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/_types.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/_validation.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/_vendor.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/_version.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/__init__.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/_client.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/_configuration.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/_patch.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/_vendor.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/operations/__init__.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/operations/_operations.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/operations/_patch.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__init__.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__pycache__/__init__.cpython-312.pyc create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__pycache__/_enums.cpython-312.pyc create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__pycache__/_models.cpython-312.pyc create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__pycache__/_patch.cpython-312.pyc create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/_enums.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/_models.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/_patch.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/operations/__init__.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/operations/__pycache__/__init__.cpython-312.pyc create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/operations/__pycache__/_patch.cpython-312.pyc create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/operations/_operations.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/operations/_patch.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/py.typed create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/__init__.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/aio/__init__.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/aio/operations/__init__.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/aio/operations/_operations.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/aio/operations/_patch.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/__init__.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/aio/__init__.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/aio/operations/__init__.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/aio/operations/_operations.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/aio/operations/_patch.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/operations/__init__.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/operations/_operations.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/operations/_patch.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/operations/__init__.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/operations/_operations.py create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/operations/_patch.py diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__init__.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__init__.py new file mode 100644 index 000000000000..0a573383b516 --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__init__.py @@ -0,0 +1,32 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# Code generated by Microsoft (R) Python Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is regenerated. +# -------------------------------------------------------------------------- +# pylint: disable=wrong-import-position + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from ._patch import * # pylint: disable=unused-wildcard-import + +from ._client import AIProjectClient # type: ignore +from ._version import VERSION + +__version__ = VERSION + +try: + from ._patch import __all__ as _patch_all + from ._patch import * +except ImportError: + _patch_all = [] +from ._patch import patch_sdk as _patch_sdk + +__all__ = [ + "AIProjectClient", +] +__all__.extend([p for p in _patch_all if p not in __all__]) # pyright: ignore + +_patch_sdk() diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__pycache__/__init__.cpython-312.pyc b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..49ed044dbce1ef3a9d9ea1715971e47bc9065cae GIT binary patch literal 787 zcmYLFOKTHR6h3EWGMP!*w56#al7(0-DMsA5FqJ}xL8DMheL#niOUPW)X(uzoo#`W` zg(`@ff{%@M;a(_$f1ztvJ{B@qv51TALbV{$g=dn6UYIlA`Of*yckcbr-=6|HN0(mM%(kmATq#ZWpp;Ut=>p;DJ>B=xwe zI#N?J^iK6elO#56^bxBy(9pOxf2L=B^5^(+gYfBj5rnUwzq|LNK zm37$0t_DE@-nV@`0HLLy1D+ZMkw9pGq0hqRSRAJ?P^wM~Z=Tn~vSV{MBr18oGIOVTdn$&E)f|U0g1TP|>vJry z7KBRrseC3?pm}8`ayh!OaH=h(YzOsfmw4G0$RnK;l4-N>Z0J?SRiTP zp(hG{E1dIOlTx#0AJ=Mj!S7x^D0nWn{GQS_d%W4@8M9qGWbC5finOau&suc&q!^(s z;!T283T+t?53_)0_vFEE%IRM)x(m4{I^AOMG4YI8gio6MK+)()YJL4BGGkAZEV~4L`ma+hvaq gGB7w1lqwSLTW>@fx$IOqZ&?z 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 literal 0 HcmV?d00001 diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__pycache__/_model_base.cpython-312.pyc b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__pycache__/_model_base.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c619fb32b7e38f6e862f1c1696ed50f717284ec4 GIT binary patch literal 61510 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

0EqE1pbHM4G-wHwK>Vga=JD<-pVr{6vj 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 S-ntZT4?dFpO%%~Vi}45S5cKK* literal 0 HcmV?d00001 diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__pycache__/_serialization.cpython-312.pyc b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__pycache__/_serialization.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..53db87f4556a78f97972ecd558701c0ae94ede98 GIT binary patch literal 88988 zcmdqK33OZ6nI?#x009ypK@!{v?gUp!lw^upDU#Yn*&-#&v}79MgCtU1IuE1qD<9E@C-VD5cRaG+kN`D&zT03ao^qEUH|)U_rHIgk&&*$^LJZ5InQ_Mb^o4T$?01g3`dy=0{aK^g{n?}Le)nijf6i!bf9_~rf8MC4 z-!q!upFdjAU!d37s3zu-!qKAsBI!$|qh*7r;i$L2Tnee^uRtoxNabi%e-#T$8>t?x z>8}~B?XP9;){(kVUw^$`7swbsDR+VTJN%gHmwlY=jr5y(@vXlpkRNCcxXu|05YXRZ z(Cyc8_UCk*<0g8Kp8gF6T_AnF6%jc{~lJ)Y}C`O)U$)jL5jUBCKoYzN=zr` zK};8y54W2ufV+eND%oCw=O>M916INDle0NYgf>!C}-W)vFbpc(! zp40UkFx19jIZl(F(U4u?3u*m^%GAlakssY4kY~&g1^eYTE<+RLv80=*E$uLDmo9P~b|)*HZVm zziFzW`Aoy<2H)=C;P_ZoB8yXcEWizL{*b>XVWOXeV{m*d6c`H)geETq5*9uXn&8I< zjhfb4;HUR{hu~ha!g$;6UKF_8L(U`MmxKQ?~zhR};y?~Kn!xeoH(DS_RX&t}K2Kc(B zH!9?ON^fMN9o2HE`pczhdn4qNV}|QxpZcqaAZ&aSk_5H|MeLS;&fW4K)Q ztG{ad<$TWqs)UN=6o4+}(SuaB+lw6}J*{Ih6 zW=&~g>*UzsM%kzSqAok9O`P>P-L%=D3!5=Vq&a;Wvw7Mwoffw6Y2ma%!(-SV>C0$; zvz&i;qwG_EIh$O9UfWa3Zk4JHz6}50;Imx}q#{jL z-77sEgM)!fA+O&X4DkW~sCWFFlsD+T92gmC^q!pvc`px*jCjumyd&d&&g&0($HxW( z-k~w?Xkc`lpY)y^=e=X&mo=pxJcocapKKHh5#fP1bRj?=q^dm~;Ddm<-ny~zkoW9l zC=hH!-jGxupIX!QOMV^|q?WaN4~|`$2sPph6C)hejAitq9#S*v42Q3WE_hG$ z?Q8QA zwP>F5wR^|U4hII+iX}`K5^l=IHk+p4(0QI9MbDJ`Q17uG?@$m!@H93puHF00bi#OL zbcD}C{Gb9*@j{@}jsJTO!?{k#mR<$8!xFGXl=6giH>LdN481xm3v>wUK`PVx*;Hry=@Zy$gQxvt7lRo6 z)5ims#_={a!3RXQDac)H!h~wNG#R=uK6VC3o&GUe z9-8{flaDQJnhUN3CjrF zp-TzVz}{m=6LzZ7!13<=-KQQ-m`DAg!3%sPl~qL!Z5ljHu7m{xhS)^f#MltS=qw^S zm$3EtN5zSdFm(4N(y3?Z1HjYLANKP>DK2f`$g%zVyN@TVgZxkk*vCjB9hKxmL0Yyx zYr;4<5@ZvJFQM<*2?z}Mg9B7$V}R#*0?>)H-~^yqFqp8jq2>d@iIGr{dO%)~d@ZHR z)pVXZ*i+RHG$&{w1z*B^zN-7ASm$uhZl23qv3oyodtNfkb$x4B%v~e6YohMDnXV7) zxwG6$-7EHrcwyQ7CMDqc2*x zY3A@+g7qu1{T?ns11Dnj@}el#%J4 z4Zr8{&GSM={i>lPW1oK2WX>wM<0+r7dLwPcv*B*d##l|8P}8wlF)*PC%e`3|; z7ha#fHa-7%)Uz?-+PGS;%Pfp#R0$bX^N+4%G{xPe5l88r%!)|mfmr1+q4HSd;nUH| zGttZ^BGxB9{bavhms5&~PBqG_k2LIwHS8A}_TMr_8;;x>jOHDWoO(Rsdi-;&0VMhS zlWbjnIg)1;+|J2ISXRO3s6tNO^_|yteynq&&L5|nvKl^e=;}5vc13Hq39hQyw7H_& z?!tIc&HFhupQP)u@?$Qq;POVwcdxkiu&-{9=IvOnjJUc#U#+D=J`46^l-_pdbmi&Z z-c-?T)V-6F)19q*H_z6sGrn6^+_l~K?shZ$KQY?6oyMOy42by{fh>ph zK-whu->aL{`z-!RRH#eE>%FvCy$AaG9`<4-T^b(?YVihuacP(Ik8xh93kc8XIo9W$ zK%{?c68WB*2n0jH7XQ%rg;3}cZLOCt_(K6~`pV`Pyc8H5IyW@v9U8qf5*P*Tz=#iZ zcRV2WuZTbZKL`alhH_MBQJRYT5Cw4$R|iVmh3TD;9Kt}=2>nX$gMKtL1Lp%{pmzs@Q_Wur2G^wj1Ny=lIM@w~b@|0Jj<~&G z?oq*B6)&oo-z5}niWRj9MQuy&Xwl9kzfiO%RHzUOT|(5zKCOA-08lD59nUk_xQ3B)`5XB>?#8TiS&Vi(Q$5K zg#3jRg1&$eM6;9_#7rKGiqS({Z#rVILgv2ZN&lpcoua z#3D~rB5x;$ZI-mX^R#SOzw$&a@(1C(uHz4ppY{=+Xffs-fG7AzaGuiv5W7oeE3VgH ztB;iIi)Qb?O7K0W_Ue(lX4glCPQ7_RzmUIJy<}N7ETs#ZIt5?Xs*VLm`c6mAJSp_~ z<@eD`AB!>fj5-{P02gpT7vTkon4fsrQy;_vY2$Mnwf zeq?}8tT|PB%2u~~NBQZ~zSGTXpcc(I2DPX+u7g|+8wd;Z>8Jj$4)4Xlq&LL-$AYxk z2Y^FkA!7*0ySkfj+>r1l1rz3u#SZvQiP^`cTq%X}}mL&@MfS9>6pmOiqmv z^V8n1%^@PqUSPr#K%og4XI?RhvMR;;PY}|n)==|x2?IwhSw_AWJ@C3QVMLV^Hl;oZ zGb=ktoun+NT%|Pwn*QM*Lz*AsKS<02ERJklhHEx=W=F*2VI#4o=M|<1@d&{bfh#_# zb^v0O(C%<%D(rF7Q}FE~v|F>MmZm6)vbb{YJ* zssH`}BYbWGbl`D7;Esn6viWeyAG#oseZMWkJOU;k0eB2t5E~JVw_M}kB=(jo;>OZ0 z4LBtiN1V9Epk%BA`;K(<^>z2~`w);Qz&s?BmIw!NS`Uo+FAbn{pP8pD{G;TYqO>OZ zWbC*xHX;9|A9FZfq7YUZDMKf|}US#Y#1RY&Z5BBnjRe$Uayp!^?YZ#J!&S5y0`9+w`xKVJh;DtG&b@K zkeB?2{~eD{&(nDDC*Z7I<;7IWx`TKY>Eo2A8V(!8?B<2R#cfN0Xja$n9J<;$lN)z9 zXARHqpFI(=7e!1(_rm}ava+$7hX>GC&*z5?eBPJP>okf4xAEvPZeW~Bs~y-Qm6-H! zNI!)zj=5nS`DOS3w$vBqRe1y06O2>KonTLdfaysTESCb}hy3S7m<*2w+N!LSOMKwm z&=oO_=x3`@15L&xoQige;3fZ{v|VUfD83=NM!SY^8f|`o}m})ONlfoE8v0=El60zDkcnL!L_r)H899JV*pbsq0yW`Ayaq9W0xypINjk@{X z8_f%?LSb{%*%Gm~+_7i8*#3O`?BF+dM@)s{ltFRILkJ5!_x>{mP8Bqqz%uSP4(a+$ z0dv5@{?kM;g6IaUoPiKUq_C}PI~N1$g&zd1!?vP#CZf zI7FR_@RfXxxTQGYBHlXWaFntDDZk*0tciXiPwN@v@&kALL8X zhdpcfl7w2@@qcd@o47;3H3{yDPgvijJ97K zm_JF6yyxk4FSN2WgzP3gpwl~$J4H-bq}_=iNP0K}sCTKZUs^k0U|(9hXG2c;6NHJ= ze$B8xY0pOezh%-*>U`#&sqNKZ1_v1z(eJ$oUi_E_$ptdR$Q>^d(Xh&_@uBl$<9vWi zSc%I#J~lGBZ))Rl$*akZTuC{I^)HtQ=3K6ydQEZ@KYe~BWD=L29G27%NAxgsud5CU2LDa!Z+oV6epbl=d}P-tLaDwECo zX8Ha9rlc>xxvGor?wB#HSSx;&<(cV-J6&_8Sbl?mKWD=om*=|knls`(6B&3ia`s&8 z>?PssrT1M=#j~s?Lx!$r4FHCSFB;L(6D#8{no@v!wIE;-pGlQ zkyEE*r_Kqd&b{wC|AEUhXPWcR=Pl@8DR|%2@KJ^?JD&l!eKzxcF9m32Mp%?3PI>y&AO#Nvm2w^`Tki-i?@NK{{rXWTP0c0q+ZBQe_ zk+xuoykZRzw`nPa$&^^ZY%>*6Dv=ySI(`BYqI1e8>GNO)`A0Nq#clfR__!Ll51Vm4 z`h|ZQ4pI6XI57hQuN(MD3VjAnkUCSwtStirfu}Gd9P*5yHz=&=f@nVG!zYKB7{>h>r^?P16>Uw z`Okh!I-2AI5761bb-#}0@n3_J+^b{Ysi?h5Z*J<gkJ-e9(JL)WtSj)elel%5xMN0tuB?8NMPkuOt>o8!O&`nvN5!b*p zYDqL;!bEeKC#oHFCBXN(o^j%|Rjvw*kv7UeN@xjr)fh=?r|QM_JV@FyYHU6}c2#$G z*PdJT!qyWr#+bEGuogy&Hoa$Uy}!*Sq-OJ)FgFqhrf#iXM_N811#BszKSg2=(ceDE z{;)&|;bn+GhfE+d!5{z6@C9x29YaAeEyG!|#b#>5DyccdSHlD|8EplimtH*bjU(Wm zxpF@J#H@3XoWWLb+f9N4TY)4{b2xP`+KP;Ss4p_EK`?0JXD$7kFKj7vMTkUZ4*)5l zB}oquiPUI>)I00s(jWutq%f)If{caEwYM^01i>w4!XxQ@#u8&+Bnb{A)kjp!t_L}__`@+7(&L19m^GMX&vHZ|a zx4*Uh)|JR(XQG`?M4mh!d-9_2C$@3+im;a6Z(u^U< z@T{XFSNB$~y`$3jR)rpJBI9Bpa0!&Xhy<HP#4W4m$8rzFSXapI+9^Lp&>xvWHk$!5kzT~LikyXB^bczz4CYYgc}IxIq(NW z9F}!ClpPdRg8;-Y3{9b|42y*nTgjayg|R6yQ%-SVC;{7OMeIfyz+duodER+b%-be- z+oIm~Xzuoz^tiKXW-8{a5}Z|WhwCGw!Id8OHm$PXjSsQ+Rh_|>&cJ_P!kNTyT*DtE zzB8NPPr~yXOmGt>xM{r!PBaUr$Ce6x2Wg7$!ww`(albe?Y=YB-ffkR_1)RjWC4pBn zH!*riGi5rsr%8Q*lK9UDyrVe^7}b{}ib@opG<#_uWgk$=rFATJ7Dzc+1k&v7oZxxD12mZgp?>Ifcxwp{ zsTGx-@F}H)(I9c3nRXH*0c%k=HJMjtkc(Oy9MxPEzn&z)id^?W@tb1Psn!hoh}e*3 zjA-)#LPqq3*coV|OhmHw-nXFFd=g8aI!fwCY7>KHUSifail0QEpw+=4aN1Dzg`oiN z=Lav4>WI>4G#UCItm8CQ>kWtyBy<7nKyToRpQO&DN+p(i4iZDnG-*;tOUtxZzR~3U zB4DaX_C?%db(Uyh-ft&t6*;%(CdLMd;-{IS?U#1%{qh1itvaJ5wK(u~{~iDu2*(^? z7K79L@52Y=M1{UAiZK%Y08z;TnKWr9l&J^l^&kP>y+{whdr1GKkXMAb6&sgJL>PSh zR1)k>jgWHq%KE5xDtRA~CNdX*GZvtNKwAMw#b=mcc+wMQQXJx+rQ(1M6U0w?WYh(6 zL?a}LU>-w~h)*%ekP-4kh2s@Ag%ovYxmH2_3!bnsZ2Ferg(4HwV5gA-XtOKnBX|v) z!Mn4ENNtQgoFbikRu6K-+>7r*DvA8l#>=FCs3=T>2+4+oBXy~|A^o)ZF_vFNlzS5T z<`2=^I#HFPs0Va$$3zHBFTg^k?*Q=y$MylAoj;0%P*@jrD~v%%^3t%yL%Sfzh|q+2 z2%3XIkv;KGsZc_DnG#&W)_sMvXt5xC77-1G`WjEl3E;CPEaER?X(jYeCo)71trQ)k z;bYr|sGq@q8}CyEB2JJ3;UJnS_!me+WRlgkAzo1Ya_NoISV6N;(7X^_?1&a@U3^L? z*fw+MPHz77$FDs;Unt}@&g_dfZ~or+>*KNJPNBJTrMY{h_>9op{R%hlUK!bsnV zl}8_c|KRDlN9Of6`XbHUGe?EuGjV73i{a9_CzcpwJ;pL3F`}^SKm`chbLV40d zY}PmQDn$mo{1m$UVbWH_HjHtVa1+|0x~|IXF%_HMH$tCQ9WpKR$L|lUwBY z(Wx6H5R8%%^gNiq4z*OMGtnv#2}?<*sh9#NX~Ln(C7^akLrBX<?Td4+4G!2elJNnT)gx{U$gxj)!Ea@I0iz^AIsH*mK@EhG`i#4JgbC!n-kn9dZiw zmo)p5CUA#AoxqGD67?d^4?P`VTR6}lsbw2bd9wx(6Lx z{tc=E<2so|g+~S)SSUdV{!if~<9s%z)lUO26WmI`|3pyX5##|>s7nDA!0&dIg3bMj zO_#Opj;r;KtL>vSQ%2^hLznGcb?R)nE7nQ~_+7;*fybJii#UvI=lXZ>5Z4)t7{25O zNRnX)QU&!4+IqVcp@TQk0D7PZw$7eLsfJT=JtYl_iM$k6bp8! zx#!LtypxqXJ17bQ=Yv9CLo};##sc&zR^Sr~d<&JpuVMvTgn})W=TII;4rnV-Mfb!TQiJo9b zFLTvc*$0|Mt%C*hhaqecr#ek{F=vQGEbJLBl6~qgXGR$*YarKBuOq6ZSBC`w7ZgpN zoEsEP4G#EyartQDmzDpR^aX|TvG|>s=baY<;C~UCDhli6bw%PDQCkEm`rw)11RYBd zfb>`1%^wYj3|{bQL^T26wqRh5L7ELRi1TX8N+C36`zsbIJ2fCmjY)QoBi3vSRz4$b zu`Ic?z{S*Jjin$pxq_<_gGo$-8iI33OeIY+5z%A`lu!nBdU!v2f2y@tRAG_$SWt1m zc_})wh_0biPS1CyetZ5xG6 zz`^d!gfP(P5WAlLA$`CuE9{`WM27sr;AbM2?aZW?D(9iECURuBDRl^=FoFb2q!}Wj z+cuFGK6GwU-c*%`t2*wjd(H8RBhs{Y zxhv{D_?~y<)~R2d{@LkBe;{)HV)W?9wTutE8y6dvg0bC?2)iGN96uxMhLq?+)H^hr zaobr;y7->!JFe}R-}#<tnUsh1%^)hi`eJwU0zxRjUST77iTY(9=Up z8A2tFE9`$SXFoJ^v+_k9l2h!1!?E*0;e2q#6^grZK`GCquWr#5@7J$x*16m>>7Ra* ztIPL(3~l|wJ2^$yk6k+!&p#T^ua4&zz3jN*_$1AgoA*(=F1K(Mk}jlQ%|*)3f&|Ro zNlWW&GrZGQ-&JdVw?+?ljaZ5(1cpS+zypc{uK1*c$6tUFBrQ93Gi>Q=)tq4Bq9-kiK>DxEr(H72tN*@g!Ix#>_Q1`y8b-71y_C~C| zzkbiz%Lw8>&E9PSgR~Uo!KB7Mrcv>_p{K`JE^@7i*Twh1NkEZ;8y|#17GY^TO)OFG zf|h#1IWWLZn=&dth(t`M>k=g*z2St3;1KS=cL@9I7> z7|d3zrIw9XkIYuh2Isow-SdO<`8RqZo_Zm>A!^zX->~Uw&urJ6dyboLT`uK+@Uxn&H&@Kz_!52qdn{QW8}#Or`g`Jm9`dr#RfE}_ zGuQXA4nI;He4sllSsxkf=1DmNc|R)5G^fvpR(1GU3bLQ&&^>xvtSB3oFoA(?aiJ<-)1gGnb5!iXBUXk%|tXVDBm=MW4CzR&C@<*QICPvy-n+ z&pw`RE|Dq(-)g=Tc33}$FQ=Oi>lf>mTHkCE{kJxM%)*omhxIH6%0H&>)yHeIL~Gnb8#`mW`{Nc};f{E(1;cr}eBwCX%%bHQt) ztE>Q4&5!LABYle{+Qn*TG3QBv@U6O7Sf$x5g~7K9-ahqfnz>KRE_%h;MRRHm-=0=6 zgSDWKL~I=^HTltU=$UT(FPQ*dJUZfqN+wDF0IkNnYt>~*mQU~!TqWqnv1FH3%xh$P z9P&#MG=hl&Sr<#p2L=P+r9eLyC!r+CmIi8y0F#v^iQw2lPWsGRo;SmcR7goEl~`dW z0F+`yObP|D_bJ2aX8t9#9+q&@_`szRsN+N9=_Eolx;{KXO6L4Wf@*|!0|{{HpwP4Z z`R%h4bAwTPMZ{FWdVCPE%9A1a?!AYMsy;huvji8rM5$X)Y7w^; zxr@1n;FbhR5!&{gUZ&vt%Mh|nlgo?ucFlV^-nVPsEAYNU^InPfotpP5yzkPySL1!R z=Dh~*do=I0c<<1>*WrDy=G`}0=j-CXg%O?t-<%x`mNYR$F0(5A=bPCclrRpBh4{Zl zhJ^VXEK7vetV>#xY+Y`KXD!$DrnEv+VMB6vC8-%6Kp`;aq`#t>#tG|=5&!5}&cAEQ z-K*$vz$Szk_}^%5(?)hx_k+Qu^6#Jf;mDgKKNw?^I$=Bta~Q_Hi9o{mC{(PCeHSJY z#(n%y!q^Kt3C7-uG2rUNHR1mV&WGgtkXrL0ftwGB%ljei#R=mfKg!t`IExbfuyxRJ z3C>afBqAmdacE)$VH4+3V&GE3c#I5Y^^8BAFm?q7eGXPO|8GzZ|9_D4Z^^k!&fmiM zkhb^_t>n=D`(Zjcc5)nW*5I2;UlT%+y063fi)e(@tLRDNNMP)B1HXa{3H{_6ZLs$d zma<2!DB&J`{HpHN*7>LYWa~o5ciTlEK^-JN4_2Elr8Yd_2>gG8^I+Am;bZ)-DbFD| zYdV6e!6qHmk{yuMHd{ne9{fY;)Lt5ZtGappe8+dq5B5P#%jlHqS7@1?TK0F8=Yd*Q zsCMC3{E$P_vW*M+?{0mt4`SbtX3$sd$_#4Re^1%62b(U)FMs+gPM1t-t2ApX=ly?D zv#{~I_4l{;!K$Gd+pky+C-neWT`9&^5l|7vuU)>Wj@E#mt0gE+$ddHPj4jf77j?Cb z{4u2AH^NDzo#;8(d917ZD@;olsxB!qzqsAZzddxQLY@gZg4K`{MSYJm}A)2~qbEUJAjGG5ieqRYnbJpG3I zjo!tqn{=t@>u#SQ^KLm}c9@t-iJO|QZMuo0{qO@r;DEf0uR}3Cr#V6H#)WoKk zi<(%P5=oCHmcVS%qlu-xFX_?5Qm-aGnpkR0(xZt@!N%6a(iBK~G_g5JQFsL_I4@^!XbFi_&q4ev>rIEKCG3GdwOOuR zuv?>(r6AXaDSv@>j-)$_lHdZp^k47InXU13+sH2AXE zvvRGbv(`!JgvO|}W~Z~)N#oL_aj%mmOEbp1!fw7U)Fk)JaI@@Ff5X{f#l$uYUuUN> z+ZuL&nvJgm zvrT^RZE1w`y0K5zl+h@s9d46->aSd5ew549%+L%j2V*P2U8t-a2|I_|)m*Y~c&F@B zf4N+_Cet|~I_$!paE=_x<*^l3%;gSu$g%2gIEVAlIt*u>H^@1{&H)8#jHOXOtMBNI zPBpjeThkk(s*z>nrO}q!HJuykzCTAeR~?UaN>^HlzTOquFPHK4Ou5F;(*V*sofpmv zJE6bqe8CDG0q3+QY@5yxXCk&-ip@vgW`*-p!W55O8ng^NVb~W%9#1%5^5wr!X#%`_ z;SWu8*we=J4;17L`Ufzkk3Ej4m!t=Vr1hx`Q_E0Bo)Od5$Ef_zW!(elHyn_QLixqh z1)5n_5F)+h>ys&LbB0#)}>JG%oCt1LnGf*0FCgh1QeM}m^lu}anC5AnH<-UyUT%abm zYTK-lorXy#sU$tJKCj%WWNlulu`HMwrqyVOtQ8z6c&;p!5I+Dka}NE>4r%P`VdBGt zMLY?}2PuN69VR~De-}O#H)o$57z{x#^`BA_tOOnZd*qPv7CVfZFp&)QGwUH*!nP+m_muKh*1lPbak30Y|6wF?Q2^Gq)7Iu$0E5zIyIMx@PqtTYSg1tOWQa8pNZ(TCQ+KvcqN1}yC zXPoi;(wEb3q|fhO?2hKQ&t$~yxeq}W)7_y4(e^KER5*EnM3i)rdVaGP}v%*+;Yu1YnmN` za?h;owx?>LFy`AW_;$y9uzA@T&ncPX?->pC+5a&+_gdxb@O*VNyKdENsP{oCoLh3& zT^#W~^q%{nrGv`>VaJik!^hv-aXd~$1^;BC*wcz*HU)^A&?TDJW(^R3M2o`)mHACK0bzTt%3mZ3Yf z8yBno(zH^$^G0a7YkBLO>2B+e*?p0s79nRtylm54C|0&fDBA>MZbP>$!meXNS%0MW zF}Sk_{vFD$YX^TM_ea5xiR#hnH(sya(eA zTVf46goYhUCznq}8+zug@#317dv5eBv@M=mDc*Iv80J>BWyG7e&K-K`7{XzReEz}@ zOe;lOkR?{!BosF-TzJ3up*tnD3)UZ0{ILGb`jwKM=yY$*8;>qNww!)zZ?p-GJQi|%Hj8mw|!9V zTd4XMrE?weI^ROu{Pc|jP^YcffGSou&Dr8L8|Li4Dz8R#nRmf1l(oja4KeQ~!HXeU z@$QV*ZCosW-7$ACUcY70|9bO{!>cx3Ma{22f_>wvt*Z|kbgsgPwcyiF{P5+IO$j#B zW4?C52UVNp{#f^Eq5E{S`-!M;Ad0CEYZFhxboFtAF24e&o3cvDq;};>?Y0$9dpy77 zzZiA-+hO1u5oF9dtL#>eSz=hkGTpIbRM6d4Xh&rL+LpPuQw zlU+668_o7D1Yw5eb4-0(>t{jIuz7ovxyPb=$FbLTtW@`tyv~Puwi5iXe!tyDZVMAZ_{aD@os_(MzK4jejv*2J0voxqDJrNkF)T&X-F}=i5;XwGJl(ozGT|Km zhzK&VThryO{_lqyi|6D{D)(Tp({a=s(i!f-9Tl4I$kr+dpV#2g+8$C;e`b38%rnzH z{AP6UzNvx}%%l(_047L}TROJY?)ByJL~!yO2&1}8J`o!o3PSytVQHcY-FAw9f#QiT z#GA=^9ZsSwwV5IgW)#@TZ~o6H=^NyHkDNuyHJY>KoVytO%6@^HjjxN5Kf zh^u%IZYFS)zB(M)*!gbXN)6DTtc-sBowA07u2|zvp>b!lY}c#<8`U0tw|>^K;@WZB z-Sk2J9_$XSd9z2}&uPI01_e9r4HY^qZMeuaYnt*Y+ z%4R|@e*O8c&xPh66P()?Yv4qz+dloIm2F%mTkCCSxmcMKD>aAXO|7w}T|(2Yr7Mwx zkH-#P5Ds359vqG~T@+mPcbhgvT=lgd)6)IF~*;_G@hc&qiDD}wJ> zH1FZa$;TqD$JmVx{kTbi=Ee8Sdz*D{rFFPFH|gGP-qqP+e5YAY?j~DTzVV&y`CV?~ zyKXc5YYs-HAuHQUzKw3DBkv40A~5*@1T`{tqKOQJfTeDPG!!tD&s9aYsaWe_vkZrj z$CT=P6LuVYn;ySZE zcdEK@mN(MW^w=Yj13N{g*an>r5W0NYqVAQPby$(U$!WkA(_HQ#*CK2Iq_$04zGl%t z>U95AR8mEqxu*iFXLLrNXoxhkp^59#5sN|pG{IIW2z*C_aFK&PVggBnaZT$oALfGLD#=Rc|`2mZGHN9 zZryBOEVoX`ty{=hm=tn5m-fMd83NFv``&X_+$kt|x$s8e{Jv;G!>k2I<(LuV#;CJ) zVYA?Dxl>R)ck(+$vp9fPChEe!abmIcW`DGxEmp8cDA=>?em8Kd^PS;n!6UO408m%n zOa`oe71FgjTfg(nV)jbG=4%#!Vv1n)Y|MIBZ@rY1jt!Py7pk#P}7GN{?d_{RK`h~m$}>471a?Ub0| zyiF9Wz($_*hsDz^soM6C!o zx&UA9I`d=BO2Jt<-?`$fi&r-1*IDBIcovW#^s*f`psv63jby>bl2V% z-CHoTh@ZDxY@G$hx7&(4bByognBh+iL&<)x2tzqNln~ru0}iF(035sA#0v2i@TjYR zoiK@E#!<9%7#uRNn>SOQq)&o*7Qj65Xz-WemKGVJ0pC(^wy+Ya9DOr0GerutWiTmC z#qGG1xMfP1l*VZ3w6CRUFf@z*3c5p?Q7JJrnNk!lsk)zYITQf!+k=~l=+plo zjB8y;BzA}bfMC?w{5ZPrOpgd>{+d7w!5LsrNpOV;QWWfpff=85eH2U2XhgDe3cA(xRS+oR8$E07@aVpg(UEPsz5%|svd!drYnt3B$>!bdDt}-WhnE;zKWU? zD?c4AOL|a79>dR4#EC}x!}@ciPbnF~L@gajMc_3R2M=G=r!s}0(1<1#`+;FLnuP3; z<9Uy2ZXlI97T}Nx_dH8D7tADpKgbj-aD5>C60eWoEoz*iZD@Dly6tB9Q9f`}&RnQd z)rERxPJowHb&a#OpFsI4v7tiQd(HqDTRDw8M}Q-i$f4lPmdSqgm%cBzPKM`<64obC z!dCyAYv8PO9i9kp*9i9M&J0|!Aqu*s3x5@Wu~y9gk4D^zz*3QNs|LAfYZxL6nOfeX zh8C9$dOaAUQv8Yxk^ToL3&@su0dX5iw*t4}(z!2OLXC6AqV7Tx#@aJg+%qm&ai9xO zM3YvENEyczt${IUvxD0pYSsHOHyBPi)vPj4gEG%jED3k$mh;nOIhJT_@vYgHCEEJ4 zcEWyO4{SZ~?U*o3(w}fD1q?7P0G{j~Xn3zof8Z2_F$U|mPzS9h0o9OaTL;@jn0%jc zOQroIi8{Bj7E#p_HqsboItPp!$`jxH{tIu}Ry9>14;+{=YJF*5WP$t)QuUam+Tohn zaVNVtQnEdoy(8k-v1-b-9mX!>{`M8YSr+#ctt(A#AZc=g-~l&u(Ibyu|*tReXx`Xzg>B*_zR zfLscPvAwcZdn~4uhT0f)Rhw+NIOYwZM7HT1jqWhXX%vZ`%a-U7fRQlkr_= zX;+i+-6k{qYfemJivV=t+1qS~03>1RoRy7&vi5bXuaA-3+i!Qu$I-Ra}rY2m=tfqFb58$yNY8%%aNu zsirD4Yhax;57A;cj#|M&RB^@2hi)8-)b3fXh!%IpiVq6K2XFbJ#eI+;-?kUW-Bl4s zRotG%?&!KOZ(gz2uk;1ZlTjZE$VYE_kleB3KI?bI23V&Ri0yZyy32>lvmX{5U_bg;gAu{gB zHWLCs>Q17h4JvoOK%XrMkkkFY1j;oe%ERNqAT!D?nu%A9X*Y=<6&0$qL(Np!2q|x5 zM!xAzjWb?mE*`2@q5&Q{>rMv1DUQInI#HC3x(R|fnsux`N!dw*Xr0NZnrc>ede$B7 z-eYI!V*2}(@zgHTaLuU$Wi38*BeBgTemIoVsP+WcsrH)OS}nfhy-{hFMA)>eP3EMM zl_Vl*V&tI?p-X5Ew#aw4n*y*5B->tFyY=uyizb^}dkSGwh06GAHy754yJnB`zrmeZ@C)Is%on0Pc}&lCcr=!|)|PjFG71143!kLl1Qf zccES}KBl`2Tf~}0qE|)rGBOG9iAx)hik2^Xv;YyW3<91)_lQ@C)RT{t<@qh-klX@W z!w&M(1YC1s=^2`C#VMzo)Y3khZ~^24I+Ja*WznTi?bq5Pj*?IBI7>(fkagSPB2ItS zXR8*At%T5us#nv%iUTVxzj)TZirYhcp8y4L&u;$aWW<`!cwaDWtVd#Z-fZYw+um~& zQwb%XF+IU&?U}mYvlSX|=nIX1oV7#umpL77<6GH!xNCS^#ARpjp7a9O99z}UvdR>* zt5c9uVEwb8*izB691aZ0Ihjm>q_0U22i}*G#&TWyAIhf$_uKj7-6jpb@&1j?4lOx?psG1LQ`g54rj+R&YJcGXQ0g=|jwAO5j_+jf%^H5ddgW%SlBIP@ zb*d>8Re9$aIIuYCgK;}Ej^1^te3`II5Cd3M8rvq6oB-ub(>6`JZK~O3rHwey zka{Jl8UeJ`aOP>-*K9b-vn={lp08w5E&Z}=Tn#>-%MW!$4MwIS27EqS`ygC8M>DfsJy{84)8 zq4epX1e8kB-Ob_w2FE!V`efI(leu9-U?hA%X#o#}w#xQx2Et1#v&7hL6$iY@b1v5GB11vH$1rh8jKdxebUgjU$NKSKK59&p#Nu6x60@B^R^omZ%q84cPZ=pCzmT$T5$Dz z_pPa!Ly?01zqM!H-hD7yaOg)Md#3x!*jSdv3@2}S;m{Q3H5LDS5kyLMM3 zr$(^Xyk2wH8M;?kT$-z7~ewho@oYz-@O?yaE@OQ% zc8U{Dago4Kr8?llhj(4F4Lr36UENvov6Ct$*NM zgQb{oP0ijsP(OeFPDOFb z{*!8xQZp;b*#6U#>Qo@~KiC%X3OZQaLWp1#&$=-(lkGAWDVFvT-0wGWwp-kz#qGo) zZYOjU4Ts+3hH3T_ww2J-hh{owa|!zIj<+9Os*1HA721#93PeskA+!%g&R&2!n?AQW zRmlp{MYXgGWQp(@(0QR6O2-T;&szjf?aYA>V4(TH;sr8hx7>EC zFS_-3r0;aB?@6KW$%vm>S?(K&7LCpviI>*JN}Gk!=3ka>xRyR^oIMe5+xcz7^^9v7 zb0Z6#QP+m|U0cBSEZcb3T?XKIR|1Y@5^UU^1RL9TB~|#Bu7?iDIs2^Qs@+A(z9+U#Oq0Vq*78!cGqc< zH>n7`N~KiZACpuU+IrbD44z2xBbDMy4o@Brj2S_iq-U6L+@wd|bHH2BQq%fSvz$_UQ6b4<~AXZw2-_COPxpY3vCtX9q7BA{0IGLU=1D!|X$DW_0>*R4sKS`&E&fa_E% zeofu2wLJrNY@1v%Xm}3{cz}zB9{ti*;H1FFymcVi)=JH3 zR}tmqKC-yZz8Dwoa)> zkFPB0W(4u*KNGW)kO5cilBF$C-0edEV-)kWze6h&hQ!EJ7hgdU1?1pv4d|zkQwt|y zqi9^nhePev6j(%oX)u&ZM#uO%3Sy_Fet?-G9*!azJpX-iULmKEk}!gF7x_Bi$QoYk z;QCWYl(3>zVhz{g2?--2Qi$fM(5WJ2)@Y?CV*mV%(1Oj3V8lHNB%B97`;I*qgyUY4 zPOjK%5ioQ3j@vV5`d0glHEws4e7zRCxj=EXbY8qxaM!{FI2UW)B{buJkkEWUaQEKY z2M22J$nxze!CsDnq@(4bsJk)ZXrzeX^SfENPjKT{Zq(fpakNnQm6)eaz@NR2MOO>% z>Ul2eZiqMu;`j<`b23EElL6+;gukD^kX>}1t-CdLxde2@I zFDL@3Sz7V(@QvX=9uaYwRf93BQy<^eyTrwI^$NRsBYlqvyST`iLAbMr=ur3;p=`_I zV6?3Ly`1g9tjZd23L&QyVum&4{>oD{YoyW&;$$POTF9x6)NG&UVl~@^n(a%SLd~J& zt#IDYIgCQ`i{(P@II|VuLjgN^tY;P4oAmK0K5nF_&v8Em9Z=S172M9rr?7(07%ll% zh1CblhM(qC9H=wgGM5~vHs7k!lUrvyu-Sa8RS$O!7DaRiW}WUHu}7E)Ev07dw1Mpx zq+x}0^xzDu;Xc8d8KKb71tiUvVI?4`LPY`|KLxCc_Jf1i4{+Vhuvpj{Hx(@;?_sL0 zt!n)9i_+6BgbPdCQh!P0zJjvC1xjCoh6JcooJiBqZ01xaaKnU?Npzsx8(|~#d08nc zZx_}*r>dEDkqF8q&Kme@xMP`weWcsN)Q_NHstU*$)H#425kVdyUg9Ahi)b@r90R~F zQD^|ZL^{(DVudEmxJ(f@7LtClxNV4RDjw<9Ax0=Onym}|3G#p#F&S-z@!W#z{nz?u z_N`j1wj=u6SZF6#9MFI$m^u3CCpO%VM#3>l_Kkfc7c2an6h;eip#f6=sG1c2g=;Ns?+li&OL>tBzy?1{Sf#EYuM3u0n94YZzWv7mEz%yiQ^`4h~1 zLe-KL<`bgXdv6&dj>Dg?+Nt!;uJ-p9)(X6u7e-47^krB80%tZc3jr_ze!!Oqda7^Jdatr4x()0`+(TA|&G zlm@wIVi0Kn{-q1oz0T!)^XoBZHS~{haw}q$bX>GuOW$Q(I|t8$cdaV%WY-v*kvZv6 zwSiNucCD;4WxSbFI5!x+w5fltG@LQNp<)4hO#iPBT*B-R4h{_^^g9#!hJ?N;p>Ij( z2cQ$B45xU|`{(E!pHUrHFsqp=02d@kj+HMi`vw}~)aZsdV+v_}JCKEque*4z>su|c z>^dR4Zow1H-Z+yMcjmn~{rvP?Z`4^HbNU1)ZpK>(MxCuO=XSw~4Q<&Sb#_Or-J)uS zb|z3w*i6WWC-qEV3+W|wBqa1q#)L5>Od~V}qAKEXUv(L=(v($_lKUhUtfawp7Xqr! z{{dRIX7vyTxsGCjWZAZw`ZiPUTUYLEA3Ip{n|IWl+EIiVd+VSJ;v-=lCNI6T`tI*2 ziu#JM23cCDe5DUk_0yUJ=%g3W9rt$AKr4$QavM#JPJEC}4OMXFE{wSq+GD0G?kI~nY6M5keCV~wS0)#$$iC4M_u~sc zx)62jpMf5;YsUHo)5(Hb{C{jZrMxSXFU7$N!#Y!0VHm1&^d{O(&r}AGaB+$nrxw*I z+6UtKH=Uw1d_;UVlk-)9&zH?rDs$~z-89|K=BnsUS(@1!OphpYmj5nVE6-OdK$@>m zSl|;DSh}CUbhZQoxL%!0*hhy3`El`ue+?PePFvzFtTSz?KQbT;*&SH%MUp`o5+m0p=mP=ZaGGMN&HlkL}M%NFFx z@VuxTbN`-4+@`4#r3bWVwVeF~%@R5!kYbi7e3zN7JI*`_<-)$$60x@256Bb^!#~DX z*Qecsx#}*N%2t<(eG~Pb3V*(d+R`(P6Jx0;V%26zs`G0&caSaS*Sg}#vs5w(O=)@B z9HJkk5lWf#NTn&~#?)w}Pa$hSD4BgodJyVO3c~A6NjA&49m@O%FC%N(sPYO_3Wf0k zjKopU@B++Jca&M-?UI1xnq_f(Unjdg;Q{dg0yuv^_?qg}tvIiNQ!*_em5rSW3&e#B z%JTWFMQPLJq0j}oUNw z(dM41x@V>vy$rgOT~~NEGk5I<;N5?;&zF_3h~MV7Vf5H#xe3Qa2tsjKrOr(WI2QI_MJfq~XFq8&&ks}6P7Qt{GN-Az56ho$0@r$hk^qN9) zCye;6XhVR2GcjdE+N_e`M7}a3v~U95>L(EK8ZwYpv)Oi1Pt45izrX#C%Ol=N`^bvx zIJ-WfQpm21W>?R2k_oBym~)Td+;hi~_u{eVkKum$!#55Kj=DJR;ye8OVFbq9d}^baJ4Noq#4WSq-am&a5Vc!uwH2OFiie`XPPS-X{}C$QNIZ$56MzWNiASs zI=;!CRFEqP_N9=&s<02xAq6tU87_8Vw4Ce28ZV-yxOGL5K0(hHV^7bsdX4s~E)^t{ zQ>HS`4UHIur;+NkFJh(dq`b;JP0h_th?zNS*vL)*8#!C5D;ZL^51|hXN0GKdY`NA& zXqEO|^dmHdRQ4uuHt`VWSgb9VPIYFGxsFA_Q7uZc)5Gp*=w8FFLxUWz>L!KF%rcDm zYv#-P5V6bH1ISK!GLVP1Y4)VfBlEa@nN$BkS<9)R`&Xp${-L0|T&tu5yk7;(1KUx+ zJpX;nsSlmCn9^jH;4}9D$Qp4)6!9Sd0!isN!2c~`68a6|J%lgeWvY^aYb{mT#~`^D zcTed1r>asN)1@+5cPLvyv(lMjkYXk)_1@vjUk|mDO6GrnR;il>|L64juizvyj=_F5 z_(qq-%h&&m!p!_IjwB{5JW=VF66O(lWkd!4FDc^^Ie$sczb5B@Bc~d@pqk(2Y3l*c zU)d)3A0r^)&=4O%QLM=nj!qylNH_>>A9%zagk+!V>>wDiXJ`j$MG_#H*&5YTqM$WM z=BmMMtN-%N1^1o5_{{Uq%=NwJET8Xv?eSM0U)=cJfjfDXk*aOcy!MEz{ez-X5|gzE zWi8R74Y8uFLebX6r~p=O7Pa91UeW7Ci-SMB_~yms)}OY&)qX4Zi>aSY z!Jc$Z=1dpl208h2je@&o!7VU3=BIaDg)beAIO`>&ylu(WciF)p1KKSf=PjD+{8sb) zV8r43ob2+}i-NS*I(K!|=-#byc2^kR-ICdDH2%csfd41X%C$J7Y91Hak1}j1$713n+5|EeS!eLytjzbEf zx`arQr_f?l5XG-ZAcFO#KsDLqpIqfH1eTgy%$Tck{1O$#p|mSXJcE@}EhiA>)xfVW z0aj$;j}f8~%!(wyl(6EUD-7#`(Pp6%&yR|r>YJ35!4wV8O~g9a2n28e$a?Gxs`+;a zW?V#BfEmy}kk!=z9%c?h`_OhOB^rt|a^Jo}V*2?|thP<4ZHv~nM?Kr4Zn7sJAHq8& zVva|n**#eL5yztpb36sik!ZPZcQ`uAb#Im1I<_0%s&{m3HNLgg48M5cWPQ>#_WaMN zx$G1H>!ZJ>SH`Ai+9Q|INd7O#`4OB%I@=T2i1M_Qc<{W$TO8PZXv|VAe}X8DTS$@@XXK{>31?E5!^k1OB{vp+QN$@%~%%S#mx`WRUKteNK1VRDaiZdJX|*cGYlj+nf0XU<&i{Fa3iixbPax3&oON3M23LqERWpCc>I{yr+m$h2JD zhwIlo&A0QKZo8}LFV9DRxsCMa-gP^B^X;65k35cS%hf|46=$0p=B*2!MfW1NSRnYe z3*H^8It1P_-J_q?dR?{e9_)6R3qO9+=rgx}d{XZ*=Y71X*j)7SjvP3RRpyq}BjWY! zW^<=}yE}PTGufr>+2-ndM)+0@@U7OdupD!N6h^+rT_}E!p&0ItE#`vNF%*~mu_42J zgcX;)%Dk(k2&IeP>nJM%;akmSVOH}#IVE|abt9%MQc@O4DbvheCCn>@rJJ*)F!*3; znDRQ5F!*o?n!;@64N^Mza6trxdCdP$dEWxw)Ro^US&}VTwq;wg<%ev`?+3=<2Vffm zF_?!*Fa(?zd3b~+z&vbnWkT@C2{V&UO(&g*X1Xz*Y~yrj$87i-&rZ5^znyI%AycO9 zZgr6}GKyzQw)u9y?$bba@|b?z{r%6mFNtfDnaNDQZ})z1e0A@+=bU@)Isf+~UAl&| z#TIt0#L^&L!`UKI+@oH$hgbmQ;)7AVu0to1$NLRMiavkbB+Y^G#jh>Vw(@TK3>PhZJWmY~uRJIr zwjc$xCjM0*yvX6t<8-!-il0*P1Qn;Kps#RIBJdue3mz&SMiI|AH6k2^c87((maNW? z1|WK{%Qxs(GPxJe1vVTVz%3+e9Tj|oqa%XwWAySS0qu)u_>5sb-5K60rWc*r0+4;? zft%@>VdvR~4_yVXx?UYTUwC21cl%!Nn`w)*6Q;#NgFP$k{H+FTfQ$l2vqd||tf<`!7{%q7v{>bX^mT0UrZ2sC zheqYv`Y|t*&xa+c=>OE1(aMsfiDd^oa#{2%&5~TFu>w!No2s!qO7+8zRnhUO3z5jb zqyxPywGf9wX5=bR$UDR;)U--5RRj^!0pEGORrbf|hpjTCHxhv{G?DakH9k9BVSsAo-v|#OXuLiSbH2@G2kb@^uiv0DUu`v5eFoj$Bu43+* zL`t$OMUaDfE5LvHDwuT$!fSAUP9!@Xr4X;9at!R9`*!!?0tBDfp_1NK6JCMSrWEsE zZ5rkc(oRk%rcSD@*x<6XN8DpqeTGsYf#)Rep1U5RVeQE7cMq(?tvCZ4*JCFh@(3HYdF>XJg}Tn#%zl z;PyT$zfX&oWH2NLRTu9FELgg^@N&|_k?hRE>rOd4VTCbAa}dtrS`M!;ht}7jF=1W9uI2r@w~vsL$;_8 zE})I%;|=Ko2&fd;;Q}C11QGa2E>l;sqIHKX<0d4yG{XNPMbAW1B@p)+`1_^^JJ270 zX~}+7dFi(!i?FgPQU~`uZEBm%o{3FfD7Mx&CvR!9-=X3JNU;1Uw znVs)DoD(LbRhx9aR(QVf+r?2>q!$#!lQ<)XqP(~k(_vH3X0bPFFO8T>`7~-@Tp>j+ zpoc^$jvqliWwbGFgsTmGv!sJkr0Yp^6ndFLeCj=?4c0;d+j0>~SRqx^PT-KHgt(L} zH&Vym-3~x7?DfHAL`to~z4;MI!K=X-jS4~-1no%StEd9Y>l;SJm!TuwGeTYK}^t%<-FeSC;XyPgsZVLh<16 zhZEHg&^=Pv)tlp)2_uTqkd9X-qM7&qz(D~4<`P;E zKEy+5SPVfzVUUMp8A__AcFlCo3Q^ByY`}R(Rm@Q*I_jqLXG&tt+r{SXQOAxmJLWSh zVwp8!CQOp1`=gmHXSUr)%Vg%zRid+M>fz}}qt3O=Z{y7FyEid?aatXB5a}jy^`)pB zo4l3~1lOQ)bfFZLlhZSMlb;IWDXc+->_l(U!PYnNIXFlqq+18;m%DGv?E#D!IU%i| zB;^fEBx@0gUUXYTXji2z%0sI+GOJ(ZI1^F@_-&d!2?dt!)9E3r{&lrgWdv|a$KJE+ za-TL3{qp=k{iNGwhWa*e=+w8#QWSvXFsIu}rlyq)v_dE#>A1S8YJ%Dik!l^XvZzzRsZ6hSE9{w_6!n)Y4RkiX(50(?%7f^TFKCT z+CH4S#9L=+=GVSNA9i)Lql&w!8tBRIV3G$b(yLhzzzJ*p5ajGw@fM*I^OX`xM^YZW z=dzEk18^x)Lk#MQs2_9gcKw#BJ+i6{1m zd(a)m*A$*du`Qk~Z(B$_bpk&|+CAecrU^9d9y z2LgWH96TYV);5i;+BT$ViI5Yu<2`j4MkCCp5tXU?z_W;)2faXjHkXt$uf4VO0*9zL zMa6n580uga9_&RQr57axA5TNL7e8V~GBD3&H>95z$k(qvBbj$mqsL?*dW;fONcbAH z_n)ZvdnyReKtg{Qx!HukFe1&2295_Af>|O)zz?WPD)I@@L|WEYcAeWb)ihHTb*($IYr#{gMR8~) zEB~b@&OR|&74fc#c{@ZerByXYy<4N1+m=9Vc*vUlo1w3S!rLad&ZSl0Ena%|?6Z?r zco0Oa<$AYIpQWgKNVaCpJ$L+4(af%^ZFBWIu5F9#9}yoIA?0M(xvnW|)LDPl`ax#l z`QtOGkfH;@)|p)hxe9ceQ0W$?t#F~RV|HbIeWLwqhMOaUVKrj zo%#zueLbyUA*&)%*&nNXT&#RN@`OKH8Hi>bj93rC^D*3gc74R0&q)L<5#=BWBpr8N zz;b)V5HRdF`VIS2{KoyJ06={J@}>Y{?*-EQmLcyZ6+f2H3V$OvQx z%z>BsPEAL9;*o1>e?$7pTykOX$(4^z#2p9jxB_`N%YMNq za~J#b@jC~1-2PnDEATr}7W!Q%i~M;gi~ad1J$TOjf^3>{q9ze4=U76aI$%n;u`e;>k^qvl~xt>Qv791Q&r#G9OCt zNX^0pMg(sIL<9>)tDPNsd0;hnK{6*Fn!AcZU9F?JEAJ}xrnXwVECGi1+T6M=RuO zdNy1KQ#ALLn(`Bn!=}6nc6op>FFQg;*vZwazhp9Mn6haY2J+-Ps->11JL3?wq`W00 zyoLb+V(ehi$%T9@Hh4xB(3*3j=&vv0*-sssWlyHv@q`Po#*AlcYmlZq?$Tb74Z9QT zK?)m4yh1AbxHI8N?r)Y@jeMixdD?1R91gv2ZQB(jgXfEV#TeSF`A9R!>Mx zMH%DOEA-TQv2guDenl*QjhMe?KEEiIzf#O!$;@YK#oSuuo2v(R%{SgY={(WTqwk~2C=Z=mc_J!Rjj>bHEh~uywpEad+Et*E%Yp6)-}(y z_C!jz(ywA@vRAiFnBTKDa#XGbQgqG$-A%M*%+HkaWx3?LIiV;BLP+*i&YCyNZ&eeeM z$vnd7h-$_o;W#Nx!_aK^(@G2od#qM2g00@)sGHoxke>$b> z>GU8S^(k@3z{z3A)Q%2F;}`bh)4B*+hgWoXr-~q$aAlXeIIZFwW+6OoYHf zSnPYOgFjK$fg=RjBa;`|LJq%`zO>)Qej8tO`OV|m2p(N4_pbhxS2V(7BXl-B^$V{J z1DkD~RTE05cF}%%7yUIHsZ;xx&!D_%#oC12Ae4hO0|x|oRgC9`aat{YhcqV_``37r^fDs?FnlEWlEPH>3xR-c1d(47FLMNT zS27b7873qn;f`V|2K+UmP+-=yG8yW=7E*E2yxW)W96!+f@ac)BH~lq>82Tu?1Z_O;u5{Y&)^x$(rqRqs66xc^NLCtNT;u5vqLB&Zbw$QbIM`y%+ zAtw{1`|%I>{C-#!Aav}p0T5Q;2u6nj!FVp{b2jlqm>&4RLGf3guTn7Fwv7~b@l<@G zgF}bnHu+NpnJhJKgEEfaVsVa0+Y6$FhfaHfhVth$lU^&&a2{3hqBaQ$1FwE^1^-BbysJJKVn@a_Vn^ zZlU}uFk~P(NTjfS&fc)lLPF5YYeKYTZ>;4}vE|XZmi==DC&iZiuQyIrO{Yel^2eS! zEIxHOG8BC8snOqaMOyYx^oj*17gMq_-Sf38Vzr%OZD*|ZKC$+`AJ=X^w>#W3Sr4J( z%7|&9>=x$@`mZPVtGq==X`x@tiD66@0hKL)^{Vc>%6;u z#uaPcEaIPg^VK7f2M6Z@Lv!1XP*bkr$sP>K9INXP>pEr|E(fA@54`8vwU}q9gPCnU z&wyezc&lP%ZDLv5%>K)+XxTQ=>Y1>H8$Lwjxx*Jsb5dY8o}6d;*{HKUlF?3K=?-5o z&)KUlHOxHvgVDK$9!OT@6h3mTn|8-U*JRs;cCmN`Zj&K-scp?XaZ;$YEOxxQ`}1g!HOZ`gLzQ~g@s z`M#*9F>IrR%Fl?^Yh%@2Vs+Q-!_n#>Y!S9eD?_lv6^ z3inP9i>{S7tLtOc?Q_-b;axW>R?V1ahVbqc+rszHyDLO@(|mDNqJ^Kb%FNBSUWeh`%+1c;Qo~=CccOv1mW}Af+>+a8icn>Lm;y z$hblxZgmYL6qgfNa)MM~%5Q8@et=9=Igq1>`iMK&)lA>ZB*WRA@Cg%sU7@;zMD zArkn8=<5ndD zHb^fiX9CB3pB`}#z!o~D8k@JCxff(vzxNa@3ay{K)I%A5tx9IE%DiqT~A&rp1 zleh+}>(lrX&s1#<$+W{m)xS>2!VIWA7*9VsJaTH7Y>9&L49Rs!`gME=Y3E>YP4~EQ z5iME;EpT*@is6pcC!&L8kmBDFdN81SSRv7#ZN2Vj1$>)_E#h&}-a4BZYws1?dm}r2 zk-R5NNajF$@zWXOD&pmc7Yr0W%tczIJeR|tzaJ7AU+l)3oy`5#qZV!@> z`bu8umL~JtX{}pY&F_?EZfOUjkIV8w>;w}l{1hi-#S6pzB_eezJ2iVL=eQ7eY%t=! zuCWN1$mLD20Eh6T&hFNWV)pliuS^e~u=0|A(d`2!FM!(TVxry#;0`H=EuOjcZJSQkl(rwRhOfpOyC zNc8nNM1g2z6|-(8s+G4ROTHwLVuHni`X-79jto{cubwyxGDR2~4e|=izD(N!7tg82 zX|(x;Ygmoi=vJH}XH@Y!xW%JHJVR#>P)%e}#2=1sv2jB*ZzF~1G-T(8pW)saG52ch;D}>&#Jc*Ej~oVf zT}>oI4U5*v;yI|P@q!f?)9*UE3k`qh>25S!Da`DyH(jYSQrT$hZZ}<7XGA$jJ6S#m z`?6jAFit4?3`OxKfm6tI$*3~zm4K3j8Tg@(+x@0XiU6B2@)n+$u|Cz;h)HGq9L!35 z!>7GG!YM+h4#MsPtC;P9=tIB0o-EG7r(*Bbqy57Br19kj3 zd@KWgr43>fDNWMQFz;RSINMjSgMk$b_A_`>>Oo*8_0+7=#E#L?6S4@Lxsp>ov?&C+ z5e*IMun*?kc<4CVhb0Z!WGc`5lKbQ%S#GOJGJCvR;zs$EZ&x*g7FfPtOlB`R)@ruW z=a#t((^zO@5ANmGuml^`kIkVVTR{l9E(-}j8vs-?n! zwH4ez?C*A9}S4aSPJp zG`Wr%GzoTeM3u241Q#8J5NOi0XqRiKe}U}Dqc`c030~Y)RM~13xowO@+ouA8gob8v#%U^1R+g`64he!pkmn_%t#oQMINt^uNjv@^2@D~oLCJ^O&S5{0#kkegb$+i zNs*1efsaoPj-G^RU80c*+awym(tFTL@)yF|l#;;b-7|C|fPA$98J;zIDUl%HnPgnT z;3-f$GO3YQ%3j~8gf*_fG$`x}4h$n^EjIJJ^MqtYl|2=+!O#~= zjL78GEL6kOC*hn*LTnIW)I7a0ZXo@Hl=1uS1`!s4T1#$|e;+(c9~5bg+m-JjCp+Yr zT60-K77sB!D+VEbB(=+U8oTuD=-77VN~Nq4|BxSxPeHuNE6jUh1R~+n>-ieh;E@0e z7!c2qmAdpdcoGRG1TQut3`m*bDOuMD4^mN0MLiY0R4|@*3!O2Jn3-6upr73+>P>O0 z{9(8Up(EKMr>oHHlu1Zofml4wVA)bNsvd-WvnyiC;s1VI?J&}@w(cD9kj6-CC>I}C}J`5q?g0mv# z>=vEfm+Ss=<&~B1tcvV=JhpF8+&36?`Xd>BscxiX^_;yqsdD7O$6^oq#0Py*=YdGZ z0WMi|UIIQ7{wQmkt@1KultJDOJ*7!_p7C6Us&Uln zGSO@ExWk`{6w&Yz(d%2|bD`{nkVB>*Sj69i5h*=8SkI2<9BR+?HXkXLdR6TYaIC_# zbNg08XbjwwR6)_602K&_bfWdhG=tJgk|2P$nIy{4+RHMv5PvA4J7rXglu&EL!!aWF zt=3aofJLc?XMoAPmQ$pHb9%qqe z>N8m+A!aJYaTO_8h1aQIl3J#VWa3<=C}b`aq$uQ3FaChezK#M87>w^B?HzI#FpV8O z6;Fdaiij!UDXRL1RM2b2ErcjXS$@TMhCE(kRJqFqsV2A@?@_94f~6tze&y4pmR#JD zMsrq{hy^wC&J~qg2@(E#EMg!+#6g2G{v53L^GhZVPiM`hMDy2AY+p=qW%d{$NGY$6 zdD}#9Tg=-jdOPR5T_0J@p4<<-UFXe{#>wV+cfl(s&z+pyKj*HyZ87BK&m-cE#gJ2Y z%YbSy^wWF3@ZQhopXe-AAgc>JOZC^BsNR2j*Nr`jwIF%Ek1w%#QiWy6>)kef=M8ICnoZk=69{4oI1{ zzUOMeQ&r73-DP3Nr+1q1lAqp5$52rkijF}Wl?68wsGKl+^ZED1^0$lm+pncY_Bc2?5_C?#7tARdlz$ z)iYc0{l3dvqV64H_716?D8iBKi)6R69FZNL1^rkbzgN=JX86;Ro{H2fE-y~6w3YPK zrM{h$kMp-{GkTg*-)>8zvde<<9b-GLzq7t(>ng+5id>vuZL@7{G+o`$u(j6oZmk99 z@2;|Kt2e#d-ngyG^usC(&J)Dg3eC~RXby<6S?Wl_MDQ#F4q>8aj4b)k6MD&11-NFi zh9XWp>CoD4No^|_P_2sRPiweEN!MfIOBZOebW5_Hn7BlFy(XG?MU8&u=xv98%N-f22&K+2CHN_{)O0 zFdH5VOQfqmN65mxMElHwi{=^uRn3SP1gJs>@z1)(^lUr`4N9U6c7#%OtmxW*f!WH? zpB?y`>)T!#Rf|O_mLTyMNe2{tisdGY>IZs^AERF7tU^9xc2RZX2o6hXKu{ROx+ERi zb;;-n>nMr8*#Qeh>05`=Ku;LQ)1FJy&=XdcHgS(+fXqY+I>HC9ZxBKXKNHP@31`eM zkco!P*61bZb`lZ6IavvLYpDd4B}{5SvMMIbeNXY|Kc_))-=H+RY_e&k5>^H{W@3#WO!}vKVpUtjsx7gq?PAsT zYqq(4k4E?Hk5)ZC=X_$mxGa4CEwi~HHx$!NiUQN8x1M zg`PP_J$nyjTo?vvu){s<{aJJUaPnkA3<~(sfS^HS2+z#k3y@b*(u~;*ImNH`UU)9z zSPL42EM^cR7IDwRo8;iQGq$L+Q_Se3(6I?NG-;^*S+Ely`0J*v#fINniDGsGiYsfI zQNCT5Pvs^$f2X;de!N@k+U5pnQMoPG^ut^W&h?3kY<&6Ub>n&h3mIL(b4n3iXpm*1 zmR&)OqeRNELnCyqQki4~)zcBGYY7Im4|xPK;QuOg;}DfV(ZEdof$mu(8b$am_Y8(# z6U+nxl6*5+njj0KWK{x7lX}zGe2>aiLcR!LEd0z59Mi!D%*T z0HSLyY9zfM)N-1h<-M(FrZrJ5; z_X#QykOfpiGI_m}v~o6Dq%0|%th(U35S+5lIU2EZBDIgkY6ryHfykGJ=8ld;PK-v6 zo{ZK$6U{vp$vAamLwD4%`Oo@ijbU>vyIRbyp7Ko>zL(uP+b=pcN35Gaz3$k|0s&pA zE!=EMv?(DNOG42*^k#_yKvhX1uT7y=UXx6?g#Zu~;Dm?B1aYNDd?R2aQFyA6Is{!M z@(QIs`4KXHZp$;;6|f3ZEYHaGMTbXp?!qK{FG(;~Z}Jg&p;`J64v~n3?1u#%9R}T7rP-uCN?pBe>g_%jg!XoD zFmPftsB9W^A-gienyXPV>ptNd67ClFfDB~g(QIsKOR@b#`-<=CaB)(TuQh%_#;oAI`?G&~BYS)}&&y}t}YnyGJ z^@WX;sG1oR=S=q^B$AlD_Hx&C77Fsy+jfI%zwy)CRx&kv-?1l1xZ`)dn;Xnm@=G_b zGQVvr+1!?z;4@D6%#QzeUckKm5?GY6yZXCZfhEMQ>xr+8P-dfdI-ppl(Xd0slmv6| ztj_KR6JNGetNKrbOaz_O{z4{IGz~|o96Y6maTSp;*jtlod&-=iTH!uL&?QeAxaN;6 z9)LI>c9*hZfLr|NGRdh2$!9x-)BqG)jyVG%rWIq|O)9(0`fWPI`bFDdHpkN-PBH5_ zpfLtMUo$A_G?b?HCDR~K9MtmO5S-qs3D9HJP)UlKL@R**suALLz)gNY+-^0J<+Ah+ z$ZP!-*`hD0o{8+1UOXV*MO0B6wqqi6JQNs)d%>V=Y^1;lrjBj8Z*W9u9@@vY=FbkXt69zDiRqZCH~4#^ezB{UBr{VKOwx!z05h$w+n-@RL{= z23R$wSt`Tb$3(|tD|JYo#93i>PmJP$3yl=uMpnsU6?R6bn{Hvzj8-rcXX9 zk#gK)M2*yc6#XOB{mP#~lwUx85IKc6Tm^KgkSFbUdrf{%S;{-!ik{Y#t7Ta|t1VYo z8L4cw^=z_S-DpIaz@QIe9BA4a6@&GaMjgt=w5E)E^P|?U>obhzZX>dD! zGy63FH7PkD+qFVM8Fm48U@ZIqb*WH@GOQPB(4!7_Cc|idDq1$4PP<1fE30KwMZo^_ z6*!@P*4erDz=2S!GYsbGmg-h(HH8P&>D)%jGq z(_7nI+vu%bO$Dr_0=2A#+JmS<=PFqWLC_Gw=%8s%k?LqZi5lh1sjT;s-b9c1RUtOl zTryG?@KqvZRWQRX8VU5W8B$+NpEczZOHf){lT)q9lLZ?odLeZvlHfBD1K=r=(?W`S z+&4-#Kg7_o=}>#%TEpMKD(Msc8fCq?f14(%eoEX-lN&cS_ak6}h0U(;4wl5WvBF-S zhmegV0G^n6`jMot-p*x!Dr#UNKWd(Lw}Z}@ppRsHiD6d|!i8*)gb+HB%(}S(l4O2~ zrZ$9Y#!5AdQ)p6WKfpzj|CM0;zdnAfz{@`(=%nc?ySC9 zTmofdf#;^(HJOUo`*7fhxEn-A!vcH&dtM%kWS4VB+BD~=0`z{R^IYf4T~ixG=W3F> zDHk@1&gS`I??P^I#Ir8u*(iE8&W=VsJ<;5)k&La>x&@KS82DcyI#*2hM4io%jOKYq z>5HS`-fuiVIU03TMXXg!ayy7OR}M4I7*w3ZNdi>V%hCsb3sOI5pq4=mMXEq8xt2mX zYhxpWmQr9SXs#?+jO)}(^tY%tjxFrLUJ3{>o0h()L|HL@ZqI2XWEu9hG*P`CTxcGH@hD0 zj@fX2{RYM8`vm?)*@eKnsOroQkG|Y-J;MX^Yb*JTC362(PK)7RySi;hfNym8NbIO{M+ZSrFPSurV z)RVs~hg;u}Minv;_eHB7T!~SG;S@t2xh7M&X^n;|kwX_!PSpbto`!lj6z$5RmfK>< zwv36%wvvp4PLOXBI4Lk(q$t&!qviYq_1G5$C zn+xwoYXJv#x}uOgQqHewOBG5a?S8ZG_wg|_fLTVT%vOfH-xW41UEXoMT;wC+ED2fp zIJ$yI2_9ki1rl6N3V<8qJDIU#D~D8sPlm2O?$GPX|hCGmpN z1Ca9*c|_4#DPjXaHGgsT9C*&^V0{j!0~nMfDVq?Xf@ExQ`@q2Q!0`icvKbiQ>csS3 z>YDMdEbsxBm@|-CO^-36p@Ys&QgM+Af~|nX%-?hb&9b~|j42de#?PdD76NG*ml49z z$ZH4=r{Y<_;UWfyCt;NYhxKU>gT+Cho7j%a$ zWT3O=&8~}GP`@3HuGk*U-*Ig)lKmjF(b)?d9Rx2ex@}0cb-rI(6HaGA%qvA_CD)N5 zc$GS zkP|?X62wm*KKuf_f$r{9x>0taOlRob(Mtg?fhL)xPtF96ghUOP7>)3nQQnk8N1*Ay zXk@gsmOT02xHndznV3ZKL>br)+8EThDxJQIkX~>UyjnQb_U*E$qdsD-zngefmcdOl z^u;a%KSaFhQczKoKZQhye$yBh4>{G3VGLxo6EZTpB(fy3qe9Z*H~SUO9^L!e$oMIm zY-tJ`4OGopVQ+>H2}DpNa(_R?m1RVHV5b9X+a97- zdl(Havufva^Coj%9h|EA_Rw_s`Qy`1izO8PM9giTNFxXSLua2uh`!wXR~pYXBEjR9 zXl`9B7q?dwePBgJ>_a=Km4H_+r<*mSEN+mo@8B2OxqxwPHx@(DTFt zvsW<=-wa*RlhWR}CikprO&Bu5!YpOn_?%H=VP+cp@7nz!lX~PO4_Bk1<8Z8%Nf&i} zszR183JSw>jQUc$xR=$~J%FwZ!;{+`%atW0(jACKlnkwnP6-#rQ(ntcdEe_(jWwr(RuC7^d7QM3R+@=ey zQ={MMh&oqBGFBpOY<|p9D>`bWh&DB`+?8T3%$uUQt#{evSP=B)v!EMYO_y}18m^=| zDUWPniIPV)flM%?9wQU{IQe4tiXLvDc&uapZK*X$v3|XEdrr61bGm+%ezeyAYN0eZ zB+bI)bUPaeV=c7zIC=0e#ZFU|KKEFvvfLtR^)W3?7l>mmVek>Hq{N5`epM4QK!bXQ zmQl^}%ZSM>qK>kNwQL#Kc>N3i-uHryDuqDm0454hl)tLFR<)&O*0)Xw2#gRAC_(`> zsTLCeq$COeV1{AFENT~6@4nqD+t;pcmZY-en5l(>ly6zwA=b@ec?v&QQTP!5`AuH?U$Dp9oVbrZFs_tE!zRffAA} zaImNW8f{1#w0~G68`aszm7>{%; zPdzZjJ&hcPkfn;$C<`0W;&0%6=s;`%WjE>hA5gpj7J@`-3ozR<_S2tZOZAZd)vskY zp(D+H;jo)}*IfMNHqmF+$DexQkth5EPkz?KUhDWt8;mmy9-U(N0?$Z9u#q_+8p%Pod>ysE-AE=1U!CJHn4oRb5JX(|plchktF4!qkO7r=E2L&bB?VM>(;x`jk1{_+Wh}? zGs)Wy+sHKbe}0Z_Lji#i#zubNjdO-6CTTv{t{DmDrMLcXFTeh2{C`O6fBzS`{uxQm*FQ2(MXa@VuYHIL=;Y)7ogsFV)ULj}3)A21GkWKm(e3*-2gCr{=DX+Z$S8&S=jXgV2V+oh)?>VxLP& z;yig@43Tp@Lh9(DBBb=wO|GZfq+L>6tat)Yu-HZNNWo4!k?P(yZdMc7sR{lw;94@<(rh80gowruHYJhgxSz(f68IKfIF z1FRR3sc}1RiyXKD%vCACe5_T%m1LwuxJs1k|HMN{@kF$gE8giX0w?d{sb$dVVu}sS zd{NnJE6%To6}5;(Ei-M=qITG}xy!ga&wP$&a_^)sT()RRDacx=Z{`ttf6yLVze`-d zEAq&J$e>?*ByjzaBaxvak>L~K!zbp}KOL;}Uc+8F)@_PTvei;WpcrY}4BtvbNYw@7OIk*C&m?iKXzx zlE$!e)wLsj17o8DS_cKr>Dde)QJi;qeJZsO5B6tTk{F~mBbV{1>3|iNuI-i@kPAXL z#S&N*x*_^*4>ra&gvBR&HfDtkeKXYIOy5jGn508~A0ZXi&t~Q@YI?DdXOY(QpjhMj zEvyGh2|!Brqyuf3{HcD6>Zpr(QWAO|AuV0fp_vmn2p>_Bb*k0m5wcJ&UiG?sh9nVq z=OEHW9MQXLI!Y+pK3b{NS0MCPDN3n@G5!iRQFCIcsVyYNKMjz3X=mE>BxhRtU6A`8 zjK2&oWw@lPr~aZOpcsn+2sHp&R;-kXyABBbdj~6BibAdWBcSJ*@0uMI%eO@H5u&~4rpNo*&htB`g5Tafv1`GR8{Poz##Hxp zNA-NE7oM&q4b#nYB`aAB{8z@$jeqO;`GU%+lL&u&-u^*B$)e3r+5{D~%N_o5)LA*@ zyY8$df6%V;UDNiN$1mqxZjP+k8ZF)y?)flDkOCi7?tB_`H%(9m)tIA9bd*h1U3b(> z*Tot-#fHw=2d_75T*$ACRCOSBMI^fu#!xFZEkY&!bBbUXs@c-gQ)0MU;@WC9U2V?l z*<`x9$%69)RAa^`Vp15;j=vbH$+39GTN1nH_$R2<7BRfkIN4YfYhQK1^LMJ zkmp9n>=+Up#k@&Yq$|=+1?Vxt^yigprenDKk@r=}_^(|{A0ZL@{IDSHSh;SH#R*aC8im#&oWXN8W)_f4Z#z53J}DVXc@~42wypU?)1wWCwdlBETjiwCWU|@GQAjc zuNB>EXGVYUaMazCAOKY;yiH3`ctnVNZ&i1N;Yx+Ad!y;fimdJq)0GYj&V~DNufCoI zbryEvTFa=qFj8*f-gYI@fQrYQp^_XVg?}Qqy;+Wth{CNDogd^14dN8mEyD%N)O_UHFhhd%+e`c!`b3yUNPO$ zAYH^65^vDMnU)Ia8qO9=*|jXo8tEF&7QO6Ry2YzJ>y@5$C?m$%VujS+HlxzuHlx&H zhNVurh_gixtLajn#@S*cyH=rG!`b2vKI|On;;j^%F*yqVV%PB5>URmH^hF652(;sb zzoDPBX$7Xj-GgNkH1hHB^y-gMG9&|AKBXNXZ}pOIGn1RT-e-02N26I8MbARJ=^ZkLj^D z>Fj+vo1wECboR$|_9319fX>*a-A8B2Mvhy%5Y6r6vA{;*X^a3>p;Jc*qidt_<1T}- z?tO!U{mXjakns~k-unjo`v#ob-Z!MbZ^-;OCBuju<#KV0&K5l;W93iGo{v)v#>$AH z;_nSvKQUDN7sJk<7}nfO%lysfzw&%6twc;KnK~6oD~YD9I%B?>mKPqJYz-e4)5^}6 zKTbVtG`emXs9b#5WUzZCYGdieVmfRRqv_RW(iY7oW8QpD-kF_X%F}aWwj$A16tk6z zw$d}HH|=>7EiZMR?F=7_+AGgkZ>QRf1-A>*jorrEMd?P*ouW)*@yFf~ld<1;%fSBJ z_NQ5ml^^Gir5hi`HTLKBSYEEN{C0!O2nf<-H*UP`$uRCV-Yzv7i*8%3#*|pQG zm7_%riFQJ35kf7R(26u^n|R@IkK1_Mivvh>9uG`=+FNLf1QQRtPLt4fOxu-w?z!ij z&*wY$9{c{{^;Q5GFWy+6=;Z+Za2BOO6_vc7C`%xLgyL`(BRl{!t&SDN(X5CCp7 z+@)xVny-kFliEJM0*N+hBANM0BH5en67h>@zAEON$+l4{Vh9$P1$MzDG75;)xg7uz zvJq(}&6?~GobwUgWx7l>4VW{TA|skum}~Tv8V0U3F_3nrS%PqxZaln+t1IT+mXs__ z_kXbA7Ca(7;c%%fa^cb*i88rzjc(IJbnd46Ds`of0g+C7(p;(D(tHt7FkfMU0w($f zeMvgzH87k8D2!czD-mps5UDe88dC5neFjoUq!5UtCa1C#VMA7hJShlyPGYB5Y_w;# zV-K(Bys8Nr0wV_nfyezv)XKPBiougiE^5#_DUMqb0bDyL-3 z8yY{OB{46?622Rp!@$ag zq#+MutYN!iOo%6oIv0(q!jv41+N@&8Q@YK>G(`=0ZAQQoy6u`wZOj{tZ2!g_-Sm3w zbe3IF_zq=*RBU_7x?P!6^<*NUVMCT|wqUp2C0@*UQWY^v;Mh48-DwrRJTjTgU#YW8#1g*li_gE@V2aZMEB`aq8)iy9UT4fm8y zMXd7|&_5u5fM*%VF|0TIxUqFvxDi}*t?usr_WZ5$4|gBV?mleQbmTawX|vkit%F}evp98wqpYy@%hadJ1 zWqXGn^o~4b*=FDGy(8KB?!^-;O~18wFCJg5Ygut+>pH(XXuWyjUiXQd8)}=D4`ypR zAGdesSh85{9U-%K#~KjylPaibc6ihWmX2LLM#%LKJnS3H_6tHMQb4y@wm+!8tcCd-Q+lYt^QMSkFF+bvE?B8-V;LLGL8uc?KSN{0nXKZOirdJv*OLJ3XO1 z4Ha!UN6Q^SP!pW<>IvDmpZwvpobBS$t!1zybrcMyl{+-0Ny)f8 bfOiqUa~0}NW0TWBDDMMQn|F1gh63PkB#a!k literal 0 HcmV?d00001 diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__pycache__/_version.cpython-312.pyc b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__pycache__/_version.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..01a88b7309bb1334cda4f1e2bf38d12caa94d4f7 GIT binary patch literal 240 zcmX@j%ge<81bek&P1gB1TNakh#HElw>ej!DeRF3!wLj|oaG$OrPON{dnm.services.ai.azure.com/api/projects/. Required. + :type endpoint: str + :param credential: Credential used to authenticate requests to the service. Is either a key + credential type or a token credential type. Required. + :type credential: ~azure.core.credentials.AzureKeyCredential or + ~azure.core.credentials.TokenCredential + :keyword api_version: The API version to use for this operation. Default value is + "2025-05-15-preview". Note that overriding this default value may result in unsupported + behavior. + :paramtype api_version: str + """ + + def __init__(self, endpoint: str, credential: Union[AzureKeyCredential, "TokenCredential"], **kwargs: Any) -> None: + _endpoint = "{endpoint}" + self._config = AIProjectClientConfiguration(endpoint=endpoint, credential=credential, **kwargs) + _policies = kwargs.pop("policies", None) + if _policies is None: + _policies = [ + policies.RequestIdPolicy(**kwargs), + self._config.headers_policy, + self._config.user_agent_policy, + self._config.proxy_policy, + policies.ContentDecodePolicy(**kwargs), + self._config.redirect_policy, + self._config.retry_policy, + self._config.authentication_policy, + self._config.custom_hook_policy, + self._config.logging_policy, + policies.DistributedTracingPolicy(**kwargs), + policies.SensitiveHeaderCleanupPolicy(**kwargs) if self._config.redirect_policy else None, + self._config.http_logging_policy, + ] + self._client: PipelineClient = PipelineClient(base_url=_endpoint, policies=_policies, **kwargs) + + self._serialize = Serializer() + self._deserialize = Deserializer() + self._serialize.client_side_validation = False + self.service_patterns = ServicePatternsOperations( + self._client, self._config, self._serialize, self._deserialize + ) + self.connections = ConnectionsOperations(self._client, self._config, self._serialize, self._deserialize) + self.evaluations = EvaluationsOperations(self._client, self._config, self._serialize, self._deserialize) + self.datasets = DatasetsOperations(self._client, self._config, self._serialize, self._deserialize) + self.indexes = IndexesOperations(self._client, self._config, self._serialize, self._deserialize) + self.deployments = DeploymentsOperations(self._client, self._config, self._serialize, self._deserialize) + self.red_teams = RedTeamsOperations(self._client, self._config, self._serialize, self._deserialize) + self.evaluation_results = EvaluationResultsOperations( + self._client, self._config, self._serialize, self._deserialize + ) + + def send_request(self, request: HttpRequest, *, stream: bool = False, **kwargs: Any) -> HttpResponse: + """Runs the network request through the client's chained policies. + + >>> from azure.core.rest import HttpRequest + >>> request = HttpRequest("GET", "https://www.example.org/") + + >>> response = client.send_request(request) + + + For more information on this code flow, see https://aka.ms/azsdk/dpcodegen/python/send_request + + :param request: The network request you want to make. Required. + :type request: ~azure.core.rest.HttpRequest + :keyword bool stream: Whether the response payload will be streamed. Defaults to False. + :return: The response of your network call. Does not do error handling on your response. + :rtype: ~azure.core.rest.HttpResponse + """ + + request_copy = deepcopy(request) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + + request_copy.url = self._client.format_url(request_copy.url, **path_format_arguments) + return self._client.send_request(request_copy, stream=stream, **kwargs) # type: ignore + + def close(self) -> None: + self._client.close() + + def __enter__(self) -> Self: + self._client.__enter__() + return self + + def __exit__(self, *exc_details: Any) -> None: + self._client.__exit__(*exc_details) diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/_configuration.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/_configuration.py new file mode 100644 index 000000000000..8e25dde066ed --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/_configuration.py @@ -0,0 +1,73 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# Code generated by Microsoft (R) Python Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is regenerated. +# -------------------------------------------------------------------------- + +from typing import Any, TYPE_CHECKING, Union + +from azure.core.credentials import AzureKeyCredential +from azure.core.pipeline import policies + +from ._version import VERSION + +if TYPE_CHECKING: + from azure.core.credentials import TokenCredential + + +class AIProjectClientConfiguration: # pylint: disable=too-many-instance-attributes + """Configuration for AIProjectClient. + + Note that all parameters used to create this instance are saved as instance + attributes. + + :param endpoint: Project endpoint in the form of: + https://.services.ai.azure.com/api/projects/. Required. + :type endpoint: str + :param credential: Credential used to authenticate requests to the service. Is either a key + credential type or a token credential type. Required. + :type credential: ~azure.core.credentials.AzureKeyCredential or + ~azure.core.credentials.TokenCredential + :keyword api_version: The API version to use for this operation. Default value is + "2025-05-15-preview". Note that overriding this default value may result in unsupported + behavior. + :paramtype api_version: str + """ + + def __init__(self, endpoint: str, credential: Union[AzureKeyCredential, "TokenCredential"], **kwargs: Any) -> None: + api_version: str = kwargs.pop("api_version", "2025-05-15-preview") + + if endpoint is None: + raise ValueError("Parameter 'endpoint' must not be None.") + if credential is None: + raise ValueError("Parameter 'credential' must not be None.") + + self.endpoint = endpoint + self.credential = credential + self.api_version = api_version + self.credential_scopes = kwargs.pop("credential_scopes", ["https://cognitiveservices.azure.com/.default"]) + kwargs.setdefault("sdk_moniker", "ai-projects-onedp/{}".format(VERSION)) + self.polling_interval = kwargs.get("polling_interval", 30) + self._configure(**kwargs) + + def _infer_policy(self, **kwargs): + if isinstance(self.credential, AzureKeyCredential): + return policies.AzureKeyCredentialPolicy(self.credential, "Authorization", prefix="Bearer", **kwargs) + if hasattr(self.credential, "get_token"): + return policies.BearerTokenCredentialPolicy(self.credential, *self.credential_scopes, **kwargs) + raise TypeError(f"Unsupported credential: {self.credential}") + + def _configure(self, **kwargs: Any) -> None: + self.user_agent_policy = kwargs.get("user_agent_policy") or policies.UserAgentPolicy(**kwargs) + self.headers_policy = kwargs.get("headers_policy") or policies.HeadersPolicy(**kwargs) + self.proxy_policy = kwargs.get("proxy_policy") or policies.ProxyPolicy(**kwargs) + self.logging_policy = kwargs.get("logging_policy") or policies.NetworkTraceLoggingPolicy(**kwargs) + self.http_logging_policy = kwargs.get("http_logging_policy") or policies.HttpLoggingPolicy(**kwargs) + self.custom_hook_policy = kwargs.get("custom_hook_policy") or policies.CustomHookPolicy(**kwargs) + self.redirect_policy = kwargs.get("redirect_policy") or policies.RedirectPolicy(**kwargs) + self.retry_policy = kwargs.get("retry_policy") or policies.RetryPolicy(**kwargs) + self.authentication_policy = kwargs.get("authentication_policy") + if self.credential and not self.authentication_policy: + self.authentication_policy = self._infer_policy(**kwargs) diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/_model_base.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/_model_base.py new file mode 100644 index 000000000000..cea1ce451199 --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/_model_base.py @@ -0,0 +1,1235 @@ +# pylint: disable=too-many-lines +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +# pylint: disable=protected-access, broad-except + +import copy +import calendar +import decimal +import functools +import sys +import logging +import base64 +import re +import typing +import enum +import email.utils +from datetime import datetime, date, time, timedelta, timezone +from json import JSONEncoder +import xml.etree.ElementTree as ET +from typing_extensions import Self +import isodate +from azure.core.exceptions import DeserializationError +from azure.core import CaseInsensitiveEnumMeta +from azure.core.pipeline import PipelineResponse +from azure.core.serialization import _Null + +if sys.version_info >= (3, 9): + from collections.abc import MutableMapping +else: + from typing import MutableMapping + +_LOGGER = logging.getLogger(__name__) + +__all__ = ["SdkJSONEncoder", "Model", "rest_field", "rest_discriminator"] + +TZ_UTC = timezone.utc +_T = typing.TypeVar("_T") + + +def _timedelta_as_isostr(td: timedelta) -> str: + """Converts a datetime.timedelta object into an ISO 8601 formatted string, e.g. 'P4DT12H30M05S' + + Function adapted from the Tin Can Python project: https://github.com/RusticiSoftware/TinCanPython + + :param timedelta td: The timedelta to convert + :rtype: str + :return: ISO8601 version of this timedelta + """ + + # Split seconds to larger units + seconds = td.total_seconds() + minutes, seconds = divmod(seconds, 60) + hours, minutes = divmod(minutes, 60) + days, hours = divmod(hours, 24) + + days, hours, minutes = list(map(int, (days, hours, minutes))) + seconds = round(seconds, 6) + + # Build date + date_str = "" + if days: + date_str = "%sD" % days + + if hours or minutes or seconds: + # Build time + time_str = "T" + + # Hours + bigger_exists = date_str or hours + if bigger_exists: + time_str += "{:02}H".format(hours) + + # Minutes + bigger_exists = bigger_exists or minutes + if bigger_exists: + time_str += "{:02}M".format(minutes) + + # Seconds + try: + if seconds.is_integer(): + seconds_string = "{:02}".format(int(seconds)) + else: + # 9 chars long w/ leading 0, 6 digits after decimal + seconds_string = "%09.6f" % seconds + # Remove trailing zeros + seconds_string = seconds_string.rstrip("0") + except AttributeError: # int.is_integer() raises + seconds_string = "{:02}".format(seconds) + + time_str += "{}S".format(seconds_string) + else: + time_str = "" + + return "P" + date_str + time_str + + +def _serialize_bytes(o, format: typing.Optional[str] = None) -> str: + encoded = base64.b64encode(o).decode() + if format == "base64url": + return encoded.strip("=").replace("+", "-").replace("/", "_") + return encoded + + +def _serialize_datetime(o, format: typing.Optional[str] = None): + if hasattr(o, "year") and hasattr(o, "hour"): + if format == "rfc7231": + return email.utils.format_datetime(o, usegmt=True) + if format == "unix-timestamp": + return int(calendar.timegm(o.utctimetuple())) + + # astimezone() fails for naive times in Python 2.7, so make make sure o is aware (tzinfo is set) + if not o.tzinfo: + iso_formatted = o.replace(tzinfo=TZ_UTC).isoformat() + else: + iso_formatted = o.astimezone(TZ_UTC).isoformat() + # Replace the trailing "+00:00" UTC offset with "Z" (RFC 3339: https://www.ietf.org/rfc/rfc3339.txt) + return iso_formatted.replace("+00:00", "Z") + # Next try datetime.date or datetime.time + return o.isoformat() + + +def _is_readonly(p): + try: + return p._visibility == ["read"] + except AttributeError: + return False + + +class SdkJSONEncoder(JSONEncoder): + """A JSON encoder that's capable of serializing datetime objects and bytes.""" + + def __init__(self, *args, exclude_readonly: bool = False, format: typing.Optional[str] = None, **kwargs): + super().__init__(*args, **kwargs) + self.exclude_readonly = exclude_readonly + self.format = format + + def default(self, o): # pylint: disable=too-many-return-statements + if _is_model(o): + if self.exclude_readonly: + readonly_props = [p._rest_name for p in o._attr_to_rest_field.values() if _is_readonly(p)] + return {k: v for k, v in o.items() if k not in readonly_props} + return dict(o.items()) + try: + return super(SdkJSONEncoder, self).default(o) + except TypeError: + if isinstance(o, _Null): + return None + if isinstance(o, decimal.Decimal): + return float(o) + if isinstance(o, (bytes, bytearray)): + return _serialize_bytes(o, self.format) + try: + # First try datetime.datetime + return _serialize_datetime(o, self.format) + except AttributeError: + pass + # Last, try datetime.timedelta + try: + return _timedelta_as_isostr(o) + except AttributeError: + # This will be raised when it hits value.total_seconds in the method above + pass + return super(SdkJSONEncoder, self).default(o) + + +_VALID_DATE = re.compile(r"\d{4}[-]\d{2}[-]\d{2}T\d{2}:\d{2}:\d{2}" + r"\.?\d*Z?[-+]?[\d{2}]?:?[\d{2}]?") +_VALID_RFC7231 = re.compile( + r"(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s\d{2}\s" + r"(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d{4}\s\d{2}:\d{2}:\d{2}\sGMT" +) + + +def _deserialize_datetime(attr: typing.Union[str, datetime]) -> datetime: + """Deserialize ISO-8601 formatted string into Datetime object. + + :param str attr: response string to be deserialized. + :rtype: ~datetime.datetime + :returns: The datetime object from that input + """ + if isinstance(attr, datetime): + # i'm already deserialized + return attr + attr = attr.upper() + match = _VALID_DATE.match(attr) + if not match: + raise ValueError("Invalid datetime string: " + attr) + + check_decimal = attr.split(".") + if len(check_decimal) > 1: + decimal_str = "" + for digit in check_decimal[1]: + if digit.isdigit(): + decimal_str += digit + else: + break + if len(decimal_str) > 6: + attr = attr.replace(decimal_str, decimal_str[0:6]) + + date_obj = isodate.parse_datetime(attr) + test_utc = date_obj.utctimetuple() + if test_utc.tm_year > 9999 or test_utc.tm_year < 1: + raise OverflowError("Hit max or min date") + return date_obj + + +def _deserialize_datetime_rfc7231(attr: typing.Union[str, datetime]) -> datetime: + """Deserialize RFC7231 formatted string into Datetime object. + + :param str attr: response string to be deserialized. + :rtype: ~datetime.datetime + :returns: The datetime object from that input + """ + if isinstance(attr, datetime): + # i'm already deserialized + return attr + match = _VALID_RFC7231.match(attr) + if not match: + raise ValueError("Invalid datetime string: " + attr) + + return email.utils.parsedate_to_datetime(attr) + + +def _deserialize_datetime_unix_timestamp(attr: typing.Union[float, datetime]) -> datetime: + """Deserialize unix timestamp into Datetime object. + + :param str attr: response string to be deserialized. + :rtype: ~datetime.datetime + :returns: The datetime object from that input + """ + if isinstance(attr, datetime): + # i'm already deserialized + return attr + return datetime.fromtimestamp(attr, TZ_UTC) + + +def _deserialize_date(attr: typing.Union[str, date]) -> date: + """Deserialize ISO-8601 formatted string into Date object. + :param str attr: response string to be deserialized. + :rtype: date + :returns: The date object from that input + """ + # This must NOT use defaultmonth/defaultday. Using None ensure this raises an exception. + if isinstance(attr, date): + return attr + return isodate.parse_date(attr, defaultmonth=None, defaultday=None) # type: ignore + + +def _deserialize_time(attr: typing.Union[str, time]) -> time: + """Deserialize ISO-8601 formatted string into time object. + + :param str attr: response string to be deserialized. + :rtype: datetime.time + :returns: The time object from that input + """ + if isinstance(attr, time): + return attr + return isodate.parse_time(attr) + + +def _deserialize_bytes(attr): + if isinstance(attr, (bytes, bytearray)): + return attr + return bytes(base64.b64decode(attr)) + + +def _deserialize_bytes_base64(attr): + if isinstance(attr, (bytes, bytearray)): + return attr + padding = "=" * (3 - (len(attr) + 3) % 4) # type: ignore + attr = attr + padding # type: ignore + encoded = attr.replace("-", "+").replace("_", "/") + return bytes(base64.b64decode(encoded)) + + +def _deserialize_duration(attr): + if isinstance(attr, timedelta): + return attr + return isodate.parse_duration(attr) + + +def _deserialize_decimal(attr): + if isinstance(attr, decimal.Decimal): + return attr + return decimal.Decimal(str(attr)) + + +def _deserialize_int_as_str(attr): + if isinstance(attr, int): + return attr + return int(attr) + + +_DESERIALIZE_MAPPING = { + datetime: _deserialize_datetime, + date: _deserialize_date, + time: _deserialize_time, + bytes: _deserialize_bytes, + bytearray: _deserialize_bytes, + timedelta: _deserialize_duration, + typing.Any: lambda x: x, + decimal.Decimal: _deserialize_decimal, +} + +_DESERIALIZE_MAPPING_WITHFORMAT = { + "rfc3339": _deserialize_datetime, + "rfc7231": _deserialize_datetime_rfc7231, + "unix-timestamp": _deserialize_datetime_unix_timestamp, + "base64": _deserialize_bytes, + "base64url": _deserialize_bytes_base64, +} + + +def get_deserializer(annotation: typing.Any, rf: typing.Optional["_RestField"] = None): + if annotation is int and rf and rf._format == "str": + return _deserialize_int_as_str + if rf and rf._format: + return _DESERIALIZE_MAPPING_WITHFORMAT.get(rf._format) + return _DESERIALIZE_MAPPING.get(annotation) # pyright: ignore + + +def _get_type_alias_type(module_name: str, alias_name: str): + types = { + k: v + for k, v in sys.modules[module_name].__dict__.items() + if isinstance(v, typing._GenericAlias) # type: ignore + } + if alias_name not in types: + return alias_name + return types[alias_name] + + +def _get_model(module_name: str, model_name: str): + models = {k: v for k, v in sys.modules[module_name].__dict__.items() if isinstance(v, type)} + module_end = module_name.rsplit(".", 1)[0] + models.update({k: v for k, v in sys.modules[module_end].__dict__.items() if isinstance(v, type)}) + if isinstance(model_name, str): + model_name = model_name.split(".")[-1] + if model_name not in models: + return model_name + return models[model_name] + + +_UNSET = object() + + +class _MyMutableMapping(MutableMapping[str, typing.Any]): # pylint: disable=unsubscriptable-object + def __init__(self, data: typing.Dict[str, typing.Any]) -> None: + self._data = data + + def __contains__(self, key: typing.Any) -> bool: + return key in self._data + + def __getitem__(self, key: str) -> typing.Any: + return self._data.__getitem__(key) + + def __setitem__(self, key: str, value: typing.Any) -> None: + self._data.__setitem__(key, value) + + def __delitem__(self, key: str) -> None: + self._data.__delitem__(key) + + def __iter__(self) -> typing.Iterator[typing.Any]: + return self._data.__iter__() + + def __len__(self) -> int: + return self._data.__len__() + + def __ne__(self, other: typing.Any) -> bool: + return not self.__eq__(other) + + def keys(self) -> typing.KeysView[str]: + """ + :returns: a set-like object providing a view on D's keys + :rtype: ~typing.KeysView + """ + return self._data.keys() + + def values(self) -> typing.ValuesView[typing.Any]: + """ + :returns: an object providing a view on D's values + :rtype: ~typing.ValuesView + """ + return self._data.values() + + def items(self) -> typing.ItemsView[str, typing.Any]: + """ + :returns: set-like object providing a view on D's items + :rtype: ~typing.ItemsView + """ + return self._data.items() + + def get(self, key: str, default: typing.Any = None) -> typing.Any: + """ + Get the value for key if key is in the dictionary, else default. + :param str key: The key to look up. + :param any default: The value to return if key is not in the dictionary. Defaults to None + :returns: D[k] if k in D, else d. + :rtype: any + """ + try: + return self[key] + except KeyError: + return default + + @typing.overload + def pop(self, key: str) -> typing.Any: ... + + @typing.overload + def pop(self, key: str, default: _T) -> _T: ... + + @typing.overload + def pop(self, key: str, default: typing.Any) -> typing.Any: ... + + def pop(self, key: str, default: typing.Any = _UNSET) -> typing.Any: + """ + Removes specified key and return the corresponding value. + :param str key: The key to pop. + :param any default: The value to return if key is not in the dictionary + :returns: The value corresponding to the key. + :rtype: any + :raises KeyError: If key is not found and default is not given. + """ + if default is _UNSET: + return self._data.pop(key) + return self._data.pop(key, default) + + def popitem(self) -> typing.Tuple[str, typing.Any]: + """ + Removes and returns some (key, value) pair + :returns: The (key, value) pair. + :rtype: tuple + :raises KeyError: if D is empty. + """ + return self._data.popitem() + + def clear(self) -> None: + """ + Remove all items from D. + """ + self._data.clear() + + def update(self, *args: typing.Any, **kwargs: typing.Any) -> None: + """ + Updates D from mapping/iterable E and F. + :param any args: Either a mapping object or an iterable of key-value pairs. + """ + self._data.update(*args, **kwargs) + + @typing.overload + def setdefault(self, key: str, default: None = None) -> None: ... + + @typing.overload + def setdefault(self, key: str, default: typing.Any) -> typing.Any: ... + + def setdefault(self, key: str, default: typing.Any = _UNSET) -> typing.Any: + """ + Same as calling D.get(k, d), and setting D[k]=d if k not found + :param str key: The key to look up. + :param any default: The value to set if key is not in the dictionary + :returns: D[k] if k in D, else d. + :rtype: any + """ + if default is _UNSET: + return self._data.setdefault(key) + return self._data.setdefault(key, default) + + def __eq__(self, other: typing.Any) -> bool: + try: + other_model = self.__class__(other) + except Exception: + return False + return self._data == other_model._data + + def __repr__(self) -> str: + return str(self._data) + + +def _is_model(obj: typing.Any) -> bool: + return getattr(obj, "_is_model", False) + + +def _serialize(o, format: typing.Optional[str] = None): # pylint: disable=too-many-return-statements + if isinstance(o, list): + return [_serialize(x, format) for x in o] + if isinstance(o, dict): + return {k: _serialize(v, format) for k, v in o.items()} + if isinstance(o, set): + return {_serialize(x, format) for x in o} + if isinstance(o, tuple): + return tuple(_serialize(x, format) for x in o) + if isinstance(o, (bytes, bytearray)): + return _serialize_bytes(o, format) + if isinstance(o, decimal.Decimal): + return float(o) + if isinstance(o, enum.Enum): + return o.value + if isinstance(o, int): + if format == "str": + return str(o) + return o + try: + # First try datetime.datetime + return _serialize_datetime(o, format) + except AttributeError: + pass + # Last, try datetime.timedelta + try: + return _timedelta_as_isostr(o) + except AttributeError: + # This will be raised when it hits value.total_seconds in the method above + pass + return o + + +def _get_rest_field( + attr_to_rest_field: typing.Dict[str, "_RestField"], rest_name: str +) -> typing.Optional["_RestField"]: + try: + return next(rf for rf in attr_to_rest_field.values() if rf._rest_name == rest_name) + except StopIteration: + return None + + +def _create_value(rf: typing.Optional["_RestField"], value: typing.Any) -> typing.Any: + if not rf: + return _serialize(value, None) + if rf._is_multipart_file_input: + return value + if rf._is_model: + return _deserialize(rf._type, value) + if isinstance(value, ET.Element): + value = _deserialize(rf._type, value) + return _serialize(value, rf._format) + + +class Model(_MyMutableMapping): + _is_model = True + # label whether current class's _attr_to_rest_field has been calculated + # could not see _attr_to_rest_field directly because subclass inherits it from parent class + _calculated: typing.Set[str] = set() + + def __init__(self, *args: typing.Any, **kwargs: typing.Any) -> None: + class_name = self.__class__.__name__ + if len(args) > 1: + raise TypeError(f"{class_name}.__init__() takes 2 positional arguments but {len(args) + 1} were given") + dict_to_pass = { + rest_field._rest_name: rest_field._default + for rest_field in self._attr_to_rest_field.values() + if rest_field._default is not _UNSET + } + if args: # pylint: disable=too-many-nested-blocks + if isinstance(args[0], ET.Element): + existed_attr_keys = [] + model_meta = getattr(self, "_xml", {}) + + for rf in self._attr_to_rest_field.values(): + prop_meta = getattr(rf, "_xml", {}) + xml_name = prop_meta.get("name", rf._rest_name) + xml_ns = prop_meta.get("ns", model_meta.get("ns", None)) + if xml_ns: + xml_name = "{" + xml_ns + "}" + xml_name + + # attribute + if prop_meta.get("attribute", False) and args[0].get(xml_name) is not None: + existed_attr_keys.append(xml_name) + dict_to_pass[rf._rest_name] = _deserialize(rf._type, args[0].get(xml_name)) + continue + + # unwrapped element is array + if prop_meta.get("unwrapped", False): + # unwrapped array could either use prop items meta/prop meta + if prop_meta.get("itemsName"): + xml_name = prop_meta.get("itemsName") + xml_ns = prop_meta.get("itemNs") + if xml_ns: + xml_name = "{" + xml_ns + "}" + xml_name + items = args[0].findall(xml_name) # pyright: ignore + if len(items) > 0: + existed_attr_keys.append(xml_name) + dict_to_pass[rf._rest_name] = _deserialize(rf._type, items) + continue + + # text element is primitive type + if prop_meta.get("text", False): + if args[0].text is not None: + dict_to_pass[rf._rest_name] = _deserialize(rf._type, args[0].text) + continue + + # wrapped element could be normal property or array, it should only have one element + item = args[0].find(xml_name) + if item is not None: + existed_attr_keys.append(xml_name) + dict_to_pass[rf._rest_name] = _deserialize(rf._type, item) + + # rest thing is additional properties + for e in args[0]: + if e.tag not in existed_attr_keys: + dict_to_pass[e.tag] = _convert_element(e) + else: + dict_to_pass.update( + {k: _create_value(_get_rest_field(self._attr_to_rest_field, k), v) for k, v in args[0].items()} + ) + else: + non_attr_kwargs = [k for k in kwargs if k not in self._attr_to_rest_field] + if non_attr_kwargs: + # actual type errors only throw the first wrong keyword arg they see, so following that. + raise TypeError(f"{class_name}.__init__() got an unexpected keyword argument '{non_attr_kwargs[0]}'") + dict_to_pass.update( + { + self._attr_to_rest_field[k]._rest_name: _create_value(self._attr_to_rest_field[k], v) + for k, v in kwargs.items() + if v is not None + } + ) + super().__init__(dict_to_pass) + + def copy(self) -> "Model": + return Model(self.__dict__) + + def __new__(cls, *args: typing.Any, **kwargs: typing.Any) -> Self: + if f"{cls.__module__}.{cls.__qualname__}" not in cls._calculated: + # we know the last nine classes in mro are going to be 'Model', '_MyMutableMapping', 'MutableMapping', + # 'Mapping', 'Collection', 'Sized', 'Iterable', 'Container' and 'object' + mros = cls.__mro__[:-9][::-1] # ignore parents, and reverse the mro order + attr_to_rest_field: typing.Dict[str, _RestField] = { # map attribute name to rest_field property + k: v for mro_class in mros for k, v in mro_class.__dict__.items() if k[0] != "_" and hasattr(v, "_type") + } + annotations = { + k: v + for mro_class in mros + if hasattr(mro_class, "__annotations__") + for k, v in mro_class.__annotations__.items() + } + for attr, rf in attr_to_rest_field.items(): + rf._module = cls.__module__ + if not rf._type: + rf._type = rf._get_deserialize_callable_from_annotation(annotations.get(attr, None)) + if not rf._rest_name_input: + rf._rest_name_input = attr + cls._attr_to_rest_field: typing.Dict[str, _RestField] = dict(attr_to_rest_field.items()) + cls._calculated.add(f"{cls.__module__}.{cls.__qualname__}") + + return super().__new__(cls) # pylint: disable=no-value-for-parameter + + def __init_subclass__(cls, discriminator: typing.Optional[str] = None) -> None: + for base in cls.__bases__: + if hasattr(base, "__mapping__"): + base.__mapping__[discriminator or cls.__name__] = cls # type: ignore + + @classmethod + def _get_discriminator(cls, exist_discriminators) -> typing.Optional["_RestField"]: + for v in cls.__dict__.values(): + if isinstance(v, _RestField) and v._is_discriminator and v._rest_name not in exist_discriminators: + return v + return None + + @classmethod + def _deserialize(cls, data, exist_discriminators): + if not hasattr(cls, "__mapping__"): + return cls(data) + discriminator = cls._get_discriminator(exist_discriminators) + if discriminator is None: + return cls(data) + exist_discriminators.append(discriminator._rest_name) + if isinstance(data, ET.Element): + model_meta = getattr(cls, "_xml", {}) + prop_meta = getattr(discriminator, "_xml", {}) + xml_name = prop_meta.get("name", discriminator._rest_name) + xml_ns = prop_meta.get("ns", model_meta.get("ns", None)) + if xml_ns: + xml_name = "{" + xml_ns + "}" + xml_name + + if data.get(xml_name) is not None: + discriminator_value = data.get(xml_name) + else: + discriminator_value = data.find(xml_name).text # pyright: ignore + else: + discriminator_value = data.get(discriminator._rest_name) + mapped_cls = cls.__mapping__.get(discriminator_value, cls) # pyright: ignore + return mapped_cls._deserialize(data, exist_discriminators) + + def as_dict(self, *, exclude_readonly: bool = False) -> typing.Dict[str, typing.Any]: + """Return a dict that can be turned into json using json.dump. + + :keyword bool exclude_readonly: Whether to remove the readonly properties. + :returns: A dict JSON compatible object + :rtype: dict + """ + + result = {} + readonly_props = [] + if exclude_readonly: + readonly_props = [p._rest_name for p in self._attr_to_rest_field.values() if _is_readonly(p)] + for k, v in self.items(): + if exclude_readonly and k in readonly_props: # pyright: ignore + continue + is_multipart_file_input = False + try: + is_multipart_file_input = next( + rf for rf in self._attr_to_rest_field.values() if rf._rest_name == k + )._is_multipart_file_input + except StopIteration: + pass + result[k] = v if is_multipart_file_input else Model._as_dict_value(v, exclude_readonly=exclude_readonly) + return result + + @staticmethod + def _as_dict_value(v: typing.Any, exclude_readonly: bool = False) -> typing.Any: + if v is None or isinstance(v, _Null): + return None + if isinstance(v, (list, tuple, set)): + return type(v)(Model._as_dict_value(x, exclude_readonly=exclude_readonly) for x in v) + if isinstance(v, dict): + return {dk: Model._as_dict_value(dv, exclude_readonly=exclude_readonly) for dk, dv in v.items()} + return v.as_dict(exclude_readonly=exclude_readonly) if hasattr(v, "as_dict") else v + + +def _deserialize_model(model_deserializer: typing.Optional[typing.Callable], obj): + if _is_model(obj): + return obj + return _deserialize(model_deserializer, obj) + + +def _deserialize_with_optional(if_obj_deserializer: typing.Optional[typing.Callable], obj): + if obj is None: + return obj + return _deserialize_with_callable(if_obj_deserializer, obj) + + +def _deserialize_with_union(deserializers, obj): + for deserializer in deserializers: + try: + return _deserialize(deserializer, obj) + except DeserializationError: + pass + raise DeserializationError() + + +def _deserialize_dict( + value_deserializer: typing.Optional[typing.Callable], + module: typing.Optional[str], + obj: typing.Dict[typing.Any, typing.Any], +): + if obj is None: + return obj + if isinstance(obj, ET.Element): + obj = {child.tag: child for child in obj} + return {k: _deserialize(value_deserializer, v, module) for k, v in obj.items()} + + +def _deserialize_multiple_sequence( + entry_deserializers: typing.List[typing.Optional[typing.Callable]], + module: typing.Optional[str], + obj, +): + if obj is None: + return obj + return type(obj)(_deserialize(deserializer, entry, module) for entry, deserializer in zip(obj, entry_deserializers)) + + +def _deserialize_sequence( + deserializer: typing.Optional[typing.Callable], + module: typing.Optional[str], + obj, +): + if obj is None: + return obj + if isinstance(obj, ET.Element): + obj = list(obj) + return type(obj)(_deserialize(deserializer, entry, module) for entry in obj) + + +def _sorted_annotations(types: typing.List[typing.Any]) -> typing.List[typing.Any]: + return sorted( + types, + key=lambda x: hasattr(x, "__name__") and x.__name__.lower() in ("str", "float", "int", "bool"), + ) + + +def _get_deserialize_callable_from_annotation( # pylint: disable=too-many-return-statements, too-many-branches + annotation: typing.Any, + module: typing.Optional[str], + rf: typing.Optional["_RestField"] = None, +) -> typing.Optional[typing.Callable[[typing.Any], typing.Any]]: + if not annotation: + return None + + # is it a type alias? + if isinstance(annotation, str): + if module is not None: + annotation = _get_type_alias_type(module, annotation) + + # is it a forward ref / in quotes? + if isinstance(annotation, (str, typing.ForwardRef)): + try: + model_name = annotation.__forward_arg__ # type: ignore + except AttributeError: + model_name = annotation + if module is not None: + annotation = _get_model(module, model_name) # type: ignore + + try: + if module and _is_model(annotation): + if rf: + rf._is_model = True + + return functools.partial(_deserialize_model, annotation) # pyright: ignore + except Exception: + pass + + # is it a literal? + try: + if annotation.__origin__ is typing.Literal: # pyright: ignore + return None + except AttributeError: + pass + + # is it optional? + try: + if any(a for a in annotation.__args__ if a == type(None)): # pyright: ignore + if len(annotation.__args__) <= 2: # pyright: ignore + if_obj_deserializer = _get_deserialize_callable_from_annotation( + next(a for a in annotation.__args__ if a != type(None)), module, rf # pyright: ignore + ) + + return functools.partial(_deserialize_with_optional, if_obj_deserializer) + # the type is Optional[Union[...]], we need to remove the None type from the Union + annotation_copy = copy.copy(annotation) + annotation_copy.__args__ = [a for a in annotation_copy.__args__ if a != type(None)] # pyright: ignore + return _get_deserialize_callable_from_annotation(annotation_copy, module, rf) + except AttributeError: + pass + + # is it union? + if getattr(annotation, "__origin__", None) is typing.Union: + # initial ordering is we make `string` the last deserialization option, because it is often them most generic + deserializers = [ + _get_deserialize_callable_from_annotation(arg, module, rf) + for arg in _sorted_annotations(annotation.__args__) # pyright: ignore + ] + + return functools.partial(_deserialize_with_union, deserializers) + + try: + if annotation._name == "Dict": # pyright: ignore + value_deserializer = _get_deserialize_callable_from_annotation( + annotation.__args__[1], module, rf # pyright: ignore + ) + + return functools.partial( + _deserialize_dict, + value_deserializer, + module, + ) + except (AttributeError, IndexError): + pass + try: + if annotation._name in ["List", "Set", "Tuple", "Sequence"]: # pyright: ignore + if len(annotation.__args__) > 1: # pyright: ignore + entry_deserializers = [ + _get_deserialize_callable_from_annotation(dt, module, rf) + for dt in annotation.__args__ # pyright: ignore + ] + return functools.partial(_deserialize_multiple_sequence, entry_deserializers, module) + deserializer = _get_deserialize_callable_from_annotation( + annotation.__args__[0], module, rf # pyright: ignore + ) + + return functools.partial(_deserialize_sequence, deserializer, module) + except (TypeError, IndexError, AttributeError, SyntaxError): + pass + + def _deserialize_default( + deserializer, + obj, + ): + if obj is None: + return obj + try: + return _deserialize_with_callable(deserializer, obj) + except Exception: + pass + return obj + + if get_deserializer(annotation, rf): + return functools.partial(_deserialize_default, get_deserializer(annotation, rf)) + + return functools.partial(_deserialize_default, annotation) + + +def _deserialize_with_callable( + deserializer: typing.Optional[typing.Callable[[typing.Any], typing.Any]], + value: typing.Any, +): # pylint: disable=too-many-return-statements + try: + if value is None or isinstance(value, _Null): + return None + if isinstance(value, ET.Element): + if deserializer is str: + return value.text or "" + if deserializer is int: + return int(value.text) if value.text else None + if deserializer is float: + return float(value.text) if value.text else None + if deserializer is bool: + return value.text == "true" if value.text else None + if deserializer is None: + return value + if deserializer in [int, float, bool]: + return deserializer(value) + if isinstance(deserializer, CaseInsensitiveEnumMeta): + try: + return deserializer(value) + except ValueError: + # for unknown value, return raw value + return value + if isinstance(deserializer, type) and issubclass(deserializer, Model): + return deserializer._deserialize(value, []) + return typing.cast(typing.Callable[[typing.Any], typing.Any], deserializer)(value) + except Exception as e: + raise DeserializationError() from e + + +def _deserialize( + deserializer: typing.Any, + value: typing.Any, + module: typing.Optional[str] = None, + rf: typing.Optional["_RestField"] = None, + format: typing.Optional[str] = None, +) -> typing.Any: + if isinstance(value, PipelineResponse): + value = value.http_response.json() + if rf is None and format: + rf = _RestField(format=format) + if not isinstance(deserializer, functools.partial): + deserializer = _get_deserialize_callable_from_annotation(deserializer, module, rf) + return _deserialize_with_callable(deserializer, value) + + +def _failsafe_deserialize( + deserializer: typing.Any, + value: typing.Any, + module: typing.Optional[str] = None, + rf: typing.Optional["_RestField"] = None, + format: typing.Optional[str] = None, +) -> typing.Any: + try: + return _deserialize(deserializer, value, module, rf, format) + except DeserializationError: + _LOGGER.warning( + "Ran into a deserialization error. Ignoring since this is failsafe deserialization", exc_info=True + ) + return None + + +def _failsafe_deserialize_xml( + deserializer: typing.Any, + value: typing.Any, +) -> typing.Any: + try: + return _deserialize_xml(deserializer, value) + except DeserializationError: + _LOGGER.warning( + "Ran into a deserialization error. Ignoring since this is failsafe deserialization", exc_info=True + ) + return None + + +class _RestField: + def __init__( + self, + *, + name: typing.Optional[str] = None, + type: typing.Optional[typing.Callable] = None, # pylint: disable=redefined-builtin + is_discriminator: bool = False, + visibility: typing.Optional[typing.List[str]] = None, + default: typing.Any = _UNSET, + format: typing.Optional[str] = None, + is_multipart_file_input: bool = False, + xml: typing.Optional[typing.Dict[str, typing.Any]] = None, + ): + self._type = type + self._rest_name_input = name + self._module: typing.Optional[str] = None + self._is_discriminator = is_discriminator + self._visibility = visibility + self._is_model = False + self._default = default + self._format = format + self._is_multipart_file_input = is_multipart_file_input + self._xml = xml if xml is not None else {} + + @property + def _class_type(self) -> typing.Any: + return getattr(self._type, "args", [None])[0] + + @property + def _rest_name(self) -> str: + if self._rest_name_input is None: + raise ValueError("Rest name was never set") + return self._rest_name_input + + def __get__(self, obj: Model, type=None): # pylint: disable=redefined-builtin + # by this point, type and rest_name will have a value bc we default + # them in __new__ of the Model class + item = obj.get(self._rest_name) + if item is None: + return item + if self._is_model: + return item + return _deserialize(self._type, _serialize(item, self._format), rf=self) + + def __set__(self, obj: Model, value) -> None: + if value is None: + # we want to wipe out entries if users set attr to None + try: + obj.__delitem__(self._rest_name) + except KeyError: + pass + return + if self._is_model: + if not _is_model(value): + value = _deserialize(self._type, value) + obj.__setitem__(self._rest_name, value) + return + obj.__setitem__(self._rest_name, _serialize(value, self._format)) + + def _get_deserialize_callable_from_annotation( + self, annotation: typing.Any + ) -> typing.Optional[typing.Callable[[typing.Any], typing.Any]]: + return _get_deserialize_callable_from_annotation(annotation, self._module, self) + + +def rest_field( + *, + name: typing.Optional[str] = None, + type: typing.Optional[typing.Callable] = None, # pylint: disable=redefined-builtin + visibility: typing.Optional[typing.List[str]] = None, + default: typing.Any = _UNSET, + format: typing.Optional[str] = None, + is_multipart_file_input: bool = False, + xml: typing.Optional[typing.Dict[str, typing.Any]] = None, +) -> typing.Any: + return _RestField( + name=name, + type=type, + visibility=visibility, + default=default, + format=format, + is_multipart_file_input=is_multipart_file_input, + xml=xml, + ) + + +def rest_discriminator( + *, + name: typing.Optional[str] = None, + type: typing.Optional[typing.Callable] = None, # pylint: disable=redefined-builtin + visibility: typing.Optional[typing.List[str]] = None, + xml: typing.Optional[typing.Dict[str, typing.Any]] = None, +) -> typing.Any: + return _RestField(name=name, type=type, is_discriminator=True, visibility=visibility, xml=xml) + + +def serialize_xml(model: Model, exclude_readonly: bool = False) -> str: + """Serialize a model to XML. + + :param Model model: The model to serialize. + :param bool exclude_readonly: Whether to exclude readonly properties. + :returns: The XML representation of the model. + :rtype: str + """ + return ET.tostring(_get_element(model, exclude_readonly), encoding="unicode") # type: ignore + + +def _get_element( + o: typing.Any, + exclude_readonly: bool = False, + parent_meta: typing.Optional[typing.Dict[str, typing.Any]] = None, + wrapped_element: typing.Optional[ET.Element] = None, +) -> typing.Union[ET.Element, typing.List[ET.Element]]: + if _is_model(o): + model_meta = getattr(o, "_xml", {}) + + # if prop is a model, then use the prop element directly, else generate a wrapper of model + if wrapped_element is None: + wrapped_element = _create_xml_element( + model_meta.get("name", o.__class__.__name__), + model_meta.get("prefix"), + model_meta.get("ns"), + ) + + readonly_props = [] + if exclude_readonly: + readonly_props = [p._rest_name for p in o._attr_to_rest_field.values() if _is_readonly(p)] + + for k, v in o.items(): + # do not serialize readonly properties + if exclude_readonly and k in readonly_props: + continue + + prop_rest_field = _get_rest_field(o._attr_to_rest_field, k) + if prop_rest_field: + prop_meta = getattr(prop_rest_field, "_xml").copy() + # use the wire name as xml name if no specific name is set + if prop_meta.get("name") is None: + prop_meta["name"] = k + else: + # additional properties will not have rest field, use the wire name as xml name + prop_meta = {"name": k} + + # if no ns for prop, use model's + if prop_meta.get("ns") is None and model_meta.get("ns"): + prop_meta["ns"] = model_meta.get("ns") + prop_meta["prefix"] = model_meta.get("prefix") + + if prop_meta.get("unwrapped", False): + # unwrapped could only set on array + wrapped_element.extend(_get_element(v, exclude_readonly, prop_meta)) + elif prop_meta.get("text", False): + # text could only set on primitive type + wrapped_element.text = _get_primitive_type_value(v) + elif prop_meta.get("attribute", False): + xml_name = prop_meta.get("name", k) + if prop_meta.get("ns"): + ET.register_namespace(prop_meta.get("prefix"), prop_meta.get("ns")) # pyright: ignore + xml_name = "{" + prop_meta.get("ns") + "}" + xml_name # pyright: ignore + # attribute should be primitive type + wrapped_element.set(xml_name, _get_primitive_type_value(v)) + else: + # other wrapped prop element + wrapped_element.append(_get_wrapped_element(v, exclude_readonly, prop_meta)) + return wrapped_element + if isinstance(o, list): + return [_get_element(x, exclude_readonly, parent_meta) for x in o] # type: ignore + if isinstance(o, dict): + result = [] + for k, v in o.items(): + result.append( + _get_wrapped_element( + v, + exclude_readonly, + { + "name": k, + "ns": parent_meta.get("ns") if parent_meta else None, + "prefix": parent_meta.get("prefix") if parent_meta else None, + }, + ) + ) + return result + + # primitive case need to create element based on parent_meta + if parent_meta: + return _get_wrapped_element( + o, + exclude_readonly, + { + "name": parent_meta.get("itemsName", parent_meta.get("name")), + "prefix": parent_meta.get("itemsPrefix", parent_meta.get("prefix")), + "ns": parent_meta.get("itemsNs", parent_meta.get("ns")), + }, + ) + + raise ValueError("Could not serialize value into xml: " + o) + + +def _get_wrapped_element( + v: typing.Any, + exclude_readonly: bool, + meta: typing.Optional[typing.Dict[str, typing.Any]], +) -> ET.Element: + wrapped_element = _create_xml_element( + meta.get("name") if meta else None, meta.get("prefix") if meta else None, meta.get("ns") if meta else None + ) + if isinstance(v, (dict, list)): + wrapped_element.extend(_get_element(v, exclude_readonly, meta)) + elif _is_model(v): + _get_element(v, exclude_readonly, meta, wrapped_element) + else: + wrapped_element.text = _get_primitive_type_value(v) + return wrapped_element + + +def _get_primitive_type_value(v) -> str: + if v is True: + return "true" + if v is False: + return "false" + if isinstance(v, _Null): + return "" + return str(v) + + +def _create_xml_element(tag, prefix=None, ns=None): + if prefix and ns: + ET.register_namespace(prefix, ns) + if ns: + return ET.Element("{" + ns + "}" + tag) + return ET.Element(tag) + + +def _deserialize_xml( + deserializer: typing.Any, + value: str, +) -> typing.Any: + element = ET.fromstring(value) # nosec + return _deserialize(deserializer, element) + + +def _convert_element(e: ET.Element): + # dict case + if len(e.attrib) > 0 or len({child.tag for child in e}) > 1: + dict_result: typing.Dict[str, typing.Any] = {} + for child in e: + if dict_result.get(child.tag) is not None: + if isinstance(dict_result[child.tag], list): + dict_result[child.tag].append(_convert_element(child)) + else: + dict_result[child.tag] = [dict_result[child.tag], _convert_element(child)] + else: + dict_result[child.tag] = _convert_element(child) + dict_result.update(e.attrib) + return dict_result + # array case + if len(e) > 0: + array_result: typing.List[typing.Any] = [] + for child in e: + array_result.append(_convert_element(child)) + return array_result + # primitive case + return e.text diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/_patch.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/_patch.py new file mode 100644 index 000000000000..1bb0db275def --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/_patch.py @@ -0,0 +1,20 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +"""Customize generated code here. + +Follow our quickstart for examples: https://aka.ms/azsdk/python/dpcodegen/python/customize +""" +from typing import List + +__all__: List[str] = [] # Add all objects you want publicly available to users at this package level + + +def patch_sdk(): + """Do not remove from this file. + + `patch_sdk` is a last resort escape hatch that allows you to do customizations + you can't accomplish using the techniques described in + https://aka.ms/azsdk/python/dpcodegen/python/customize + """ diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/_serialization.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/_serialization.py new file mode 100644 index 000000000000..4e19fcc0ec7a --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/_serialization.py @@ -0,0 +1,2050 @@ +# pylint: disable=line-too-long,useless-suppression,too-many-lines +# -------------------------------------------------------------------------- +# +# Copyright (c) Microsoft Corporation. All rights reserved. +# +# The MIT License (MIT) +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the ""Software""), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +# IN THE SOFTWARE. +# +# -------------------------------------------------------------------------- + +# pyright: reportUnnecessaryTypeIgnoreComment=false + +from base64 import b64decode, b64encode +import calendar +import datetime +import decimal +import email +from enum import Enum +import json +import logging +import re +import sys +import codecs +from typing import ( + Dict, + Any, + cast, + Optional, + Union, + AnyStr, + IO, + Mapping, + Callable, + MutableMapping, + List, +) + +try: + from urllib import quote # type: ignore +except ImportError: + from urllib.parse import quote +import xml.etree.ElementTree as ET + +import isodate # type: ignore +from typing_extensions import Self + +from azure.core.exceptions import DeserializationError, SerializationError +from azure.core.serialization import NULL as CoreNull + +_BOM = codecs.BOM_UTF8.decode(encoding="utf-8") + +JSON = MutableMapping[str, Any] + + +class RawDeserializer: + + # Accept "text" because we're open minded people... + JSON_REGEXP = re.compile(r"^(application|text)/([a-z+.]+\+)?json$") + + # Name used in context + CONTEXT_NAME = "deserialized_data" + + @classmethod + def deserialize_from_text(cls, data: Optional[Union[AnyStr, IO]], content_type: Optional[str] = None) -> Any: + """Decode data according to content-type. + + Accept a stream of data as well, but will be load at once in memory for now. + + If no content-type, will return the string version (not bytes, not stream) + + :param data: Input, could be bytes or stream (will be decoded with UTF8) or text + :type data: str or bytes or IO + :param str content_type: The content type. + :return: The deserialized data. + :rtype: object + """ + if hasattr(data, "read"): + # Assume a stream + data = cast(IO, data).read() + + if isinstance(data, bytes): + data_as_str = data.decode(encoding="utf-8-sig") + else: + # Explain to mypy the correct type. + data_as_str = cast(str, data) + + # Remove Byte Order Mark if present in string + data_as_str = data_as_str.lstrip(_BOM) + + if content_type is None: + return data + + if cls.JSON_REGEXP.match(content_type): + try: + return json.loads(data_as_str) + except ValueError as err: + raise DeserializationError("JSON is invalid: {}".format(err), err) from err + elif "xml" in (content_type or []): + try: + + try: + if isinstance(data, unicode): # type: ignore + # If I'm Python 2.7 and unicode XML will scream if I try a "fromstring" on unicode string + data_as_str = data_as_str.encode(encoding="utf-8") # type: ignore + except NameError: + pass + + return ET.fromstring(data_as_str) # nosec + except ET.ParseError as err: + # It might be because the server has an issue, and returned JSON with + # content-type XML.... + # So let's try a JSON load, and if it's still broken + # let's flow the initial exception + def _json_attemp(data): + try: + return True, json.loads(data) + except ValueError: + return False, None # Don't care about this one + + success, json_result = _json_attemp(data) + if success: + return json_result + # If i'm here, it's not JSON, it's not XML, let's scream + # and raise the last context in this block (the XML exception) + # The function hack is because Py2.7 messes up with exception + # context otherwise. + _LOGGER.critical("Wasn't XML not JSON, failing") + raise DeserializationError("XML is invalid") from err + elif content_type.startswith("text/"): + return data_as_str + raise DeserializationError("Cannot deserialize content-type: {}".format(content_type)) + + @classmethod + def deserialize_from_http_generics(cls, body_bytes: Optional[Union[AnyStr, IO]], headers: Mapping) -> Any: + """Deserialize from HTTP response. + + Use bytes and headers to NOT use any requests/aiohttp or whatever + specific implementation. + Headers will tested for "content-type" + + :param bytes body_bytes: The body of the response. + :param dict headers: The headers of the response. + :returns: The deserialized data. + :rtype: object + """ + # Try to use content-type from headers if available + content_type = None + if "content-type" in headers: + content_type = headers["content-type"].split(";")[0].strip().lower() + # Ouch, this server did not declare what it sent... + # Let's guess it's JSON... + # Also, since Autorest was considering that an empty body was a valid JSON, + # need that test as well.... + else: + content_type = "application/json" + + if body_bytes: + return cls.deserialize_from_text(body_bytes, content_type) + return None + + +_LOGGER = logging.getLogger(__name__) + +try: + _long_type = long # type: ignore +except NameError: + _long_type = int + +TZ_UTC = datetime.timezone.utc + +_FLATTEN = re.compile(r"(? None: + self.additional_properties: Optional[Dict[str, Any]] = {} + for k in kwargs: # pylint: disable=consider-using-dict-items + if k not in self._attribute_map: + _LOGGER.warning("%s is not a known attribute of class %s and will be ignored", k, self.__class__) + elif k in self._validation and self._validation[k].get("readonly", False): + _LOGGER.warning("Readonly attribute %s will be ignored in class %s", k, self.__class__) + else: + setattr(self, k, kwargs[k]) + + def __eq__(self, other: Any) -> bool: + """Compare objects by comparing all attributes. + + :param object other: The object to compare + :returns: True if objects are equal + :rtype: bool + """ + if isinstance(other, self.__class__): + return self.__dict__ == other.__dict__ + return False + + def __ne__(self, other: Any) -> bool: + """Compare objects by comparing all attributes. + + :param object other: The object to compare + :returns: True if objects are not equal + :rtype: bool + """ + return not self.__eq__(other) + + def __str__(self) -> str: + return str(self.__dict__) + + @classmethod + def enable_additional_properties_sending(cls) -> None: + cls._attribute_map["additional_properties"] = {"key": "", "type": "{object}"} + + @classmethod + def is_xml_model(cls) -> bool: + try: + cls._xml_map # type: ignore + except AttributeError: + return False + return True + + @classmethod + def _create_xml_node(cls): + """Create XML node. + + :returns: The XML node + :rtype: xml.etree.ElementTree.Element + """ + try: + xml_map = cls._xml_map # type: ignore + except AttributeError: + xml_map = {} + + return _create_xml_node(xml_map.get("name", cls.__name__), xml_map.get("prefix", None), xml_map.get("ns", None)) + + def serialize(self, keep_readonly: bool = False, **kwargs: Any) -> JSON: + """Return the JSON that would be sent to server from this model. + + This is an alias to `as_dict(full_restapi_key_transformer, keep_readonly=False)`. + + If you want XML serialization, you can pass the kwargs is_xml=True. + + :param bool keep_readonly: If you want to serialize the readonly attributes + :returns: A dict JSON compatible object + :rtype: dict + """ + serializer = Serializer(self._infer_class_models()) + return serializer._serialize( # type: ignore # pylint: disable=protected-access + self, keep_readonly=keep_readonly, **kwargs + ) + + def as_dict( + self, + keep_readonly: bool = True, + key_transformer: Callable[[str, Dict[str, Any], Any], Any] = attribute_transformer, + **kwargs: Any + ) -> JSON: + """Return a dict that can be serialized using json.dump. + + Advanced usage might optionally use a callback as parameter: + + .. code::python + + def my_key_transformer(key, attr_desc, value): + return key + + Key is the attribute name used in Python. Attr_desc + is a dict of metadata. Currently contains 'type' with the + msrest type and 'key' with the RestAPI encoded key. + Value is the current value in this object. + + The string returned will be used to serialize the key. + If the return type is a list, this is considered hierarchical + result dict. + + See the three examples in this file: + + - attribute_transformer + - full_restapi_key_transformer + - last_restapi_key_transformer + + If you want XML serialization, you can pass the kwargs is_xml=True. + + :param bool keep_readonly: If you want to serialize the readonly attributes + :param function key_transformer: A key transformer function. + :returns: A dict JSON compatible object + :rtype: dict + """ + serializer = Serializer(self._infer_class_models()) + return serializer._serialize( # type: ignore # pylint: disable=protected-access + self, key_transformer=key_transformer, keep_readonly=keep_readonly, **kwargs + ) + + @classmethod + def _infer_class_models(cls): + try: + str_models = cls.__module__.rsplit(".", 1)[0] + models = sys.modules[str_models] + client_models = {k: v for k, v in models.__dict__.items() if isinstance(v, type)} + if cls.__name__ not in client_models: + raise ValueError("Not Autorest generated code") + except Exception: # pylint: disable=broad-exception-caught + # Assume it's not Autorest generated (tests?). Add ourselves as dependencies. + client_models = {cls.__name__: cls} + return client_models + + @classmethod + def deserialize(cls, data: Any, content_type: Optional[str] = None) -> Self: + """Parse a str using the RestAPI syntax and return a model. + + :param str data: A str using RestAPI structure. JSON by default. + :param str content_type: JSON by default, set application/xml if XML. + :returns: An instance of this model + :raises DeserializationError: if something went wrong + :rtype: Self + """ + deserializer = Deserializer(cls._infer_class_models()) + return deserializer(cls.__name__, data, content_type=content_type) # type: ignore + + @classmethod + def from_dict( + cls, + data: Any, + key_extractors: Optional[Callable[[str, Dict[str, Any], Any], Any]] = None, + content_type: Optional[str] = None, + ) -> Self: + """Parse a dict using given key extractor return a model. + + By default consider key + extractors (rest_key_case_insensitive_extractor, attribute_key_case_insensitive_extractor + and last_rest_key_case_insensitive_extractor) + + :param dict data: A dict using RestAPI structure + :param function key_extractors: A key extractor function. + :param str content_type: JSON by default, set application/xml if XML. + :returns: An instance of this model + :raises DeserializationError: if something went wrong + :rtype: Self + """ + deserializer = Deserializer(cls._infer_class_models()) + deserializer.key_extractors = ( # type: ignore + [ # type: ignore + attribute_key_case_insensitive_extractor, + rest_key_case_insensitive_extractor, + last_rest_key_case_insensitive_extractor, + ] + if key_extractors is None + else key_extractors + ) + return deserializer(cls.__name__, data, content_type=content_type) # type: ignore + + @classmethod + def _flatten_subtype(cls, key, objects): + if "_subtype_map" not in cls.__dict__: + return {} + result = dict(cls._subtype_map[key]) + for valuetype in cls._subtype_map[key].values(): + result.update(objects[valuetype]._flatten_subtype(key, objects)) # pylint: disable=protected-access + return result + + @classmethod + def _classify(cls, response, objects): + """Check the class _subtype_map for any child classes. + We want to ignore any inherited _subtype_maps. + + :param dict response: The initial data + :param dict objects: The class objects + :returns: The class to be used + :rtype: class + """ + for subtype_key in cls.__dict__.get("_subtype_map", {}).keys(): + subtype_value = None + + if not isinstance(response, ET.Element): + rest_api_response_key = cls._get_rest_key_parts(subtype_key)[-1] + subtype_value = response.get(rest_api_response_key, None) or response.get(subtype_key, None) + else: + subtype_value = xml_key_extractor(subtype_key, cls._attribute_map[subtype_key], response) + if subtype_value: + # Try to match base class. Can be class name only + # (bug to fix in Autorest to support x-ms-discriminator-name) + if cls.__name__ == subtype_value: + return cls + flatten_mapping_type = cls._flatten_subtype(subtype_key, objects) + try: + return objects[flatten_mapping_type[subtype_value]] # type: ignore + except KeyError: + _LOGGER.warning( + "Subtype value %s has no mapping, use base class %s.", + subtype_value, + cls.__name__, + ) + break + else: + _LOGGER.warning("Discriminator %s is absent or null, use base class %s.", subtype_key, cls.__name__) + break + return cls + + @classmethod + def _get_rest_key_parts(cls, attr_key): + """Get the RestAPI key of this attr, split it and decode part + :param str attr_key: Attribute key must be in attribute_map. + :returns: A list of RestAPI part + :rtype: list + """ + rest_split_key = _FLATTEN.split(cls._attribute_map[attr_key]["key"]) + return [_decode_attribute_map_key(key_part) for key_part in rest_split_key] + + +def _decode_attribute_map_key(key): + """This decode a key in an _attribute_map to the actual key we want to look at + inside the received data. + + :param str key: A key string from the generated code + :returns: The decoded key + :rtype: str + """ + return key.replace("\\.", ".") + + +class Serializer: # pylint: disable=too-many-public-methods + """Request object model serializer.""" + + basic_types = {str: "str", int: "int", bool: "bool", float: "float"} + + _xml_basic_types_serializers = {"bool": lambda x: str(x).lower()} + days = {0: "Mon", 1: "Tue", 2: "Wed", 3: "Thu", 4: "Fri", 5: "Sat", 6: "Sun"} + months = { + 1: "Jan", + 2: "Feb", + 3: "Mar", + 4: "Apr", + 5: "May", + 6: "Jun", + 7: "Jul", + 8: "Aug", + 9: "Sep", + 10: "Oct", + 11: "Nov", + 12: "Dec", + } + validation = { + "min_length": lambda x, y: len(x) < y, + "max_length": lambda x, y: len(x) > y, + "minimum": lambda x, y: x < y, + "maximum": lambda x, y: x > y, + "minimum_ex": lambda x, y: x <= y, + "maximum_ex": lambda x, y: x >= y, + "min_items": lambda x, y: len(x) < y, + "max_items": lambda x, y: len(x) > y, + "pattern": lambda x, y: not re.match(y, x, re.UNICODE), + "unique": lambda x, y: len(x) != len(set(x)), + "multiple": lambda x, y: x % y != 0, + } + + def __init__(self, classes: Optional[Mapping[str, type]] = None) -> None: + self.serialize_type = { + "iso-8601": Serializer.serialize_iso, + "rfc-1123": Serializer.serialize_rfc, + "unix-time": Serializer.serialize_unix, + "duration": Serializer.serialize_duration, + "date": Serializer.serialize_date, + "time": Serializer.serialize_time, + "decimal": Serializer.serialize_decimal, + "long": Serializer.serialize_long, + "bytearray": Serializer.serialize_bytearray, + "base64": Serializer.serialize_base64, + "object": self.serialize_object, + "[]": self.serialize_iter, + "{}": self.serialize_dict, + } + self.dependencies: Dict[str, type] = dict(classes) if classes else {} + self.key_transformer = full_restapi_key_transformer + self.client_side_validation = True + + def _serialize( # pylint: disable=too-many-nested-blocks, too-many-branches, too-many-statements, too-many-locals + self, target_obj, data_type=None, **kwargs + ): + """Serialize data into a string according to type. + + :param object target_obj: The data to be serialized. + :param str data_type: The type to be serialized from. + :rtype: str, dict + :raises SerializationError: if serialization fails. + :returns: The serialized data. + """ + key_transformer = kwargs.get("key_transformer", self.key_transformer) + keep_readonly = kwargs.get("keep_readonly", False) + if target_obj is None: + return None + + attr_name = None + class_name = target_obj.__class__.__name__ + + if data_type: + return self.serialize_data(target_obj, data_type, **kwargs) + + if not hasattr(target_obj, "_attribute_map"): + data_type = type(target_obj).__name__ + if data_type in self.basic_types.values(): + return self.serialize_data(target_obj, data_type, **kwargs) + + # Force "is_xml" kwargs if we detect a XML model + try: + is_xml_model_serialization = kwargs["is_xml"] + except KeyError: + is_xml_model_serialization = kwargs.setdefault("is_xml", target_obj.is_xml_model()) + + serialized = {} + if is_xml_model_serialization: + serialized = target_obj._create_xml_node() # pylint: disable=protected-access + try: + attributes = target_obj._attribute_map # pylint: disable=protected-access + for attr, attr_desc in attributes.items(): + attr_name = attr + if not keep_readonly and target_obj._validation.get( # pylint: disable=protected-access + attr_name, {} + ).get("readonly", False): + continue + + if attr_name == "additional_properties" and attr_desc["key"] == "": + if target_obj.additional_properties is not None: + serialized.update(target_obj.additional_properties) + continue + try: + + orig_attr = getattr(target_obj, attr) + if is_xml_model_serialization: + pass # Don't provide "transformer" for XML for now. Keep "orig_attr" + else: # JSON + keys, orig_attr = key_transformer(attr, attr_desc.copy(), orig_attr) + keys = keys if isinstance(keys, list) else [keys] + + kwargs["serialization_ctxt"] = attr_desc + new_attr = self.serialize_data(orig_attr, attr_desc["type"], **kwargs) + + if is_xml_model_serialization: + xml_desc = attr_desc.get("xml", {}) + xml_name = xml_desc.get("name", attr_desc["key"]) + xml_prefix = xml_desc.get("prefix", None) + xml_ns = xml_desc.get("ns", None) + if xml_desc.get("attr", False): + if xml_ns: + ET.register_namespace(xml_prefix, xml_ns) + xml_name = "{{{}}}{}".format(xml_ns, xml_name) + serialized.set(xml_name, new_attr) # type: ignore + continue + if xml_desc.get("text", False): + serialized.text = new_attr # type: ignore + continue + if isinstance(new_attr, list): + serialized.extend(new_attr) # type: ignore + elif isinstance(new_attr, ET.Element): + # If the down XML has no XML/Name, + # we MUST replace the tag with the local tag. But keeping the namespaces. + if "name" not in getattr(orig_attr, "_xml_map", {}): + splitted_tag = new_attr.tag.split("}") + if len(splitted_tag) == 2: # Namespace + new_attr.tag = "}".join([splitted_tag[0], xml_name]) + else: + new_attr.tag = xml_name + serialized.append(new_attr) # type: ignore + else: # That's a basic type + # Integrate namespace if necessary + local_node = _create_xml_node(xml_name, xml_prefix, xml_ns) + local_node.text = str(new_attr) + serialized.append(local_node) # type: ignore + else: # JSON + for k in reversed(keys): # type: ignore + new_attr = {k: new_attr} + + _new_attr = new_attr + _serialized = serialized + for k in keys: # type: ignore + if k not in _serialized: + _serialized.update(_new_attr) # type: ignore + _new_attr = _new_attr[k] # type: ignore + _serialized = _serialized[k] + except ValueError as err: + if isinstance(err, SerializationError): + raise + + except (AttributeError, KeyError, TypeError) as err: + msg = "Attribute {} in object {} cannot be serialized.\n{}".format(attr_name, class_name, str(target_obj)) + raise SerializationError(msg) from err + return serialized + + def body(self, data, data_type, **kwargs): + """Serialize data intended for a request body. + + :param object data: The data to be serialized. + :param str data_type: The type to be serialized from. + :rtype: dict + :raises SerializationError: if serialization fails. + :raises ValueError: if data is None + :returns: The serialized request body + """ + + # Just in case this is a dict + internal_data_type_str = data_type.strip("[]{}") + internal_data_type = self.dependencies.get(internal_data_type_str, None) + try: + is_xml_model_serialization = kwargs["is_xml"] + except KeyError: + if internal_data_type and issubclass(internal_data_type, Model): + is_xml_model_serialization = kwargs.setdefault("is_xml", internal_data_type.is_xml_model()) + else: + is_xml_model_serialization = False + if internal_data_type and not isinstance(internal_data_type, Enum): + try: + deserializer = Deserializer(self.dependencies) + # Since it's on serialization, it's almost sure that format is not JSON REST + # We're not able to deal with additional properties for now. + deserializer.additional_properties_detection = False + if is_xml_model_serialization: + deserializer.key_extractors = [ # type: ignore + attribute_key_case_insensitive_extractor, + ] + else: + deserializer.key_extractors = [ + rest_key_case_insensitive_extractor, + attribute_key_case_insensitive_extractor, + last_rest_key_case_insensitive_extractor, + ] + data = deserializer._deserialize(data_type, data) # pylint: disable=protected-access + except DeserializationError as err: + raise SerializationError("Unable to build a model: " + str(err)) from err + + return self._serialize(data, data_type, **kwargs) + + def url(self, name, data, data_type, **kwargs): + """Serialize data intended for a URL path. + + :param str name: The name of the URL path parameter. + :param object data: The data to be serialized. + :param str data_type: The type to be serialized from. + :rtype: str + :returns: The serialized URL path + :raises TypeError: if serialization fails. + :raises ValueError: if data is None + """ + try: + output = self.serialize_data(data, data_type, **kwargs) + if data_type == "bool": + output = json.dumps(output) + + if kwargs.get("skip_quote") is True: + output = str(output) + output = output.replace("{", quote("{")).replace("}", quote("}")) + else: + output = quote(str(output), safe="") + except SerializationError as exc: + raise TypeError("{} must be type {}.".format(name, data_type)) from exc + return output + + def query(self, name, data, data_type, **kwargs): + """Serialize data intended for a URL query. + + :param str name: The name of the query parameter. + :param object data: The data to be serialized. + :param str data_type: The type to be serialized from. + :rtype: str, list + :raises TypeError: if serialization fails. + :raises ValueError: if data is None + :returns: The serialized query parameter + """ + try: + # Treat the list aside, since we don't want to encode the div separator + if data_type.startswith("["): + internal_data_type = data_type[1:-1] + do_quote = not kwargs.get("skip_quote", False) + return self.serialize_iter(data, internal_data_type, do_quote=do_quote, **kwargs) + + # Not a list, regular serialization + output = self.serialize_data(data, data_type, **kwargs) + if data_type == "bool": + output = json.dumps(output) + if kwargs.get("skip_quote") is True: + output = str(output) + else: + output = quote(str(output), safe="") + except SerializationError as exc: + raise TypeError("{} must be type {}.".format(name, data_type)) from exc + return str(output) + + def header(self, name, data, data_type, **kwargs): + """Serialize data intended for a request header. + + :param str name: The name of the header. + :param object data: The data to be serialized. + :param str data_type: The type to be serialized from. + :rtype: str + :raises TypeError: if serialization fails. + :raises ValueError: if data is None + :returns: The serialized header + """ + try: + if data_type in ["[str]"]: + data = ["" if d is None else d for d in data] + + output = self.serialize_data(data, data_type, **kwargs) + if data_type == "bool": + output = json.dumps(output) + except SerializationError as exc: + raise TypeError("{} must be type {}.".format(name, data_type)) from exc + return str(output) + + def serialize_data(self, data, data_type, **kwargs): + """Serialize generic data according to supplied data type. + + :param object data: The data to be serialized. + :param str data_type: The type to be serialized from. + :raises AttributeError: if required data is None. + :raises ValueError: if data is None + :raises SerializationError: if serialization fails. + :returns: The serialized data. + :rtype: str, int, float, bool, dict, list + """ + if data is None: + raise ValueError("No value for given attribute") + + try: + if data is CoreNull: + return None + if data_type in self.basic_types.values(): + return self.serialize_basic(data, data_type, **kwargs) + + if data_type in self.serialize_type: + return self.serialize_type[data_type](data, **kwargs) + + # If dependencies is empty, try with current data class + # It has to be a subclass of Enum anyway + enum_type = self.dependencies.get(data_type, data.__class__) + if issubclass(enum_type, Enum): + return Serializer.serialize_enum(data, enum_obj=enum_type) + + iter_type = data_type[0] + data_type[-1] + if iter_type in self.serialize_type: + return self.serialize_type[iter_type](data, data_type[1:-1], **kwargs) + + except (ValueError, TypeError) as err: + msg = "Unable to serialize value: {!r} as type: {!r}." + raise SerializationError(msg.format(data, data_type)) from err + return self._serialize(data, **kwargs) + + @classmethod + def _get_custom_serializers(cls, data_type, **kwargs): # pylint: disable=inconsistent-return-statements + custom_serializer = kwargs.get("basic_types_serializers", {}).get(data_type) + if custom_serializer: + return custom_serializer + if kwargs.get("is_xml", False): + return cls._xml_basic_types_serializers.get(data_type) + + @classmethod + def serialize_basic(cls, data, data_type, **kwargs): + """Serialize basic builting data type. + Serializes objects to str, int, float or bool. + + Possible kwargs: + - basic_types_serializers dict[str, callable] : If set, use the callable as serializer + - is_xml bool : If set, use xml_basic_types_serializers + + :param obj data: Object to be serialized. + :param str data_type: Type of object in the iterable. + :rtype: str, int, float, bool + :return: serialized object + """ + custom_serializer = cls._get_custom_serializers(data_type, **kwargs) + if custom_serializer: + return custom_serializer(data) + if data_type == "str": + return cls.serialize_unicode(data) + return eval(data_type)(data) # nosec # pylint: disable=eval-used + + @classmethod + def serialize_unicode(cls, data): + """Special handling for serializing unicode strings in Py2. + Encode to UTF-8 if unicode, otherwise handle as a str. + + :param str data: Object to be serialized. + :rtype: str + :return: serialized object + """ + try: # If I received an enum, return its value + return data.value + except AttributeError: + pass + + try: + if isinstance(data, unicode): # type: ignore + # Don't change it, JSON and XML ElementTree are totally able + # to serialize correctly u'' strings + return data + except NameError: + return str(data) + return str(data) + + def serialize_iter(self, data, iter_type, div=None, **kwargs): + """Serialize iterable. + + Supported kwargs: + - serialization_ctxt dict : The current entry of _attribute_map, or same format. + serialization_ctxt['type'] should be same as data_type. + - is_xml bool : If set, serialize as XML + + :param list data: Object to be serialized. + :param str iter_type: Type of object in the iterable. + :param str div: If set, this str will be used to combine the elements + in the iterable into a combined string. Default is 'None'. + Defaults to False. + :rtype: list, str + :return: serialized iterable + """ + if isinstance(data, str): + raise SerializationError("Refuse str type as a valid iter type.") + + serialization_ctxt = kwargs.get("serialization_ctxt", {}) + is_xml = kwargs.get("is_xml", False) + + serialized = [] + for d in data: + try: + serialized.append(self.serialize_data(d, iter_type, **kwargs)) + except ValueError as err: + if isinstance(err, SerializationError): + raise + serialized.append(None) + + if kwargs.get("do_quote", False): + serialized = ["" if s is None else quote(str(s), safe="") for s in serialized] + + if div: + serialized = ["" if s is None else str(s) for s in serialized] + serialized = div.join(serialized) + + if "xml" in serialization_ctxt or is_xml: + # XML serialization is more complicated + xml_desc = serialization_ctxt.get("xml", {}) + xml_name = xml_desc.get("name") + if not xml_name: + xml_name = serialization_ctxt["key"] + + # Create a wrap node if necessary (use the fact that Element and list have "append") + is_wrapped = xml_desc.get("wrapped", False) + node_name = xml_desc.get("itemsName", xml_name) + if is_wrapped: + final_result = _create_xml_node(xml_name, xml_desc.get("prefix", None), xml_desc.get("ns", None)) + else: + final_result = [] + # All list elements to "local_node" + for el in serialized: + if isinstance(el, ET.Element): + el_node = el + else: + el_node = _create_xml_node(node_name, xml_desc.get("prefix", None), xml_desc.get("ns", None)) + if el is not None: # Otherwise it writes "None" :-p + el_node.text = str(el) + final_result.append(el_node) + return final_result + return serialized + + def serialize_dict(self, attr, dict_type, **kwargs): + """Serialize a dictionary of objects. + + :param dict attr: Object to be serialized. + :param str dict_type: Type of object in the dictionary. + :rtype: dict + :return: serialized dictionary + """ + serialization_ctxt = kwargs.get("serialization_ctxt", {}) + serialized = {} + for key, value in attr.items(): + try: + serialized[self.serialize_unicode(key)] = self.serialize_data(value, dict_type, **kwargs) + except ValueError as err: + if isinstance(err, SerializationError): + raise + serialized[self.serialize_unicode(key)] = None + + if "xml" in serialization_ctxt: + # XML serialization is more complicated + xml_desc = serialization_ctxt["xml"] + xml_name = xml_desc["name"] + + final_result = _create_xml_node(xml_name, xml_desc.get("prefix", None), xml_desc.get("ns", None)) + for key, value in serialized.items(): + ET.SubElement(final_result, key).text = value + return final_result + + return serialized + + def serialize_object(self, attr, **kwargs): # pylint: disable=too-many-return-statements + """Serialize a generic object. + This will be handled as a dictionary. If object passed in is not + a basic type (str, int, float, dict, list) it will simply be + cast to str. + + :param dict attr: Object to be serialized. + :rtype: dict or str + :return: serialized object + """ + if attr is None: + return None + if isinstance(attr, ET.Element): + return attr + obj_type = type(attr) + if obj_type in self.basic_types: + return self.serialize_basic(attr, self.basic_types[obj_type], **kwargs) + if obj_type is _long_type: + return self.serialize_long(attr) + if obj_type is str: + return self.serialize_unicode(attr) + if obj_type is datetime.datetime: + return self.serialize_iso(attr) + if obj_type is datetime.date: + return self.serialize_date(attr) + if obj_type is datetime.time: + return self.serialize_time(attr) + if obj_type is datetime.timedelta: + return self.serialize_duration(attr) + if obj_type is decimal.Decimal: + return self.serialize_decimal(attr) + + # If it's a model or I know this dependency, serialize as a Model + if obj_type in self.dependencies.values() or isinstance(attr, Model): + return self._serialize(attr) + + if obj_type == dict: + serialized = {} + for key, value in attr.items(): + try: + serialized[self.serialize_unicode(key)] = self.serialize_object(value, **kwargs) + except ValueError: + serialized[self.serialize_unicode(key)] = None + return serialized + + if obj_type == list: + serialized = [] + for obj in attr: + try: + serialized.append(self.serialize_object(obj, **kwargs)) + except ValueError: + pass + return serialized + return str(attr) + + @staticmethod + def serialize_enum(attr, enum_obj=None): + try: + result = attr.value + except AttributeError: + result = attr + try: + enum_obj(result) # type: ignore + return result + except ValueError as exc: + for enum_value in enum_obj: # type: ignore + if enum_value.value.lower() == str(attr).lower(): + return enum_value.value + error = "{!r} is not valid value for enum {!r}" + raise SerializationError(error.format(attr, enum_obj)) from exc + + @staticmethod + def serialize_bytearray(attr, **kwargs): # pylint: disable=unused-argument + """Serialize bytearray into base-64 string. + + :param str attr: Object to be serialized. + :rtype: str + :return: serialized base64 + """ + return b64encode(attr).decode() + + @staticmethod + def serialize_base64(attr, **kwargs): # pylint: disable=unused-argument + """Serialize str into base-64 string. + + :param str attr: Object to be serialized. + :rtype: str + :return: serialized base64 + """ + encoded = b64encode(attr).decode("ascii") + return encoded.strip("=").replace("+", "-").replace("/", "_") + + @staticmethod + def serialize_decimal(attr, **kwargs): # pylint: disable=unused-argument + """Serialize Decimal object to float. + + :param decimal attr: Object to be serialized. + :rtype: float + :return: serialized decimal + """ + return float(attr) + + @staticmethod + def serialize_long(attr, **kwargs): # pylint: disable=unused-argument + """Serialize long (Py2) or int (Py3). + + :param int attr: Object to be serialized. + :rtype: int/long + :return: serialized long + """ + return _long_type(attr) + + @staticmethod + def serialize_date(attr, **kwargs): # pylint: disable=unused-argument + """Serialize Date object into ISO-8601 formatted string. + + :param Date attr: Object to be serialized. + :rtype: str + :return: serialized date + """ + if isinstance(attr, str): + attr = isodate.parse_date(attr) + t = "{:04}-{:02}-{:02}".format(attr.year, attr.month, attr.day) + return t + + @staticmethod + def serialize_time(attr, **kwargs): # pylint: disable=unused-argument + """Serialize Time object into ISO-8601 formatted string. + + :param datetime.time attr: Object to be serialized. + :rtype: str + :return: serialized time + """ + if isinstance(attr, str): + attr = isodate.parse_time(attr) + t = "{:02}:{:02}:{:02}".format(attr.hour, attr.minute, attr.second) + if attr.microsecond: + t += ".{:02}".format(attr.microsecond) + return t + + @staticmethod + def serialize_duration(attr, **kwargs): # pylint: disable=unused-argument + """Serialize TimeDelta object into ISO-8601 formatted string. + + :param TimeDelta attr: Object to be serialized. + :rtype: str + :return: serialized duration + """ + if isinstance(attr, str): + attr = isodate.parse_duration(attr) + return isodate.duration_isoformat(attr) + + @staticmethod + def serialize_rfc(attr, **kwargs): # pylint: disable=unused-argument + """Serialize Datetime object into RFC-1123 formatted string. + + :param Datetime attr: Object to be serialized. + :rtype: str + :raises TypeError: if format invalid. + :return: serialized rfc + """ + try: + if not attr.tzinfo: + _LOGGER.warning("Datetime with no tzinfo will be considered UTC.") + utc = attr.utctimetuple() + except AttributeError as exc: + raise TypeError("RFC1123 object must be valid Datetime object.") from exc + + return "{}, {:02} {} {:04} {:02}:{:02}:{:02} GMT".format( + Serializer.days[utc.tm_wday], + utc.tm_mday, + Serializer.months[utc.tm_mon], + utc.tm_year, + utc.tm_hour, + utc.tm_min, + utc.tm_sec, + ) + + @staticmethod + def serialize_iso(attr, **kwargs): # pylint: disable=unused-argument + """Serialize Datetime object into ISO-8601 formatted string. + + :param Datetime attr: Object to be serialized. + :rtype: str + :raises SerializationError: if format invalid. + :return: serialized iso + """ + if isinstance(attr, str): + attr = isodate.parse_datetime(attr) + try: + if not attr.tzinfo: + _LOGGER.warning("Datetime with no tzinfo will be considered UTC.") + utc = attr.utctimetuple() + if utc.tm_year > 9999 or utc.tm_year < 1: + raise OverflowError("Hit max or min date") + + microseconds = str(attr.microsecond).rjust(6, "0").rstrip("0").ljust(3, "0") + if microseconds: + microseconds = "." + microseconds + date = "{:04}-{:02}-{:02}T{:02}:{:02}:{:02}".format( + utc.tm_year, utc.tm_mon, utc.tm_mday, utc.tm_hour, utc.tm_min, utc.tm_sec + ) + return date + microseconds + "Z" + except (ValueError, OverflowError) as err: + msg = "Unable to serialize datetime object." + raise SerializationError(msg) from err + except AttributeError as err: + msg = "ISO-8601 object must be valid Datetime object." + raise TypeError(msg) from err + + @staticmethod + def serialize_unix(attr, **kwargs): # pylint: disable=unused-argument + """Serialize Datetime object into IntTime format. + This is represented as seconds. + + :param Datetime attr: Object to be serialized. + :rtype: int + :raises SerializationError: if format invalid + :return: serialied unix + """ + if isinstance(attr, int): + return attr + try: + if not attr.tzinfo: + _LOGGER.warning("Datetime with no tzinfo will be considered UTC.") + return int(calendar.timegm(attr.utctimetuple())) + except AttributeError as exc: + raise TypeError("Unix time object must be valid Datetime object.") from exc + + +def rest_key_extractor(attr, attr_desc, data): # pylint: disable=unused-argument + key = attr_desc["key"] + working_data = data + + while "." in key: + # Need the cast, as for some reasons "split" is typed as list[str | Any] + dict_keys = cast(List[str], _FLATTEN.split(key)) + if len(dict_keys) == 1: + key = _decode_attribute_map_key(dict_keys[0]) + break + working_key = _decode_attribute_map_key(dict_keys[0]) + working_data = working_data.get(working_key, data) + if working_data is None: + # If at any point while following flatten JSON path see None, it means + # that all properties under are None as well + return None + key = ".".join(dict_keys[1:]) + + return working_data.get(key) + + +def rest_key_case_insensitive_extractor( # pylint: disable=unused-argument, inconsistent-return-statements + attr, attr_desc, data +): + key = attr_desc["key"] + working_data = data + + while "." in key: + dict_keys = _FLATTEN.split(key) + if len(dict_keys) == 1: + key = _decode_attribute_map_key(dict_keys[0]) + break + working_key = _decode_attribute_map_key(dict_keys[0]) + working_data = attribute_key_case_insensitive_extractor(working_key, None, working_data) + if working_data is None: + # If at any point while following flatten JSON path see None, it means + # that all properties under are None as well + return None + key = ".".join(dict_keys[1:]) + + if working_data: + return attribute_key_case_insensitive_extractor(key, None, working_data) + + +def last_rest_key_extractor(attr, attr_desc, data): # pylint: disable=unused-argument + """Extract the attribute in "data" based on the last part of the JSON path key. + + :param str attr: The attribute to extract + :param dict attr_desc: The attribute description + :param dict data: The data to extract from + :rtype: object + :returns: The extracted attribute + """ + key = attr_desc["key"] + dict_keys = _FLATTEN.split(key) + return attribute_key_extractor(dict_keys[-1], None, data) + + +def last_rest_key_case_insensitive_extractor(attr, attr_desc, data): # pylint: disable=unused-argument + """Extract the attribute in "data" based on the last part of the JSON path key. + + This is the case insensitive version of "last_rest_key_extractor" + :param str attr: The attribute to extract + :param dict attr_desc: The attribute description + :param dict data: The data to extract from + :rtype: object + :returns: The extracted attribute + """ + key = attr_desc["key"] + dict_keys = _FLATTEN.split(key) + return attribute_key_case_insensitive_extractor(dict_keys[-1], None, data) + + +def attribute_key_extractor(attr, _, data): + return data.get(attr) + + +def attribute_key_case_insensitive_extractor(attr, _, data): + found_key = None + lower_attr = attr.lower() + for key in data: + if lower_attr == key.lower(): + found_key = key + break + + return data.get(found_key) + + +def _extract_name_from_internal_type(internal_type): + """Given an internal type XML description, extract correct XML name with namespace. + + :param dict internal_type: An model type + :rtype: tuple + :returns: A tuple XML name + namespace dict + """ + internal_type_xml_map = getattr(internal_type, "_xml_map", {}) + xml_name = internal_type_xml_map.get("name", internal_type.__name__) + xml_ns = internal_type_xml_map.get("ns", None) + if xml_ns: + xml_name = "{{{}}}{}".format(xml_ns, xml_name) + return xml_name + + +def xml_key_extractor(attr, attr_desc, data): # pylint: disable=unused-argument,too-many-return-statements + if isinstance(data, dict): + return None + + # Test if this model is XML ready first + if not isinstance(data, ET.Element): + return None + + xml_desc = attr_desc.get("xml", {}) + xml_name = xml_desc.get("name", attr_desc["key"]) + + # Look for a children + is_iter_type = attr_desc["type"].startswith("[") + is_wrapped = xml_desc.get("wrapped", False) + internal_type = attr_desc.get("internalType", None) + internal_type_xml_map = getattr(internal_type, "_xml_map", {}) + + # Integrate namespace if necessary + xml_ns = xml_desc.get("ns", internal_type_xml_map.get("ns", None)) + if xml_ns: + xml_name = "{{{}}}{}".format(xml_ns, xml_name) + + # If it's an attribute, that's simple + if xml_desc.get("attr", False): + return data.get(xml_name) + + # If it's x-ms-text, that's simple too + if xml_desc.get("text", False): + return data.text + + # Scenario where I take the local name: + # - Wrapped node + # - Internal type is an enum (considered basic types) + # - Internal type has no XML/Name node + if is_wrapped or (internal_type and (issubclass(internal_type, Enum) or "name" not in internal_type_xml_map)): + children = data.findall(xml_name) + # If internal type has a local name and it's not a list, I use that name + elif not is_iter_type and internal_type and "name" in internal_type_xml_map: + xml_name = _extract_name_from_internal_type(internal_type) + children = data.findall(xml_name) + # That's an array + else: + if internal_type: # Complex type, ignore itemsName and use the complex type name + items_name = _extract_name_from_internal_type(internal_type) + else: + items_name = xml_desc.get("itemsName", xml_name) + children = data.findall(items_name) + + if len(children) == 0: + if is_iter_type: + if is_wrapped: + return None # is_wrapped no node, we want None + return [] # not wrapped, assume empty list + return None # Assume it's not there, maybe an optional node. + + # If is_iter_type and not wrapped, return all found children + if is_iter_type: + if not is_wrapped: + return children + # Iter and wrapped, should have found one node only (the wrap one) + if len(children) != 1: + raise DeserializationError( + "Tried to deserialize an array not wrapped, and found several nodes '{}'. Maybe you should declare this array as wrapped?".format( + xml_name + ) + ) + return list(children[0]) # Might be empty list and that's ok. + + # Here it's not a itertype, we should have found one element only or empty + if len(children) > 1: + raise DeserializationError("Find several XML '{}' where it was not expected".format(xml_name)) + return children[0] + + +class Deserializer: + """Response object model deserializer. + + :param dict classes: Class type dictionary for deserializing complex types. + :ivar list key_extractors: Ordered list of extractors to be used by this deserializer. + """ + + basic_types = {str: "str", int: "int", bool: "bool", float: "float"} + + valid_date = re.compile(r"\d{4}[-]\d{2}[-]\d{2}T\d{2}:\d{2}:\d{2}\.?\d*Z?[-+]?[\d{2}]?:?[\d{2}]?") + + def __init__(self, classes: Optional[Mapping[str, type]] = None) -> None: + self.deserialize_type = { + "iso-8601": Deserializer.deserialize_iso, + "rfc-1123": Deserializer.deserialize_rfc, + "unix-time": Deserializer.deserialize_unix, + "duration": Deserializer.deserialize_duration, + "date": Deserializer.deserialize_date, + "time": Deserializer.deserialize_time, + "decimal": Deserializer.deserialize_decimal, + "long": Deserializer.deserialize_long, + "bytearray": Deserializer.deserialize_bytearray, + "base64": Deserializer.deserialize_base64, + "object": self.deserialize_object, + "[]": self.deserialize_iter, + "{}": self.deserialize_dict, + } + self.deserialize_expected_types = { + "duration": (isodate.Duration, datetime.timedelta), + "iso-8601": (datetime.datetime), + } + self.dependencies: Dict[str, type] = dict(classes) if classes else {} + self.key_extractors = [rest_key_extractor, xml_key_extractor] + # Additional properties only works if the "rest_key_extractor" is used to + # extract the keys. Making it to work whatever the key extractor is too much + # complicated, with no real scenario for now. + # So adding a flag to disable additional properties detection. This flag should be + # used if your expect the deserialization to NOT come from a JSON REST syntax. + # Otherwise, result are unexpected + self.additional_properties_detection = True + + def __call__(self, target_obj, response_data, content_type=None): + """Call the deserializer to process a REST response. + + :param str target_obj: Target data type to deserialize to. + :param requests.Response response_data: REST response object. + :param str content_type: Swagger "produces" if available. + :raises DeserializationError: if deserialization fails. + :return: Deserialized object. + :rtype: object + """ + data = self._unpack_content(response_data, content_type) + return self._deserialize(target_obj, data) + + def _deserialize(self, target_obj, data): # pylint: disable=inconsistent-return-statements + """Call the deserializer on a model. + + Data needs to be already deserialized as JSON or XML ElementTree + + :param str target_obj: Target data type to deserialize to. + :param object data: Object to deserialize. + :raises DeserializationError: if deserialization fails. + :return: Deserialized object. + :rtype: object + """ + # This is already a model, go recursive just in case + if hasattr(data, "_attribute_map"): + constants = [name for name, config in getattr(data, "_validation", {}).items() if config.get("constant")] + try: + for attr, mapconfig in data._attribute_map.items(): # pylint: disable=protected-access + if attr in constants: + continue + value = getattr(data, attr) + if value is None: + continue + local_type = mapconfig["type"] + internal_data_type = local_type.strip("[]{}") + if internal_data_type not in self.dependencies or isinstance(internal_data_type, Enum): + continue + setattr(data, attr, self._deserialize(local_type, value)) + return data + except AttributeError: + return + + response, class_name = self._classify_target(target_obj, data) + + if isinstance(response, str): + return self.deserialize_data(data, response) + if isinstance(response, type) and issubclass(response, Enum): + return self.deserialize_enum(data, response) + + if data is None or data is CoreNull: + return data + try: + attributes = response._attribute_map # type: ignore # pylint: disable=protected-access + d_attrs = {} + for attr, attr_desc in attributes.items(): + # Check empty string. If it's not empty, someone has a real "additionalProperties"... + if attr == "additional_properties" and attr_desc["key"] == "": + continue + raw_value = None + # Enhance attr_desc with some dynamic data + attr_desc = attr_desc.copy() # Do a copy, do not change the real one + internal_data_type = attr_desc["type"].strip("[]{}") + if internal_data_type in self.dependencies: + attr_desc["internalType"] = self.dependencies[internal_data_type] + + for key_extractor in self.key_extractors: + found_value = key_extractor(attr, attr_desc, data) + if found_value is not None: + if raw_value is not None and raw_value != found_value: + msg = ( + "Ignoring extracted value '%s' from %s for key '%s'" + " (duplicate extraction, follow extractors order)" + ) + _LOGGER.warning(msg, found_value, key_extractor, attr) + continue + raw_value = found_value + + value = self.deserialize_data(raw_value, attr_desc["type"]) + d_attrs[attr] = value + except (AttributeError, TypeError, KeyError) as err: + msg = "Unable to deserialize to object: " + class_name # type: ignore + raise DeserializationError(msg) from err + additional_properties = self._build_additional_properties(attributes, data) + return self._instantiate_model(response, d_attrs, additional_properties) + + def _build_additional_properties(self, attribute_map, data): + if not self.additional_properties_detection: + return None + if "additional_properties" in attribute_map and attribute_map.get("additional_properties", {}).get("key") != "": + # Check empty string. If it's not empty, someone has a real "additionalProperties" + return None + if isinstance(data, ET.Element): + data = {el.tag: el.text for el in data} + + known_keys = { + _decode_attribute_map_key(_FLATTEN.split(desc["key"])[0]) + for desc in attribute_map.values() + if desc["key"] != "" + } + present_keys = set(data.keys()) + missing_keys = present_keys - known_keys + return {key: data[key] for key in missing_keys} + + def _classify_target(self, target, data): + """Check to see whether the deserialization target object can + be classified into a subclass. + Once classification has been determined, initialize object. + + :param str target: The target object type to deserialize to. + :param str/dict data: The response data to deserialize. + :return: The classified target object and its class name. + :rtype: tuple + """ + if target is None: + return None, None + + if isinstance(target, str): + try: + target = self.dependencies[target] + except KeyError: + return target, target + + try: + target = target._classify(data, self.dependencies) # type: ignore # pylint: disable=protected-access + except AttributeError: + pass # Target is not a Model, no classify + return target, target.__class__.__name__ # type: ignore + + def failsafe_deserialize(self, target_obj, data, content_type=None): + """Ignores any errors encountered in deserialization, + and falls back to not deserializing the object. Recommended + for use in error deserialization, as we want to return the + HttpResponseError to users, and not have them deal with + a deserialization error. + + :param str target_obj: The target object type to deserialize to. + :param str/dict data: The response data to deserialize. + :param str content_type: Swagger "produces" if available. + :return: Deserialized object. + :rtype: object + """ + try: + return self(target_obj, data, content_type=content_type) + except: # pylint: disable=bare-except + _LOGGER.debug( + "Ran into a deserialization error. Ignoring since this is failsafe deserialization", exc_info=True + ) + return None + + @staticmethod + def _unpack_content(raw_data, content_type=None): + """Extract the correct structure for deserialization. + + If raw_data is a PipelineResponse, try to extract the result of RawDeserializer. + if we can't, raise. Your Pipeline should have a RawDeserializer. + + If not a pipeline response and raw_data is bytes or string, use content-type + to decode it. If no content-type, try JSON. + + If raw_data is something else, bypass all logic and return it directly. + + :param obj raw_data: Data to be processed. + :param str content_type: How to parse if raw_data is a string/bytes. + :raises JSONDecodeError: If JSON is requested and parsing is impossible. + :raises UnicodeDecodeError: If bytes is not UTF8 + :rtype: object + :return: Unpacked content. + """ + # Assume this is enough to detect a Pipeline Response without importing it + context = getattr(raw_data, "context", {}) + if context: + if RawDeserializer.CONTEXT_NAME in context: + return context[RawDeserializer.CONTEXT_NAME] + raise ValueError("This pipeline didn't have the RawDeserializer policy; can't deserialize") + + # Assume this is enough to recognize universal_http.ClientResponse without importing it + if hasattr(raw_data, "body"): + return RawDeserializer.deserialize_from_http_generics(raw_data.text(), raw_data.headers) + + # Assume this enough to recognize requests.Response without importing it. + if hasattr(raw_data, "_content_consumed"): + return RawDeserializer.deserialize_from_http_generics(raw_data.text, raw_data.headers) + + if isinstance(raw_data, (str, bytes)) or hasattr(raw_data, "read"): + return RawDeserializer.deserialize_from_text(raw_data, content_type) # type: ignore + return raw_data + + def _instantiate_model(self, response, attrs, additional_properties=None): + """Instantiate a response model passing in deserialized args. + + :param Response response: The response model class. + :param dict attrs: The deserialized response attributes. + :param dict additional_properties: Additional properties to be set. + :rtype: Response + :return: The instantiated response model. + """ + if callable(response): + subtype = getattr(response, "_subtype_map", {}) + try: + readonly = [ + k + for k, v in response._validation.items() # pylint: disable=protected-access # type: ignore + if v.get("readonly") + ] + const = [ + k + for k, v in response._validation.items() # pylint: disable=protected-access # type: ignore + if v.get("constant") + ] + kwargs = {k: v for k, v in attrs.items() if k not in subtype and k not in readonly + const} + response_obj = response(**kwargs) + for attr in readonly: + setattr(response_obj, attr, attrs.get(attr)) + if additional_properties: + response_obj.additional_properties = additional_properties # type: ignore + return response_obj + except TypeError as err: + msg = "Unable to deserialize {} into model {}. ".format(kwargs, response) # type: ignore + raise DeserializationError(msg + str(err)) from err + else: + try: + for attr, value in attrs.items(): + setattr(response, attr, value) + return response + except Exception as exp: + msg = "Unable to populate response model. " + msg += "Type: {}, Error: {}".format(type(response), exp) + raise DeserializationError(msg) from exp + + def deserialize_data(self, data, data_type): # pylint: disable=too-many-return-statements + """Process data for deserialization according to data type. + + :param str data: The response string to be deserialized. + :param str data_type: The type to deserialize to. + :raises DeserializationError: if deserialization fails. + :return: Deserialized object. + :rtype: object + """ + if data is None: + return data + + try: + if not data_type: + return data + if data_type in self.basic_types.values(): + return self.deserialize_basic(data, data_type) + if data_type in self.deserialize_type: + if isinstance(data, self.deserialize_expected_types.get(data_type, tuple())): + return data + + is_a_text_parsing_type = lambda x: x not in [ # pylint: disable=unnecessary-lambda-assignment + "object", + "[]", + r"{}", + ] + if isinstance(data, ET.Element) and is_a_text_parsing_type(data_type) and not data.text: + return None + data_val = self.deserialize_type[data_type](data) + return data_val + + iter_type = data_type[0] + data_type[-1] + if iter_type in self.deserialize_type: + return self.deserialize_type[iter_type](data, data_type[1:-1]) + + obj_type = self.dependencies[data_type] + if issubclass(obj_type, Enum): + if isinstance(data, ET.Element): + data = data.text + return self.deserialize_enum(data, obj_type) + + except (ValueError, TypeError, AttributeError) as err: + msg = "Unable to deserialize response data." + msg += " Data: {}, {}".format(data, data_type) + raise DeserializationError(msg) from err + return self._deserialize(obj_type, data) + + def deserialize_iter(self, attr, iter_type): + """Deserialize an iterable. + + :param list attr: Iterable to be deserialized. + :param str iter_type: The type of object in the iterable. + :return: Deserialized iterable. + :rtype: list + """ + if attr is None: + return None + if isinstance(attr, ET.Element): # If I receive an element here, get the children + attr = list(attr) + if not isinstance(attr, (list, set)): + raise DeserializationError("Cannot deserialize as [{}] an object of type {}".format(iter_type, type(attr))) + return [self.deserialize_data(a, iter_type) for a in attr] + + def deserialize_dict(self, attr, dict_type): + """Deserialize a dictionary. + + :param dict/list attr: Dictionary to be deserialized. Also accepts + a list of key, value pairs. + :param str dict_type: The object type of the items in the dictionary. + :return: Deserialized dictionary. + :rtype: dict + """ + if isinstance(attr, list): + return {x["key"]: self.deserialize_data(x["value"], dict_type) for x in attr} + + if isinstance(attr, ET.Element): + # Transform value into {"Key": "value"} + attr = {el.tag: el.text for el in attr} + return {k: self.deserialize_data(v, dict_type) for k, v in attr.items()} + + def deserialize_object(self, attr, **kwargs): # pylint: disable=too-many-return-statements + """Deserialize a generic object. + This will be handled as a dictionary. + + :param dict attr: Dictionary to be deserialized. + :return: Deserialized object. + :rtype: dict + :raises TypeError: if non-builtin datatype encountered. + """ + if attr is None: + return None + if isinstance(attr, ET.Element): + # Do no recurse on XML, just return the tree as-is + return attr + if isinstance(attr, str): + return self.deserialize_basic(attr, "str") + obj_type = type(attr) + if obj_type in self.basic_types: + return self.deserialize_basic(attr, self.basic_types[obj_type]) + if obj_type is _long_type: + return self.deserialize_long(attr) + + if obj_type == dict: + deserialized = {} + for key, value in attr.items(): + try: + deserialized[key] = self.deserialize_object(value, **kwargs) + except ValueError: + deserialized[key] = None + return deserialized + + if obj_type == list: + deserialized = [] + for obj in attr: + try: + deserialized.append(self.deserialize_object(obj, **kwargs)) + except ValueError: + pass + return deserialized + + error = "Cannot deserialize generic object with type: " + raise TypeError(error + str(obj_type)) + + def deserialize_basic(self, attr, data_type): # pylint: disable=too-many-return-statements + """Deserialize basic builtin data type from string. + Will attempt to convert to str, int, float and bool. + This function will also accept '1', '0', 'true' and 'false' as + valid bool values. + + :param str attr: response string to be deserialized. + :param str data_type: deserialization data type. + :return: Deserialized basic type. + :rtype: str, int, float or bool + :raises TypeError: if string format is not valid. + """ + # If we're here, data is supposed to be a basic type. + # If it's still an XML node, take the text + if isinstance(attr, ET.Element): + attr = attr.text + if not attr: + if data_type == "str": + # None or '', node is empty string. + return "" + # None or '', node with a strong type is None. + # Don't try to model "empty bool" or "empty int" + return None + + if data_type == "bool": + if attr in [True, False, 1, 0]: + return bool(attr) + if isinstance(attr, str): + if attr.lower() in ["true", "1"]: + return True + if attr.lower() in ["false", "0"]: + return False + raise TypeError("Invalid boolean value: {}".format(attr)) + + if data_type == "str": + return self.deserialize_unicode(attr) + return eval(data_type)(attr) # nosec # pylint: disable=eval-used + + @staticmethod + def deserialize_unicode(data): + """Preserve unicode objects in Python 2, otherwise return data + as a string. + + :param str data: response string to be deserialized. + :return: Deserialized string. + :rtype: str or unicode + """ + # We might be here because we have an enum modeled as string, + # and we try to deserialize a partial dict with enum inside + if isinstance(data, Enum): + return data + + # Consider this is real string + try: + if isinstance(data, unicode): # type: ignore + return data + except NameError: + return str(data) + return str(data) + + @staticmethod + def deserialize_enum(data, enum_obj): + """Deserialize string into enum object. + + If the string is not a valid enum value it will be returned as-is + and a warning will be logged. + + :param str data: Response string to be deserialized. If this value is + None or invalid it will be returned as-is. + :param Enum enum_obj: Enum object to deserialize to. + :return: Deserialized enum object. + :rtype: Enum + """ + if isinstance(data, enum_obj) or data is None: + return data + if isinstance(data, Enum): + data = data.value + if isinstance(data, int): + # Workaround. We might consider remove it in the future. + try: + return list(enum_obj.__members__.values())[data] + except IndexError as exc: + error = "{!r} is not a valid index for enum {!r}" + raise DeserializationError(error.format(data, enum_obj)) from exc + try: + return enum_obj(str(data)) + except ValueError: + for enum_value in enum_obj: + if enum_value.value.lower() == str(data).lower(): + return enum_value + # We don't fail anymore for unknown value, we deserialize as a string + _LOGGER.warning("Deserializer is not able to find %s as valid enum in %s", data, enum_obj) + return Deserializer.deserialize_unicode(data) + + @staticmethod + def deserialize_bytearray(attr): + """Deserialize string into bytearray. + + :param str attr: response string to be deserialized. + :return: Deserialized bytearray + :rtype: bytearray + :raises TypeError: if string format invalid. + """ + if isinstance(attr, ET.Element): + attr = attr.text + return bytearray(b64decode(attr)) # type: ignore + + @staticmethod + def deserialize_base64(attr): + """Deserialize base64 encoded string into string. + + :param str attr: response string to be deserialized. + :return: Deserialized base64 string + :rtype: bytearray + :raises TypeError: if string format invalid. + """ + if isinstance(attr, ET.Element): + attr = attr.text + padding = "=" * (3 - (len(attr) + 3) % 4) # type: ignore + attr = attr + padding # type: ignore + encoded = attr.replace("-", "+").replace("_", "/") + return b64decode(encoded) + + @staticmethod + def deserialize_decimal(attr): + """Deserialize string into Decimal object. + + :param str attr: response string to be deserialized. + :return: Deserialized decimal + :raises DeserializationError: if string format invalid. + :rtype: decimal + """ + if isinstance(attr, ET.Element): + attr = attr.text + try: + return decimal.Decimal(str(attr)) # type: ignore + except decimal.DecimalException as err: + msg = "Invalid decimal {}".format(attr) + raise DeserializationError(msg) from err + + @staticmethod + def deserialize_long(attr): + """Deserialize string into long (Py2) or int (Py3). + + :param str attr: response string to be deserialized. + :return: Deserialized int + :rtype: long or int + :raises ValueError: if string format invalid. + """ + if isinstance(attr, ET.Element): + attr = attr.text + return _long_type(attr) # type: ignore + + @staticmethod + def deserialize_duration(attr): + """Deserialize ISO-8601 formatted string into TimeDelta object. + + :param str attr: response string to be deserialized. + :return: Deserialized duration + :rtype: TimeDelta + :raises DeserializationError: if string format invalid. + """ + if isinstance(attr, ET.Element): + attr = attr.text + try: + duration = isodate.parse_duration(attr) + except (ValueError, OverflowError, AttributeError) as err: + msg = "Cannot deserialize duration object." + raise DeserializationError(msg) from err + return duration + + @staticmethod + def deserialize_date(attr): + """Deserialize ISO-8601 formatted string into Date object. + + :param str attr: response string to be deserialized. + :return: Deserialized date + :rtype: Date + :raises DeserializationError: if string format invalid. + """ + if isinstance(attr, ET.Element): + attr = attr.text + if re.search(r"[^\W\d_]", attr, re.I + re.U): # type: ignore + raise DeserializationError("Date must have only digits and -. Received: %s" % attr) + # This must NOT use defaultmonth/defaultday. Using None ensure this raises an exception. + return isodate.parse_date(attr, defaultmonth=0, defaultday=0) + + @staticmethod + def deserialize_time(attr): + """Deserialize ISO-8601 formatted string into time object. + + :param str attr: response string to be deserialized. + :return: Deserialized time + :rtype: datetime.time + :raises DeserializationError: if string format invalid. + """ + if isinstance(attr, ET.Element): + attr = attr.text + if re.search(r"[^\W\d_]", attr, re.I + re.U): # type: ignore + raise DeserializationError("Date must have only digits and -. Received: %s" % attr) + return isodate.parse_time(attr) + + @staticmethod + def deserialize_rfc(attr): + """Deserialize RFC-1123 formatted string into Datetime object. + + :param str attr: response string to be deserialized. + :return: Deserialized RFC datetime + :rtype: Datetime + :raises DeserializationError: if string format invalid. + """ + if isinstance(attr, ET.Element): + attr = attr.text + try: + parsed_date = email.utils.parsedate_tz(attr) # type: ignore + date_obj = datetime.datetime( + *parsed_date[:6], tzinfo=datetime.timezone(datetime.timedelta(minutes=(parsed_date[9] or 0) / 60)) + ) + if not date_obj.tzinfo: + date_obj = date_obj.astimezone(tz=TZ_UTC) + except ValueError as err: + msg = "Cannot deserialize to rfc datetime object." + raise DeserializationError(msg) from err + return date_obj + + @staticmethod + def deserialize_iso(attr): + """Deserialize ISO-8601 formatted string into Datetime object. + + :param str attr: response string to be deserialized. + :return: Deserialized ISO datetime + :rtype: Datetime + :raises DeserializationError: if string format invalid. + """ + if isinstance(attr, ET.Element): + attr = attr.text + try: + attr = attr.upper() # type: ignore + match = Deserializer.valid_date.match(attr) + if not match: + raise ValueError("Invalid datetime string: " + attr) + + check_decimal = attr.split(".") + if len(check_decimal) > 1: + decimal_str = "" + for digit in check_decimal[1]: + if digit.isdigit(): + decimal_str += digit + else: + break + if len(decimal_str) > 6: + attr = attr.replace(decimal_str, decimal_str[0:6]) + + date_obj = isodate.parse_datetime(attr) + test_utc = date_obj.utctimetuple() + if test_utc.tm_year > 9999 or test_utc.tm_year < 1: + raise OverflowError("Hit max or min date") + except (ValueError, OverflowError, AttributeError) as err: + msg = "Cannot deserialize datetime object." + raise DeserializationError(msg) from err + return date_obj + + @staticmethod + def deserialize_unix(attr): + """Serialize Datetime object into IntTime format. + This is represented as seconds. + + :param int attr: Object to be serialized. + :return: Deserialized datetime + :rtype: Datetime + :raises DeserializationError: if format invalid + """ + if isinstance(attr, ET.Element): + attr = int(attr.text) # type: ignore + try: + attr = int(attr) + date_obj = datetime.datetime.fromtimestamp(attr, TZ_UTC) + except ValueError as err: + msg = "Cannot deserialize to unix datetime object." + raise DeserializationError(msg) from err + return date_obj diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/_types.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/_types.py new file mode 100644 index 000000000000..75ceb8ad15d2 --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/_types.py @@ -0,0 +1,21 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# Code generated by Microsoft (R) Python Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is regenerated. +# -------------------------------------------------------------------------- + +from typing import TYPE_CHECKING, Union + +if TYPE_CHECKING: + from . import models as _models +AgentsApiResponseFormatOption = Union[ + str, + str, + "_models.AgentsApiResponseFormatMode", + "_models.AgentsApiResponseFormat", + "_models.ResponseFormatJsonSchemaType", +] +MessageAttachmentToolDefinition = Union["_models.CodeInterpreterToolDefinition", "_models.FileSearchToolDefinition"] +AgentsApiToolChoiceOption = Union[str, str, "_models.AgentsApiToolChoiceOptionMode", "_models.AgentsNamedToolChoice"] diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/_validation.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/_validation.py new file mode 100644 index 000000000000..200be3c8aabd --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/_validation.py @@ -0,0 +1,50 @@ +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# Code generated by Microsoft (R) Python Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is regenerated. +# -------------------------------------------------------------------------- +import functools + + +def api_version_validation(**kwargs): + params_added_on = kwargs.pop("params_added_on", {}) + method_added_on = kwargs.pop("method_added_on", "") + + def decorator(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + try: + # this assumes the client has an _api_version attribute + client = args[0] + client_api_version = client._config.api_version # pylint: disable=protected-access + except AttributeError: + return func(*args, **kwargs) + + if method_added_on > client_api_version: + raise ValueError( + f"'{func.__name__}' is not available in API version " + f"{client_api_version}. Pass service API version {method_added_on} or newer to your client." + ) + + unsupported = { + parameter: api_version + for api_version, parameters in params_added_on.items() + for parameter in parameters + if parameter in kwargs and api_version > client_api_version + } + if unsupported: + raise ValueError( + "".join( + [ + f"'{param}' is not available in API version {client_api_version}. " + f"Use service API version {version} or newer.\n" + for param, version in unsupported.items() + ] + ) + ) + return func(*args, **kwargs) + + return wrapper + + return decorator diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/_vendor.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/_vendor.py new file mode 100644 index 000000000000..5427bc33d4bb --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/_vendor.py @@ -0,0 +1,50 @@ +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# Code generated by Microsoft (R) Python Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is regenerated. +# -------------------------------------------------------------------------- + +import json +from typing import Any, Dict, IO, List, Mapping, Optional, Tuple, Union + +from ._model_base import Model, SdkJSONEncoder + + +# file-like tuple could be `(filename, IO (or bytes))` or `(filename, IO (or bytes), content_type)` +FileContent = Union[str, bytes, IO[str], IO[bytes]] + +FileType = Union[ + # file (or bytes) + FileContent, + # (filename, file (or bytes)) + Tuple[Optional[str], FileContent], + # (filename, file (or bytes), content_type) + Tuple[Optional[str], FileContent, Optional[str]], +] + + +def serialize_multipart_data_entry(data_entry: Any) -> Any: + if isinstance(data_entry, (list, tuple, dict, Model)): + return json.dumps(data_entry, cls=SdkJSONEncoder, exclude_readonly=True) + return data_entry + + +def prepare_multipart_form_data( + body: Mapping[str, Any], multipart_fields: List[str], data_fields: List[str] +) -> Tuple[List[FileType], Dict[str, Any]]: + files: List[FileType] = [] + data: Dict[str, Any] = {} + for multipart_field in multipart_fields: + multipart_entry = body.get(multipart_field) + if isinstance(multipart_entry, list): + files.extend([(multipart_field, e) for e in multipart_entry]) + elif multipart_entry: + files.append((multipart_field, multipart_entry)) + + for data_field in data_fields: + data_entry = body.get(data_field) + if data_entry: + data[data_field] = serialize_multipart_data_entry(data_entry) + + return files, data diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/_version.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/_version.py new file mode 100644 index 000000000000..4e951aba3ce1 --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/_version.py @@ -0,0 +1,9 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# Code generated by Microsoft (R) Python Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is regenerated. +# -------------------------------------------------------------------------- + +VERSION = "1.0.0b10" diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/__init__.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/__init__.py new file mode 100644 index 000000000000..820a8877a062 --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/__init__.py @@ -0,0 +1,29 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# Code generated by Microsoft (R) Python Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is regenerated. +# -------------------------------------------------------------------------- +# pylint: disable=wrong-import-position + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from ._patch import * # pylint: disable=unused-wildcard-import + +from ._client import AIProjectClient # type: ignore + +try: + from ._patch import __all__ as _patch_all + from ._patch import * +except ImportError: + _patch_all = [] +from ._patch import patch_sdk as _patch_sdk + +__all__ = [ + "AIProjectClient", +] +__all__.extend([p for p in _patch_all if p not in __all__]) # pyright: ignore + +_patch_sdk() diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/_client.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/_client.py new file mode 100644 index 000000000000..d3b05a391206 --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/_client.py @@ -0,0 +1,143 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# Code generated by Microsoft (R) Python Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is regenerated. +# -------------------------------------------------------------------------- + +from copy import deepcopy +from typing import Any, Awaitable, TYPE_CHECKING, Union +from typing_extensions import Self + +from azure.core import AsyncPipelineClient +from azure.core.credentials import AzureKeyCredential +from azure.core.pipeline import policies +from azure.core.rest import AsyncHttpResponse, HttpRequest + +from .._serialization import Deserializer, Serializer +from ._configuration import AIProjectClientConfiguration +from .operations import ( + ConnectionsOperations, + DatasetsOperations, + DeploymentsOperations, + EvaluationResultsOperations, + EvaluationsOperations, + IndexesOperations, + RedTeamsOperations, + ServicePatternsOperations, +) + +if TYPE_CHECKING: + from azure.core.credentials_async import AsyncTokenCredential + + +class AIProjectClient: # pylint: disable=too-many-instance-attributes + """AIProjectClient. + + :ivar service_patterns: ServicePatternsOperations operations + :vartype service_patterns: azure.ai.projects.onedp.aio.operations.ServicePatternsOperations + :ivar connections: ConnectionsOperations operations + :vartype connections: azure.ai.projects.onedp.aio.operations.ConnectionsOperations + :ivar evaluations: EvaluationsOperations operations + :vartype evaluations: azure.ai.projects.onedp.aio.operations.EvaluationsOperations + :ivar datasets: DatasetsOperations operations + :vartype datasets: azure.ai.projects.onedp.aio.operations.DatasetsOperations + :ivar indexes: IndexesOperations operations + :vartype indexes: azure.ai.projects.onedp.aio.operations.IndexesOperations + :ivar deployments: DeploymentsOperations operations + :vartype deployments: azure.ai.projects.onedp.aio.operations.DeploymentsOperations + :ivar red_teams: RedTeamsOperations operations + :vartype red_teams: azure.ai.projects.onedp.aio.operations.RedTeamsOperations + :ivar evaluation_results: EvaluationResultsOperations operations + :vartype evaluation_results: azure.ai.projects.onedp.aio.operations.EvaluationResultsOperations + :param endpoint: Project endpoint in the form of: + https://.services.ai.azure.com/api/projects/. Required. + :type endpoint: str + :param credential: Credential used to authenticate requests to the service. Is either a key + credential type or a token credential type. Required. + :type credential: ~azure.core.credentials.AzureKeyCredential or + ~azure.core.credentials_async.AsyncTokenCredential + :keyword api_version: The API version to use for this operation. Default value is + "2025-05-15-preview". Note that overriding this default value may result in unsupported + behavior. + :paramtype api_version: str + """ + + def __init__( + self, endpoint: str, credential: Union[AzureKeyCredential, "AsyncTokenCredential"], **kwargs: Any + ) -> None: + _endpoint = "{endpoint}" + self._config = AIProjectClientConfiguration(endpoint=endpoint, credential=credential, **kwargs) + _policies = kwargs.pop("policies", None) + if _policies is None: + _policies = [ + policies.RequestIdPolicy(**kwargs), + self._config.headers_policy, + self._config.user_agent_policy, + self._config.proxy_policy, + policies.ContentDecodePolicy(**kwargs), + self._config.redirect_policy, + self._config.retry_policy, + self._config.authentication_policy, + self._config.custom_hook_policy, + self._config.logging_policy, + policies.DistributedTracingPolicy(**kwargs), + policies.SensitiveHeaderCleanupPolicy(**kwargs) if self._config.redirect_policy else None, + self._config.http_logging_policy, + ] + self._client: AsyncPipelineClient = AsyncPipelineClient(base_url=_endpoint, policies=_policies, **kwargs) + + self._serialize = Serializer() + self._deserialize = Deserializer() + self._serialize.client_side_validation = False + self.service_patterns = ServicePatternsOperations( + self._client, self._config, self._serialize, self._deserialize + ) + self.connections = ConnectionsOperations(self._client, self._config, self._serialize, self._deserialize) + self.evaluations = EvaluationsOperations(self._client, self._config, self._serialize, self._deserialize) + self.datasets = DatasetsOperations(self._client, self._config, self._serialize, self._deserialize) + self.indexes = IndexesOperations(self._client, self._config, self._serialize, self._deserialize) + self.deployments = DeploymentsOperations(self._client, self._config, self._serialize, self._deserialize) + self.red_teams = RedTeamsOperations(self._client, self._config, self._serialize, self._deserialize) + self.evaluation_results = EvaluationResultsOperations( + self._client, self._config, self._serialize, self._deserialize + ) + + def send_request( + self, request: HttpRequest, *, stream: bool = False, **kwargs: Any + ) -> Awaitable[AsyncHttpResponse]: + """Runs the network request through the client's chained policies. + + >>> from azure.core.rest import HttpRequest + >>> request = HttpRequest("GET", "https://www.example.org/") + + >>> response = await client.send_request(request) + + + For more information on this code flow, see https://aka.ms/azsdk/dpcodegen/python/send_request + + :param request: The network request you want to make. Required. + :type request: ~azure.core.rest.HttpRequest + :keyword bool stream: Whether the response payload will be streamed. Defaults to False. + :return: The response of your network call. Does not do error handling on your response. + :rtype: ~azure.core.rest.AsyncHttpResponse + """ + + request_copy = deepcopy(request) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + + request_copy.url = self._client.format_url(request_copy.url, **path_format_arguments) + return self._client.send_request(request_copy, stream=stream, **kwargs) # type: ignore + + async def close(self) -> None: + await self._client.close() + + async def __aenter__(self) -> Self: + await self._client.__aenter__() + return self + + async def __aexit__(self, *exc_details: Any) -> None: + await self._client.__aexit__(*exc_details) diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/_configuration.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/_configuration.py new file mode 100644 index 000000000000..78e755972dd5 --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/_configuration.py @@ -0,0 +1,75 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# Code generated by Microsoft (R) Python Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is regenerated. +# -------------------------------------------------------------------------- + +from typing import Any, TYPE_CHECKING, Union + +from azure.core.credentials import AzureKeyCredential +from azure.core.pipeline import policies + +from .._version import VERSION + +if TYPE_CHECKING: + from azure.core.credentials_async import AsyncTokenCredential + + +class AIProjectClientConfiguration: # pylint: disable=too-many-instance-attributes + """Configuration for AIProjectClient. + + Note that all parameters used to create this instance are saved as instance + attributes. + + :param endpoint: Project endpoint in the form of: + https://.services.ai.azure.com/api/projects/. Required. + :type endpoint: str + :param credential: Credential used to authenticate requests to the service. Is either a key + credential type or a token credential type. Required. + :type credential: ~azure.core.credentials.AzureKeyCredential or + ~azure.core.credentials_async.AsyncTokenCredential + :keyword api_version: The API version to use for this operation. Default value is + "2025-05-15-preview". Note that overriding this default value may result in unsupported + behavior. + :paramtype api_version: str + """ + + def __init__( + self, endpoint: str, credential: Union[AzureKeyCredential, "AsyncTokenCredential"], **kwargs: Any + ) -> None: + api_version: str = kwargs.pop("api_version", "2025-05-15-preview") + + if endpoint is None: + raise ValueError("Parameter 'endpoint' must not be None.") + if credential is None: + raise ValueError("Parameter 'credential' must not be None.") + + self.endpoint = endpoint + self.credential = credential + self.api_version = api_version + self.credential_scopes = kwargs.pop("credential_scopes", ["https://cognitiveservices.azure.com/.default"]) + kwargs.setdefault("sdk_moniker", "ai-projects-onedp/{}".format(VERSION)) + self.polling_interval = kwargs.get("polling_interval", 30) + self._configure(**kwargs) + + def _infer_policy(self, **kwargs): + if isinstance(self.credential, AzureKeyCredential): + return policies.AzureKeyCredentialPolicy(self.credential, "Authorization", prefix="Bearer", **kwargs) + if hasattr(self.credential, "get_token"): + return policies.AsyncBearerTokenCredentialPolicy(self.credential, *self.credential_scopes, **kwargs) + raise TypeError(f"Unsupported credential: {self.credential}") + + def _configure(self, **kwargs: Any) -> None: + self.user_agent_policy = kwargs.get("user_agent_policy") or policies.UserAgentPolicy(**kwargs) + self.headers_policy = kwargs.get("headers_policy") or policies.HeadersPolicy(**kwargs) + self.proxy_policy = kwargs.get("proxy_policy") or policies.ProxyPolicy(**kwargs) + self.logging_policy = kwargs.get("logging_policy") or policies.NetworkTraceLoggingPolicy(**kwargs) + self.http_logging_policy = kwargs.get("http_logging_policy") or policies.HttpLoggingPolicy(**kwargs) + self.custom_hook_policy = kwargs.get("custom_hook_policy") or policies.CustomHookPolicy(**kwargs) + self.redirect_policy = kwargs.get("redirect_policy") or policies.AsyncRedirectPolicy(**kwargs) + self.retry_policy = kwargs.get("retry_policy") or policies.AsyncRetryPolicy(**kwargs) + self.authentication_policy = kwargs.get("authentication_policy") + if self.credential and not self.authentication_policy: + self.authentication_policy = self._infer_policy(**kwargs) diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/_patch.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/_patch.py new file mode 100644 index 000000000000..1bb0db275def --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/_patch.py @@ -0,0 +1,20 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +"""Customize generated code here. + +Follow our quickstart for examples: https://aka.ms/azsdk/python/dpcodegen/python/customize +""" +from typing import List + +__all__: List[str] = [] # Add all objects you want publicly available to users at this package level + + +def patch_sdk(): + """Do not remove from this file. + + `patch_sdk` is a last resort escape hatch that allows you to do customizations + you can't accomplish using the techniques described in + https://aka.ms/azsdk/python/dpcodegen/python/customize + """ diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/_vendor.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/_vendor.py new file mode 100644 index 000000000000..74627d77fa60 --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/_vendor.py @@ -0,0 +1,40 @@ +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# Code generated by Microsoft (R) Python Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is regenerated. +# -------------------------------------------------------------------------- + +from typing import Optional + +from azure.core import MatchConditions + + +def quote_etag(etag: Optional[str]) -> Optional[str]: + if not etag or etag == "*": + return etag + if etag.startswith("W/"): + return etag + if etag.startswith('"') and etag.endswith('"'): + return etag + if etag.startswith("'") and etag.endswith("'"): + return etag + return '"' + etag + '"' + + +def prep_if_match(etag: Optional[str], match_condition: Optional[MatchConditions]) -> Optional[str]: + if match_condition == MatchConditions.IfNotModified: + if_match = quote_etag(etag) if etag else None + return if_match + if match_condition == MatchConditions.IfPresent: + return "*" + return None + + +def prep_if_none_match(etag: Optional[str], match_condition: Optional[MatchConditions]) -> Optional[str]: + if match_condition == MatchConditions.IfModified: + if_none_match = quote_etag(etag) if etag else None + return if_none_match + if match_condition == MatchConditions.IfMissing: + return "*" + return None diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/operations/__init__.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/operations/__init__.py new file mode 100644 index 000000000000..cff79d256c20 --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/operations/__init__.py @@ -0,0 +1,39 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# Code generated by Microsoft (R) Python Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is regenerated. +# -------------------------------------------------------------------------- +# pylint: disable=wrong-import-position + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from ._patch import * # pylint: disable=unused-wildcard-import + +from ._operations import ServicePatternsOperations # type: ignore +from ._operations import ConnectionsOperations # type: ignore +from ._operations import EvaluationsOperations # type: ignore +from ._operations import DatasetsOperations # type: ignore +from ._operations import IndexesOperations # type: ignore +from ._operations import DeploymentsOperations # type: ignore +from ._operations import RedTeamsOperations # type: ignore +from ._operations import EvaluationResultsOperations # type: ignore + +from ._patch import __all__ as _patch_all +from ._patch import * +from ._patch import patch_sdk as _patch_sdk + +__all__ = [ + "ServicePatternsOperations", + "ConnectionsOperations", + "EvaluationsOperations", + "DatasetsOperations", + "IndexesOperations", + "DeploymentsOperations", + "RedTeamsOperations", + "EvaluationResultsOperations", +] +__all__.extend([p for p in _patch_all if p not in __all__]) # pyright: ignore +_patch_sdk() diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/operations/_operations.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/operations/_operations.py new file mode 100644 index 000000000000..186ab08b5873 --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/operations/_operations.py @@ -0,0 +1,4613 @@ +# pylint: disable=too-many-lines +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# Code generated by Microsoft (R) Python Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is regenerated. +# -------------------------------------------------------------------------- +from io import IOBase +import json +import sys +from typing import Any, AsyncIterable, Callable, Dict, IO, List, Optional, TypeVar, Union, overload +import urllib.parse + +from azure.core import AsyncPipelineClient +from azure.core.async_paging import AsyncItemPaged, AsyncList +from azure.core.exceptions import ( + ClientAuthenticationError, + HttpResponseError, + ResourceExistsError, + ResourceNotFoundError, + ResourceNotModifiedError, + StreamClosedError, + StreamConsumedError, + map_error, +) +from azure.core.pipeline import PipelineResponse +from azure.core.rest import AsyncHttpResponse, HttpRequest +from azure.core.tracing.decorator import distributed_trace +from azure.core.tracing.decorator_async import distributed_trace_async +from azure.core.utils import case_insensitive_dict + +from ... import models as _models +from ..._model_base import SdkJSONEncoder, _deserialize +from ..._serialization import Deserializer, Serializer +from ..._validation import api_version_validation +from ...operations._operations import ( + build_connections_get_request, + build_connections_list_request, + build_datasets_create_request, + build_datasets_create_version_request, + build_datasets_delete_version_request, + build_datasets_fetch_asset_credentials_request, + build_datasets_get_version_request, + build_datasets_list_latest_request, + build_datasets_list_versions_request, + build_datasets_start_pending_upload_request, + build_datasets_start_pending_upload_version_request, + build_deployments_get_request, + build_deployments_list_request, + build_evaluation_results_create_request, + build_evaluation_results_create_version_request, + build_evaluation_results_delete_version_request, + build_evaluation_results_fetch_asset_credentials_request, + build_evaluation_results_get_version_request, + build_evaluation_results_list_latest_request, + build_evaluation_results_list_versions_request, + build_evaluation_results_start_pending_upload_request, + build_evaluations_check_annotation_request, + build_evaluations_create_run_request, + build_evaluations_get_request, + build_evaluations_list_request, + build_evaluations_submit_annotation_request, + build_evaluations_upload_run_request, + build_evaluations_upload_update_run_request, + build_indexes_create_request, + build_indexes_create_version_request, + build_indexes_delete_version_request, + build_indexes_get_version_request, + build_indexes_list_latest_request, + build_indexes_list_versions_request, + build_red_teams_create_run_request, + build_red_teams_get_attack_objectives_request, + build_red_teams_get_jail_break_dataset_request, + build_red_teams_get_jail_break_dataset_with_type_request, + build_red_teams_get_request, + build_red_teams_get_template_parameters_image_request, + build_red_teams_get_template_parameters_request, + build_red_teams_get_template_parameters_with_type_request, + build_red_teams_list_request, + build_red_teams_submit_simulation_request, + build_red_teams_upload_run_request, + build_red_teams_upload_update_run_request, +) +from .._configuration import AIProjectClientConfiguration + +if sys.version_info >= (3, 9): + from collections.abc import MutableMapping +else: + from typing import MutableMapping # type: ignore +T = TypeVar("T") +ClsType = Optional[Callable[[PipelineResponse[HttpRequest, AsyncHttpResponse], T, Dict[str, Any]], Any]] +JSON = MutableMapping[str, Any] # pylint: disable=unsubscriptable-object + + +class ServicePatternsOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.onedp.aio.AIProjectClient`'s + :attr:`service_patterns` attribute. + """ + + def __init__(self, *args, **kwargs) -> None: + input_args = list(args) + self._client: AsyncPipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + + self.building_blocks = ServicePatternsBuildingBlocksOperations( + self._client, self._config, self._serialize, self._deserialize + ) + + +class ConnectionsOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.onedp.aio.AIProjectClient`'s + :attr:`connections` attribute. + """ + + def __init__(self, *args, **kwargs) -> None: + input_args = list(args) + self._client: AsyncPipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + + @distributed_trace_async + async def get(self, name: str, **kwargs: Any) -> _models.Connection: + """Get a connection by name. + + :param name: The name of the resource. Required. + :type name: str + :return: Connection. The Connection is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Connection + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.Connection] = kwargs.pop("cls", None) + + _request = build_connections_get_request( + name=name, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + response_headers = {} + response_headers["x-ms-client-request-id"] = self._deserialize( + "str", response.headers.get("x-ms-client-request-id") + ) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.Connection, response.json()) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + def list( + self, + *, + connection_type: Optional[Union[str, _models.ConnectionType]] = None, + top: Optional[int] = None, + skip: Optional[int] = None, + **kwargs: Any + ) -> AsyncIterable["_models.Connection"]: + """List all connections in the project. + + :keyword connection_type: Specific type of connection to return in list. Known values are: + "AzureOpenAI", "AzureBlob", "CognitiveSearch", "CosmosDB", "ApiKey", "AppInsights", and + "CustomKeys". Default value is None. + :paramtype connection_type: str or ~azure.ai.projects.onedp.models.ConnectionType + :keyword top: The number of result items to return. Default value is None. + :paramtype top: int + :keyword skip: The number of result items to skip. Default value is None. + :paramtype skip: int + :return: An iterator like instance of Connection + :rtype: ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.onedp.models.Connection] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + maxpagesize = kwargs.pop("maxpagesize", None) + cls: ClsType[List[_models.Connection]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + _request = build_connections_list_request( + connection_type=connection_type, + top=top, + skip=skip, + maxpagesize=maxpagesize, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + else: + # make call to next link with the client's api-version + _parsed_next_link = urllib.parse.urlparse(next_link) + _next_request_params = case_insensitive_dict( + { + key: [urllib.parse.quote(v) for v in value] + for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() + } + ) + _next_request_params["api-version"] = self._config.api_version + _request = HttpRequest( + "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + return _request + + async def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.Connection], deserialized.get("value", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("nextLink") or None, AsyncList(list_of_elem) + + async def get_next(next_link=None): + _request = prepare_request(next_link) + + _stream = False + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return AsyncItemPaged(get_next, extract_data) + + +class EvaluationsOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.onedp.aio.AIProjectClient`'s + :attr:`evaluations` attribute. + """ + + def __init__(self, *args, **kwargs) -> None: + input_args = list(args) + self._client: AsyncPipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "name", "client_request_id", "accept"]}, + ) + async def get(self, name: str, **kwargs: Any) -> _models.Evaluation: + """Get an evaluation run by name. + + :param name: Identifier of the evaluation. Required. + :type name: str + :return: Evaluation. The Evaluation is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Evaluation + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.Evaluation] = kwargs.pop("cls", None) + + _request = build_evaluations_get_request( + name=name, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + response_headers = {} + response_headers["x-ms-client-request-id"] = self._deserialize( + "str", response.headers.get("x-ms-client-request-id") + ) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.Evaluation, response.json()) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={ + "2025-05-15-preview": [ + "api_version", + "tags", + "properties", + "top", + "skip", + "maxpagesize", + "client_request_id", + "accept", + ] + }, + ) + def list( + self, + *, + tags: Optional[str] = None, + properties: Optional[str] = None, + top: Optional[int] = None, + skip: Optional[int] = None, + **kwargs: Any + ) -> AsyncIterable["_models.Evaluation"]: + """List evaluation runs. + + :keyword tags: Comma-separated list of tag names (and optionally values). Example: + tag1,tag2=value2. Default value is None. + :paramtype tags: str + :keyword properties: Comma-separated list of property names (and optionally values). Example: + prop1,prop2=value2. Default value is None. + :paramtype properties: str + :keyword top: The number of result items to return. Default value is None. + :paramtype top: int + :keyword skip: The number of result items to skip. Default value is None. + :paramtype skip: int + :return: An iterator like instance of Evaluation + :rtype: ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.onedp.models.Evaluation] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + maxpagesize = kwargs.pop("maxpagesize", None) + cls: ClsType[List[_models.Evaluation]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + _request = build_evaluations_list_request( + tags=tags, + properties=properties, + top=top, + skip=skip, + maxpagesize=maxpagesize, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + else: + # make call to next link with the client's api-version + _parsed_next_link = urllib.parse.urlparse(next_link) + _next_request_params = case_insensitive_dict( + { + key: [urllib.parse.quote(v) for v in value] + for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() + } + ) + _next_request_params["api-version"] = self._config.api_version + _request = HttpRequest( + "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + return _request + + async def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.Evaluation], deserialized.get("value", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("nextLink") or None, AsyncList(list_of_elem) + + async def get_next(next_link=None): + _request = prepare_request(next_link) + + _stream = False + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return AsyncItemPaged(get_next, extract_data) + + @overload + async def create_run( + self, evaluation: _models.Evaluation, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Evaluation: + """Creates an evaluation run. + + :param evaluation: Evaluation to be run. Required. + :type evaluation: ~azure.ai.projects.onedp.models.Evaluation + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: Evaluation. The Evaluation is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Evaluation + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def create_run( + self, evaluation: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Evaluation: + """Creates an evaluation run. + + :param evaluation: Evaluation to be run. Required. + :type evaluation: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: Evaluation. The Evaluation is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Evaluation + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def create_run( + self, evaluation: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Evaluation: + """Creates an evaluation run. + + :param evaluation: Evaluation to be run. Required. + :type evaluation: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: Evaluation. The Evaluation is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Evaluation + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "content_type", "accept"]}, + ) + async def create_run( + self, evaluation: Union[_models.Evaluation, JSON, IO[bytes]], **kwargs: Any + ) -> _models.Evaluation: + """Creates an evaluation run. + + :param evaluation: Evaluation to be run. Is one of the following types: Evaluation, JSON, + IO[bytes] Required. + :type evaluation: ~azure.ai.projects.onedp.models.Evaluation or JSON or IO[bytes] + :return: Evaluation. The Evaluation is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Evaluation + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.Evaluation] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(evaluation, (IOBase, bytes)): + _content = evaluation + else: + _content = json.dumps(evaluation, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_evaluations_create_run_request( + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.Evaluation, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "accept"]}, + ) + async def _check_annotation(self, **kwargs: Any) -> List[str]: + """Check annotation supported by the service. + + :return: list of str + :rtype: list[str] + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[str]] = kwargs.pop("cls", None) + + _request = build_evaluations_check_annotation_request( + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(List[str], response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + async def _submit_annotation( + self, annotation_dto: _models._models.AnnotationDTO, *, content_type: str = "application/json", **kwargs: Any + ) -> str: ... + @overload + async def _submit_annotation( + self, annotation_dto: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> str: ... + @overload + async def _submit_annotation( + self, annotation_dto: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> str: ... + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "content_type", "accept"]}, + ) + async def _submit_annotation( + self, annotation_dto: Union[_models._models.AnnotationDTO, JSON, IO[bytes]], **kwargs: Any + ) -> str: + """Submit the annotation. + + :param annotation_dto: Annotation data inputList of supported annotation. Is one of the + following types: AnnotationDTO, JSON, IO[bytes] Required. + :type annotation_dto: ~azure.ai.projects.onedp.models._models.AnnotationDTO or JSON or + IO[bytes] + :return: str + :rtype: str + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[str] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(annotation_dto, (IOBase, bytes)): + _content = annotation_dto + else: + _content = json.dumps(annotation_dto, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_evaluations_submit_annotation_request( + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [202]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(str, response.text()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + async def _upload_run( + self, evaluation: _models._models.EvaluationUpload, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Evaluation: ... + @overload + async def _upload_run( + self, evaluation: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Evaluation: ... + @overload + async def _upload_run( + self, evaluation: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Evaluation: ... + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "content_type", "accept"]}, + ) + async def _upload_run( + self, evaluation: Union[_models._models.EvaluationUpload, JSON, IO[bytes]], **kwargs: Any + ) -> _models.Evaluation: + """Upload the result to an evaluation run. + + :param evaluation: Evaluation to upload. Is one of the following types: EvaluationUpload, JSON, + IO[bytes] Required. + :type evaluation: ~azure.ai.projects.onedp.models._models.EvaluationUpload or JSON or IO[bytes] + :return: Evaluation. The Evaluation is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Evaluation + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.Evaluation] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(evaluation, (IOBase, bytes)): + _content = evaluation + else: + _content = json.dumps(evaluation, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_evaluations_upload_run_request( + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.Evaluation, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + async def _upload_update_run( + self, + name: str, + evaluation: _models._models.EvaluationUpload, + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models.Evaluation: ... + @overload + async def _upload_update_run( + self, name: str, evaluation: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Evaluation: ... + @overload + async def _upload_update_run( + self, name: str, evaluation: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Evaluation: ... + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "name", "content_type", "accept"]}, + ) + async def _upload_update_run( + self, name: str, evaluation: Union[_models._models.EvaluationUpload, JSON, IO[bytes]], **kwargs: Any + ) -> _models.Evaluation: + """Update the uploaded the result to an evaluation run. + + :param name: Name of the evaluation run to update. Required. + :type name: str + :param evaluation: Evaluation upload to update. Is one of the following types: + EvaluationUpload, JSON, IO[bytes] Required. + :type evaluation: ~azure.ai.projects.onedp.models._models.EvaluationUpload or JSON or IO[bytes] + :return: Evaluation. The Evaluation is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Evaluation + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.Evaluation] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(evaluation, (IOBase, bytes)): + _content = evaluation + else: + _content = json.dumps(evaluation, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_evaluations_upload_update_run_request( + name=name, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.Evaluation, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + +class DatasetsOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.onedp.aio.AIProjectClient`'s + :attr:`datasets` attribute. + """ + + def __init__(self, *args, **kwargs) -> None: + input_args = list(args) + self._client: AsyncPipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + + @distributed_trace + def list_versions( + self, + name: str, + *, + top: Optional[int] = None, + skip: Optional[str] = None, + tags: Optional[str] = None, + list_view_type: Optional[Union[str, _models.ListViewType]] = None, + **kwargs: Any + ) -> AsyncIterable["_models.DatasetVersion"]: + """List all versions of the given DatasetVersion. + + :param name: The name of the resource. Required. + :type name: str + :keyword top: Top count of results, top count cannot be greater than the page size. If topCount + > page size, results with be default page size count will be returned. Default value is None. + :paramtype top: int + :keyword skip: Continuation token for pagination. Default value is None. + :paramtype skip: str + :keyword tags: Comma-separated list of tag names (and optionally values). Example: + tag1,tag2=value2. Default value is None. + :paramtype tags: str + :keyword list_view_type: [ListViewType.ActiveOnly, ListViewType.ArchivedOnly, ListViewType.All] + View type for including/excluding (for example) archived entities. Known values are: + "ActiveOnly", "ArchivedOnly", and "All". Default value is None. + :paramtype list_view_type: str or ~azure.ai.projects.onedp.models.ListViewType + :return: An iterator like instance of DatasetVersion + :rtype: ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.onedp.models.DatasetVersion] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models.DatasetVersion]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + _request = build_datasets_list_versions_request( + name=name, + top=top, + skip=skip, + tags=tags, + list_view_type=list_view_type, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + else: + # make call to next link with the client's api-version + _parsed_next_link = urllib.parse.urlparse(next_link) + _next_request_params = case_insensitive_dict( + { + key: [urllib.parse.quote(v) for v in value] + for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() + } + ) + _next_request_params["api-version"] = self._config.api_version + _request = HttpRequest( + "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + return _request + + async def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.DatasetVersion], deserialized.get("value", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("nextLink") or None, AsyncList(list_of_elem) + + async def get_next(next_link=None): + _request = prepare_request(next_link) + + _stream = False + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return AsyncItemPaged(get_next, extract_data) + + @distributed_trace + def list_latest( + self, + *, + top: Optional[int] = None, + skip: Optional[str] = None, + tags: Optional[str] = None, + list_view_type: Optional[Union[str, _models.ListViewType]] = None, + **kwargs: Any + ) -> AsyncIterable["_models.DatasetVersion"]: + """List the latest version of each DatasetVersion. + + :keyword top: Top count of results, top count cannot be greater than the page size. If topCount + > page size, results with be default page size count will be returned. Default value is None. + :paramtype top: int + :keyword skip: Continuation token for pagination. Default value is None. + :paramtype skip: str + :keyword tags: Comma-separated list of tag names (and optionally values). Example: + tag1,tag2=value2. Default value is None. + :paramtype tags: str + :keyword list_view_type: [ListViewType.ActiveOnly, ListViewType.ArchivedOnly, ListViewType.All] + View type for including/excluding (for example) archived entities. Known values are: + "ActiveOnly", "ArchivedOnly", and "All". Default value is None. + :paramtype list_view_type: str or ~azure.ai.projects.onedp.models.ListViewType + :return: An iterator like instance of DatasetVersion + :rtype: ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.onedp.models.DatasetVersion] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models.DatasetVersion]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + _request = build_datasets_list_latest_request( + top=top, + skip=skip, + tags=tags, + list_view_type=list_view_type, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + else: + # make call to next link with the client's api-version + _parsed_next_link = urllib.parse.urlparse(next_link) + _next_request_params = case_insensitive_dict( + { + key: [urllib.parse.quote(v) for v in value] + for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() + } + ) + _next_request_params["api-version"] = self._config.api_version + _request = HttpRequest( + "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + return _request + + async def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.DatasetVersion], deserialized.get("value", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("nextLink") or None, AsyncList(list_of_elem) + + async def get_next(next_link=None): + _request = prepare_request(next_link) + + _stream = False + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return AsyncItemPaged(get_next, extract_data) + + @distributed_trace_async + async def get_version(self, name: str, version: str, **kwargs: Any) -> _models.DatasetVersion: + """Get the specific version of the DatasetVersion. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to retrieve. Required. + :type version: str + :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.DatasetVersion + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.DatasetVersion] = kwargs.pop("cls", None) + + _request = build_datasets_get_version_request( + name=name, + version=version, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.DatasetVersion, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace_async + async def delete_version(self, name: str, version: str, **kwargs: Any) -> None: + """Delete the specific version of the DatasetVersion. + + :param name: The name of the resource. Required. + :type name: str + :param version: The version of the DatasetVersion to delete. Required. + :type version: str + :return: None + :rtype: None + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[None] = kwargs.pop("cls", None) + + _request = build_datasets_delete_version_request( + name=name, + version=version, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = False + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [204]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if cls: + return cls(pipeline_response, None, {}) # type: ignore + + @overload + async def create( + self, name: str, body: _models.DatasetVersion, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.DatasetVersion: + """Create a new DatasetVersion. The version id will be generated by the service. + + :param name: The name of the resource. Required. + :type name: str + :param body: The definition of the DatasetVersion to create. Required. + :type body: ~azure.ai.projects.onedp.models.DatasetVersion + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.DatasetVersion + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def create( + self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.DatasetVersion: + """Create a new DatasetVersion. The version id will be generated by the service. + + :param name: The name of the resource. Required. + :type name: str + :param body: The definition of the DatasetVersion to create. Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.DatasetVersion + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def create( + self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.DatasetVersion: + """Create a new DatasetVersion. The version id will be generated by the service. + + :param name: The name of the resource. Required. + :type name: str + :param body: The definition of the DatasetVersion to create. Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.DatasetVersion + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace_async + async def create( + self, name: str, body: Union[_models.DatasetVersion, JSON, IO[bytes]], **kwargs: Any + ) -> _models.DatasetVersion: + """Create a new DatasetVersion. The version id will be generated by the service. + + :param name: The name of the resource. Required. + :type name: str + :param body: The definition of the DatasetVersion to create. Is one of the following types: + DatasetVersion, JSON, IO[bytes] Required. + :type body: ~azure.ai.projects.onedp.models.DatasetVersion or JSON or IO[bytes] + :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.DatasetVersion + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.DatasetVersion] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_datasets_create_request( + name=name, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + response_headers = {} + response_headers["Repeatability-Result"] = self._deserialize( + "str", response.headers.get("Repeatability-Result") + ) + response_headers["x-ms-client-request-id"] = self._deserialize( + "str", response.headers.get("x-ms-client-request-id") + ) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.DatasetVersion, response.json()) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @overload + async def create_version( + self, + name: str, + version: str, + body: _models.DatasetVersion, + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models.DatasetVersion: + """Create a new or replace an existing DatasetVersion with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to create or replace. Required. + :type version: str + :param body: The definition of the DatasetVersion to create. Required. + :type body: ~azure.ai.projects.onedp.models.DatasetVersion + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.DatasetVersion + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def create_version( + self, name: str, version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.DatasetVersion: + """Create a new or replace an existing DatasetVersion with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to create or replace. Required. + :type version: str + :param body: The definition of the DatasetVersion to create. Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.DatasetVersion + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def create_version( + self, name: str, version: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.DatasetVersion: + """Create a new or replace an existing DatasetVersion with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to create or replace. Required. + :type version: str + :param body: The definition of the DatasetVersion to create. Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.DatasetVersion + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace_async + async def create_version( + self, name: str, version: str, body: Union[_models.DatasetVersion, JSON, IO[bytes]], **kwargs: Any + ) -> _models.DatasetVersion: + """Create a new or replace an existing DatasetVersion with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to create or replace. Required. + :type version: str + :param body: The definition of the DatasetVersion to create. Is one of the following types: + DatasetVersion, JSON, IO[bytes] Required. + :type body: ~azure.ai.projects.onedp.models.DatasetVersion or JSON or IO[bytes] + :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.DatasetVersion + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.DatasetVersion] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_datasets_create_version_request( + name=name, + version=version, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200, 201]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.DatasetVersion, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + async def start_pending_upload_version( + self, + name: str, + version: str, + body: _models.PendingUploadRequest, + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models.PendingUploadResponse: + """Create or start a pending upload of a dataset for a specific version. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to operate on. Required. + :type version: str + :param body: Parameters for the action. Required. + :type body: ~azure.ai.projects.onedp.models.PendingUploadRequest + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def start_pending_upload_version( + self, name: str, version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.PendingUploadResponse: + """Create or start a pending upload of a dataset for a specific version. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to operate on. Required. + :type version: str + :param body: Parameters for the action. Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def start_pending_upload_version( + self, name: str, version: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.PendingUploadResponse: + """Create or start a pending upload of a dataset for a specific version. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to operate on. Required. + :type version: str + :param body: Parameters for the action. Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace_async + async def start_pending_upload_version( + self, name: str, version: str, body: Union[_models.PendingUploadRequest, JSON, IO[bytes]], **kwargs: Any + ) -> _models.PendingUploadResponse: + """Create or start a pending upload of a dataset for a specific version. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to operate on. Required. + :type version: str + :param body: Parameters for the action. Is one of the following types: PendingUploadRequest, + JSON, IO[bytes] Required. + :type body: ~azure.ai.projects.onedp.models.PendingUploadRequest or JSON or IO[bytes] + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.PendingUploadResponse] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_datasets_start_pending_upload_version_request( + name=name, + version=version, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.PendingUploadResponse, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + async def start_pending_upload( + self, name: str, body: _models.PendingUploadRequest, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.PendingUploadResponse: + """Create or start a pending upload of a dataset. The version id will be generated by the service. + + :param name: The name of the resource. Required. + :type name: str + :param body: Parameters for the action. Required. + :type body: ~azure.ai.projects.onedp.models.PendingUploadRequest + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def start_pending_upload( + self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.PendingUploadResponse: + """Create or start a pending upload of a dataset. The version id will be generated by the service. + + :param name: The name of the resource. Required. + :type name: str + :param body: Parameters for the action. Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def start_pending_upload( + self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.PendingUploadResponse: + """Create or start a pending upload of a dataset. The version id will be generated by the service. + + :param name: The name of the resource. Required. + :type name: str + :param body: Parameters for the action. Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace_async + async def start_pending_upload( + self, name: str, body: Union[_models.PendingUploadRequest, JSON, IO[bytes]], **kwargs: Any + ) -> _models.PendingUploadResponse: + """Create or start a pending upload of a dataset. The version id will be generated by the service. + + :param name: The name of the resource. Required. + :type name: str + :param body: Parameters for the action. Is one of the following types: PendingUploadRequest, + JSON, IO[bytes] Required. + :type body: ~azure.ai.projects.onedp.models.PendingUploadRequest or JSON or IO[bytes] + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.PendingUploadResponse] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_datasets_start_pending_upload_request( + name=name, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.PendingUploadResponse, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + async def fetch_asset_credentials( + self, + name: str, + version: str, + asset_credential_request: _models.AssetCredentialRequest, + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models.AssetCredentialResponse: + """Enable downloading json. + + :param name: Name of the resource. Required. + :type name: str + :param version: Version of the resource. Required. + :type version: str + :param asset_credential_request: Input asset to fetch credentials for. Required. + :type asset_credential_request: ~azure.ai.projects.onedp.models.AssetCredentialRequest + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: AssetCredentialResponse. The AssetCredentialResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.AssetCredentialResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def fetch_asset_credentials( + self, + name: str, + version: str, + asset_credential_request: JSON, + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models.AssetCredentialResponse: + """Enable downloading json. + + :param name: Name of the resource. Required. + :type name: str + :param version: Version of the resource. Required. + :type version: str + :param asset_credential_request: Input asset to fetch credentials for. Required. + :type asset_credential_request: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: AssetCredentialResponse. The AssetCredentialResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.AssetCredentialResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def fetch_asset_credentials( + self, + name: str, + version: str, + asset_credential_request: IO[bytes], + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models.AssetCredentialResponse: + """Enable downloading json. + + :param name: Name of the resource. Required. + :type name: str + :param version: Version of the resource. Required. + :type version: str + :param asset_credential_request: Input asset to fetch credentials for. Required. + :type asset_credential_request: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: AssetCredentialResponse. The AssetCredentialResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.AssetCredentialResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "name", "version", "content_type", "accept"]}, + ) + async def fetch_asset_credentials( + self, + name: str, + version: str, + asset_credential_request: Union[_models.AssetCredentialRequest, JSON, IO[bytes]], + **kwargs: Any + ) -> _models.AssetCredentialResponse: + """Enable downloading json. + + :param name: Name of the resource. Required. + :type name: str + :param version: Version of the resource. Required. + :type version: str + :param asset_credential_request: Input asset to fetch credentials for. Is one of the following + types: AssetCredentialRequest, JSON, IO[bytes] Required. + :type asset_credential_request: ~azure.ai.projects.onedp.models.AssetCredentialRequest or JSON + or IO[bytes] + :return: AssetCredentialResponse. The AssetCredentialResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.AssetCredentialResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.AssetCredentialResponse] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(asset_credential_request, (IOBase, bytes)): + _content = asset_credential_request + else: + _content = json.dumps(asset_credential_request, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_datasets_fetch_asset_credentials_request( + name=name, + version=version, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.AssetCredentialResponse, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + +class IndexesOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.onedp.aio.AIProjectClient`'s + :attr:`indexes` attribute. + """ + + def __init__(self, *args, **kwargs) -> None: + input_args = list(args) + self._client: AsyncPipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + + @distributed_trace + def list_versions( + self, + name: str, + *, + top: Optional[int] = None, + skip: Optional[str] = None, + tags: Optional[str] = None, + list_view_type: Optional[Union[str, _models.ListViewType]] = None, + **kwargs: Any + ) -> AsyncIterable["_models.Index"]: + """List all versions of the given Index. + + :param name: The name of the resource. Required. + :type name: str + :keyword top: Top count of results, top count cannot be greater than the page size. If topCount + > page size, results with be default page size count will be returned. Default value is None. + :paramtype top: int + :keyword skip: Continuation token for pagination. Default value is None. + :paramtype skip: str + :keyword tags: Comma-separated list of tag names (and optionally values). Example: + tag1,tag2=value2. Default value is None. + :paramtype tags: str + :keyword list_view_type: [ListViewType.ActiveOnly, ListViewType.ArchivedOnly, ListViewType.All] + View type for including/excluding (for example) archived entities. Known values are: + "ActiveOnly", "ArchivedOnly", and "All". Default value is None. + :paramtype list_view_type: str or ~azure.ai.projects.onedp.models.ListViewType + :return: An iterator like instance of Index + :rtype: ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.onedp.models.Index] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models.Index]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + _request = build_indexes_list_versions_request( + name=name, + top=top, + skip=skip, + tags=tags, + list_view_type=list_view_type, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + else: + # make call to next link with the client's api-version + _parsed_next_link = urllib.parse.urlparse(next_link) + _next_request_params = case_insensitive_dict( + { + key: [urllib.parse.quote(v) for v in value] + for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() + } + ) + _next_request_params["api-version"] = self._config.api_version + _request = HttpRequest( + "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + return _request + + async def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.Index], deserialized.get("value", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("nextLink") or None, AsyncList(list_of_elem) + + async def get_next(next_link=None): + _request = prepare_request(next_link) + + _stream = False + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return AsyncItemPaged(get_next, extract_data) + + @distributed_trace + def list_latest( + self, + *, + top: Optional[int] = None, + skip: Optional[str] = None, + tags: Optional[str] = None, + list_view_type: Optional[Union[str, _models.ListViewType]] = None, + **kwargs: Any + ) -> AsyncIterable["_models.Index"]: + """List the latest version of each Index. + + :keyword top: Top count of results, top count cannot be greater than the page size. If topCount + > page size, results with be default page size count will be returned. Default value is None. + :paramtype top: int + :keyword skip: Continuation token for pagination. Default value is None. + :paramtype skip: str + :keyword tags: Comma-separated list of tag names (and optionally values). Example: + tag1,tag2=value2. Default value is None. + :paramtype tags: str + :keyword list_view_type: [ListViewType.ActiveOnly, ListViewType.ArchivedOnly, ListViewType.All] + View type for including/excluding (for example) archived entities. Known values are: + "ActiveOnly", "ArchivedOnly", and "All". Default value is None. + :paramtype list_view_type: str or ~azure.ai.projects.onedp.models.ListViewType + :return: An iterator like instance of Index + :rtype: ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.onedp.models.Index] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models.Index]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + _request = build_indexes_list_latest_request( + top=top, + skip=skip, + tags=tags, + list_view_type=list_view_type, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + else: + # make call to next link with the client's api-version + _parsed_next_link = urllib.parse.urlparse(next_link) + _next_request_params = case_insensitive_dict( + { + key: [urllib.parse.quote(v) for v in value] + for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() + } + ) + _next_request_params["api-version"] = self._config.api_version + _request = HttpRequest( + "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + return _request + + async def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.Index], deserialized.get("value", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("nextLink") or None, AsyncList(list_of_elem) + + async def get_next(next_link=None): + _request = prepare_request(next_link) + + _stream = False + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return AsyncItemPaged(get_next, extract_data) + + @distributed_trace_async + async def get_version(self, name: str, version: str, **kwargs: Any) -> _models.Index: + """Get the specific version of the Index. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the Index to retrieve. Required. + :type version: str + :return: Index. The Index is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Index + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.Index] = kwargs.pop("cls", None) + + _request = build_indexes_get_version_request( + name=name, + version=version, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.Index, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace_async + async def delete_version(self, name: str, version: str, **kwargs: Any) -> None: + """Delete the specific version of the Index. + + :param name: The name of the resource. Required. + :type name: str + :param version: The version of the Index to delete. Required. + :type version: str + :return: None + :rtype: None + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[None] = kwargs.pop("cls", None) + + _request = build_indexes_delete_version_request( + name=name, + version=version, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = False + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [204]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if cls: + return cls(pipeline_response, None, {}) # type: ignore + + @overload + async def create( + self, name: str, body: _models.Index, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Index: + """Create a new Index. The version id will be generated by the service. + + :param name: The name of the resource. Required. + :type name: str + :param body: The definition of the Index to create. Required. + :type body: ~azure.ai.projects.onedp.models.Index + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: Index. The Index is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Index + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def create( + self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Index: + """Create a new Index. The version id will be generated by the service. + + :param name: The name of the resource. Required. + :type name: str + :param body: The definition of the Index to create. Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: Index. The Index is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Index + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def create( + self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Index: + """Create a new Index. The version id will be generated by the service. + + :param name: The name of the resource. Required. + :type name: str + :param body: The definition of the Index to create. Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: Index. The Index is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Index + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace_async + async def create(self, name: str, body: Union[_models.Index, JSON, IO[bytes]], **kwargs: Any) -> _models.Index: + """Create a new Index. The version id will be generated by the service. + + :param name: The name of the resource. Required. + :type name: str + :param body: The definition of the Index to create. Is one of the following types: Index, JSON, + IO[bytes] Required. + :type body: ~azure.ai.projects.onedp.models.Index or JSON or IO[bytes] + :return: Index. The Index is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Index + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.Index] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_indexes_create_request( + name=name, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + response_headers = {} + response_headers["Repeatability-Result"] = self._deserialize( + "str", response.headers.get("Repeatability-Result") + ) + response_headers["x-ms-client-request-id"] = self._deserialize( + "str", response.headers.get("x-ms-client-request-id") + ) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.Index, response.json()) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @overload + async def create_version( + self, name: str, version: str, body: _models.Index, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Index: + """Create a new or replace an existing Index with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the Index to create or replace. Required. + :type version: str + :param body: The definition of the Index to create. Required. + :type body: ~azure.ai.projects.onedp.models.Index + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: Index. The Index is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Index + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def create_version( + self, name: str, version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Index: + """Create a new or replace an existing Index with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the Index to create or replace. Required. + :type version: str + :param body: The definition of the Index to create. Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: Index. The Index is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Index + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def create_version( + self, name: str, version: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Index: + """Create a new or replace an existing Index with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the Index to create or replace. Required. + :type version: str + :param body: The definition of the Index to create. Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: Index. The Index is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Index + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace_async + async def create_version( + self, name: str, version: str, body: Union[_models.Index, JSON, IO[bytes]], **kwargs: Any + ) -> _models.Index: + """Create a new or replace an existing Index with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the Index to create or replace. Required. + :type version: str + :param body: The definition of the Index to create. Is one of the following types: Index, JSON, + IO[bytes] Required. + :type body: ~azure.ai.projects.onedp.models.Index or JSON or IO[bytes] + :return: Index. The Index is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Index + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.Index] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_indexes_create_version_request( + name=name, + version=version, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200, 201]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.Index, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + +class DeploymentsOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.onedp.aio.AIProjectClient`'s + :attr:`deployments` attribute. + """ + + def __init__(self, *args, **kwargs) -> None: + input_args = list(args) + self._client: AsyncPipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + + @distributed_trace_async + async def get(self, name: str, **kwargs: Any) -> _models.Deployment: + """Get a deployed model. + + :param name: Name of the deployment. Required. + :type name: str + :return: Deployment. The Deployment is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Deployment + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.Deployment] = kwargs.pop("cls", None) + + _request = build_deployments_get_request( + name=name, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + response_headers = {} + response_headers["x-ms-client-request-id"] = self._deserialize( + "str", response.headers.get("x-ms-client-request-id") + ) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.Deployment, response.json()) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + def list( + self, + *, + model_publisher: Optional[str] = None, + model_name: Optional[str] = None, + top: Optional[int] = None, + skip: Optional[int] = None, + **kwargs: Any + ) -> AsyncIterable["_models.Deployment"]: + """List all deployed models in the project. + + :keyword model_publisher: Model publisher to filter models by. Default value is None. + :paramtype model_publisher: str + :keyword model_name: Model name (the publisher specific name) to filter models by. Default + value is None. + :paramtype model_name: str + :keyword top: The number of result items to return. Default value is None. + :paramtype top: int + :keyword skip: The number of result items to skip. Default value is None. + :paramtype skip: int + :return: An iterator like instance of Deployment + :rtype: ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.onedp.models.Deployment] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + maxpagesize = kwargs.pop("maxpagesize", None) + cls: ClsType[List[_models.Deployment]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + _request = build_deployments_list_request( + model_publisher=model_publisher, + model_name=model_name, + top=top, + skip=skip, + maxpagesize=maxpagesize, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + else: + # make call to next link with the client's api-version + _parsed_next_link = urllib.parse.urlparse(next_link) + _next_request_params = case_insensitive_dict( + { + key: [urllib.parse.quote(v) for v in value] + for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() + } + ) + _next_request_params["api-version"] = self._config.api_version + _request = HttpRequest( + "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + return _request + + async def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.Deployment], deserialized.get("value", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("nextLink") or None, AsyncList(list_of_elem) + + async def get_next(next_link=None): + _request = prepare_request(next_link) + + _stream = False + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return AsyncItemPaged(get_next, extract_data) + + +class RedTeamsOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.onedp.aio.AIProjectClient`'s + :attr:`red_teams` attribute. + """ + + def __init__(self, *args, **kwargs) -> None: + input_args = list(args) + self._client: AsyncPipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "name", "client_request_id", "accept"]}, + ) + async def get(self, name: str, **kwargs: Any) -> _models.RedTeam: + """Get a redteam by name. + + :param name: Identifier of the red team. Required. + :type name: str + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.RedTeam + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.RedTeam] = kwargs.pop("cls", None) + + _request = build_red_teams_get_request( + name=name, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + response_headers = {} + response_headers["x-ms-client-request-id"] = self._deserialize( + "str", response.headers.get("x-ms-client-request-id") + ) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.RedTeam, response.json()) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={ + "2025-05-15-preview": ["api_version", "top", "skip", "maxpagesize", "client_request_id", "accept"] + }, + ) + def list( + self, *, top: Optional[int] = None, skip: Optional[int] = None, **kwargs: Any + ) -> AsyncIterable["_models.RedTeam"]: + """List a redteam by name. + + :keyword top: The number of result items to return. Default value is None. + :paramtype top: int + :keyword skip: The number of result items to skip. Default value is None. + :paramtype skip: int + :return: An iterator like instance of RedTeam + :rtype: ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.onedp.models.RedTeam] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + maxpagesize = kwargs.pop("maxpagesize", None) + cls: ClsType[List[_models.RedTeam]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + _request = build_red_teams_list_request( + top=top, + skip=skip, + maxpagesize=maxpagesize, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + else: + # make call to next link with the client's api-version + _parsed_next_link = urllib.parse.urlparse(next_link) + _next_request_params = case_insensitive_dict( + { + key: [urllib.parse.quote(v) for v in value] + for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() + } + ) + _next_request_params["api-version"] = self._config.api_version + _request = HttpRequest( + "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + return _request + + async def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.RedTeam], deserialized.get("value", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("nextLink") or None, AsyncList(list_of_elem) + + async def get_next(next_link=None): + _request = prepare_request(next_link) + + _stream = False + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return AsyncItemPaged(get_next, extract_data) + + @overload + async def _create_run( + self, red_team: _models.RedTeam, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.RedTeam: ... + @overload + async def _create_run( + self, red_team: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.RedTeam: ... + @overload + async def _create_run( + self, red_team: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.RedTeam: ... + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "content_type", "accept"]}, + ) + async def _create_run(self, red_team: Union[_models.RedTeam, JSON, IO[bytes]], **kwargs: Any) -> _models.RedTeam: + """Creates a redteam run. + + :param red_team: Redteam to be run. Is one of the following types: RedTeam, JSON, IO[bytes] + Required. + :type red_team: ~azure.ai.projects.onedp.models.RedTeam or JSON or IO[bytes] + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.RedTeam + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.RedTeam] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(red_team, (IOBase, bytes)): + _content = red_team + else: + _content = json.dumps(red_team, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_red_teams_create_run_request( + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.RedTeam, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + async def _upload_run( + self, redteam: _models._models.RedTeamUpload, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.RedTeam: ... + @overload + async def _upload_run( + self, redteam: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.RedTeam: ... + @overload + async def _upload_run( + self, redteam: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.RedTeam: ... + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "content_type", "accept"]}, + ) + async def _upload_run( + self, redteam: Union[_models._models.RedTeamUpload, JSON, IO[bytes]], **kwargs: Any + ) -> _models.RedTeam: + """Upload the result to a redteam run. + + :param redteam: Redteam to upload. Is one of the following types: RedTeamUpload, JSON, + IO[bytes] Required. + :type redteam: ~azure.ai.projects.onedp.models._models.RedTeamUpload or JSON or IO[bytes] + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.RedTeam + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.RedTeam] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(redteam, (IOBase, bytes)): + _content = redteam + else: + _content = json.dumps(redteam, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_red_teams_upload_run_request( + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.RedTeam, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + async def _upload_update_run( + self, + name: str, + redteam: _models._models.RedTeamUpload, + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models.RedTeam: ... + @overload + async def _upload_update_run( + self, name: str, redteam: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.RedTeam: ... + @overload + async def _upload_update_run( + self, name: str, redteam: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.RedTeam: ... + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "name", "content_type", "accept"]}, + ) + async def _upload_update_run( + self, name: str, redteam: Union[_models._models.RedTeamUpload, JSON, IO[bytes]], **kwargs: Any + ) -> _models.RedTeam: + """Update the uploaded the result to an redteam run. + + :param name: Name of the redteam run to update. Required. + :type name: str + :param redteam: Redteam upload to update. Is one of the following types: RedTeamUpload, JSON, + IO[bytes] Required. + :type redteam: ~azure.ai.projects.onedp.models._models.RedTeamUpload or JSON or IO[bytes] + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.RedTeam + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.RedTeam] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(redteam, (IOBase, bytes)): + _content = redteam + else: + _content = json.dumps(redteam, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_red_teams_upload_update_run_request( + name=name, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.RedTeam, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "type", "accept"]}, + ) + async def _get_jail_break_dataset_with_type(self, type: str, **kwargs: Any) -> List[str]: + """Get the jailbreak dataset with type. + + :param type: Type of jailbreak dataset. Required. + :type type: str + :return: list of str + :rtype: list[str] + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[str]] = kwargs.pop("cls", None) + + _request = build_red_teams_get_jail_break_dataset_with_type_request( + type=type, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(List[str], response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "risk_types", "lang", "strategy", "accept"]}, + ) + async def _get_attack_objectives( + self, + *, + risk_types: Optional[List[str]] = None, + lang: Optional[str] = None, + strategy: Optional[str] = None, + **kwargs: Any + ) -> List[_models._models.AttackObjective]: + """Get the attack objectives. + + :keyword risk_types: Risk types for the attack objectives dataset. Default value is None. + :paramtype risk_types: list[str] + :keyword lang: The language for the attack objectives dataset, defaults to 'en'. Default value + is None. + :paramtype lang: str + :keyword strategy: The strategy. Default value is None. + :paramtype strategy: str + :return: list of AttackObjective + :rtype: list[~azure.ai.projects.onedp.models._models.AttackObjective] + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models._models.AttackObjective]] = kwargs.pop("cls", None) + + _request = build_red_teams_get_attack_objectives_request( + risk_types=risk_types, + lang=lang, + strategy=strategy, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(List[_models._models.AttackObjective], response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "accept"]}, + ) + async def _get_jail_break_dataset(self, **kwargs: Any) -> List[str]: + """Get the jailbreak dataset. + + :return: list of str + :rtype: list[str] + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[str]] = kwargs.pop("cls", None) + + _request = build_red_teams_get_jail_break_dataset_request( + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(List[str], response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "type", "accept"]}, + ) + async def get_template_parameters_with_type(self, type: str, **kwargs: Any) -> str: + """Get template parameters with type. + + :param type: Type for the template parameters. Required. + :type type: str + :return: str + :rtype: str + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[str] = kwargs.pop("cls", None) + + _request = build_red_teams_get_template_parameters_with_type_request( + type=type, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(str, response.text()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "accept"]}, + ) + async def _get_template_parameters(self, **kwargs: Any) -> str: + """Get template parameters. + + :return: str + :rtype: str + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[str] = kwargs.pop("cls", None) + + _request = build_red_teams_get_template_parameters_request( + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(str, response.text()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "path", "accept"]}, + ) + async def get_template_parameters_image(self, *, path: str, **kwargs: Any) -> str: + """Get the template parameters image. + + :keyword path: Image path. Required. + :paramtype path: str + :return: str + :rtype: str + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[str] = kwargs.pop("cls", None) + + _request = build_red_teams_get_template_parameters_image_request( + path=path, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(str, response.text()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + async def _submit_simulation( + self, body: _models._models.SimulationDTO, *, content_type: str = "application/json", **kwargs: Any + ) -> _models._models.LongRunningResponse: ... + @overload + async def _submit_simulation( + self, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models._models.LongRunningResponse: ... + @overload + async def _submit_simulation( + self, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models._models.LongRunningResponse: ... + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "content_type", "accept"]}, + ) + async def _submit_simulation( + self, body: Union[_models._models.SimulationDTO, JSON, IO[bytes]], **kwargs: Any + ) -> _models._models.LongRunningResponse: + """Submit a request for simulation. + + :param body: Properties of a Prompt Version. Is one of the following types: SimulationDTO, + JSON, IO[bytes] Required. + :type body: ~azure.ai.projects.onedp.models._models.SimulationDTO or JSON or IO[bytes] + :return: LongRunningResponse. The LongRunningResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models._models.LongRunningResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models._models.LongRunningResponse] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_red_teams_submit_simulation_request( + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [202]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize( + _models._models.LongRunningResponse, response.json() # pylint: disable=protected-access + ) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + +class EvaluationResultsOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.onedp.aio.AIProjectClient`'s + :attr:`evaluation_results` attribute. + """ + + def __init__(self, *args, **kwargs) -> None: + input_args = list(args) + self._client: AsyncPipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + + @distributed_trace + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={ + "2025-05-15-preview": ["api_version", "name", "top", "skip", "tags", "list_view_type", "accept"] + }, + ) + def _list_versions( + self, + name: str, + *, + top: Optional[int] = None, + skip: Optional[str] = None, + tags: Optional[str] = None, + list_view_type: Optional[Union[str, _models.ListViewType]] = None, + **kwargs: Any + ) -> AsyncIterable["_models._models.EvaluationResult"]: + """List all versions of the given EvaluationResult. + + :param name: The name of the resource. Required. + :type name: str + :keyword top: Top count of results, top count cannot be greater than the page size. If topCount + > page size, results with be default page size count will be returned. Default value is None. + :paramtype top: int + :keyword skip: Continuation token for pagination. Default value is None. + :paramtype skip: str + :keyword tags: Comma-separated list of tag names (and optionally values). Example: + tag1,tag2=value2. Default value is None. + :paramtype tags: str + :keyword list_view_type: [ListViewType.ActiveOnly, ListViewType.ArchivedOnly, ListViewType.All] + View type for including/excluding (for example) archived entities. Known values are: + "ActiveOnly", "ArchivedOnly", and "All". Default value is None. + :paramtype list_view_type: str or ~azure.ai.projects.onedp.models.ListViewType + :return: An iterator like instance of EvaluationResult + :rtype: + ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.onedp.models._models.EvaluationResult] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models._models.EvaluationResult]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + _request = build_evaluation_results_list_versions_request( + name=name, + top=top, + skip=skip, + tags=tags, + list_view_type=list_view_type, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + else: + # make call to next link with the client's api-version + _parsed_next_link = urllib.parse.urlparse(next_link) + _next_request_params = case_insensitive_dict( + { + key: [urllib.parse.quote(v) for v in value] + for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() + } + ) + _next_request_params["api-version"] = self._config.api_version + _request = HttpRequest( + "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + return _request + + async def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models._models.EvaluationResult], deserialized.get("value", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("nextLink") or None, AsyncList(list_of_elem) + + async def get_next(next_link=None): + _request = prepare_request(next_link) + + _stream = False + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return AsyncItemPaged(get_next, extract_data) + + @distributed_trace + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "top", "skip", "tags", "list_view_type", "accept"]}, + ) + def _list_latest( + self, + *, + top: Optional[int] = None, + skip: Optional[str] = None, + tags: Optional[str] = None, + list_view_type: Optional[Union[str, _models.ListViewType]] = None, + **kwargs: Any + ) -> AsyncIterable["_models._models.EvaluationResult"]: + """List the latest version of each EvaluationResult. + + :keyword top: Top count of results, top count cannot be greater than the page size. If topCount + > page size, results with be default page size count will be returned. Default value is None. + :paramtype top: int + :keyword skip: Continuation token for pagination. Default value is None. + :paramtype skip: str + :keyword tags: Comma-separated list of tag names (and optionally values). Example: + tag1,tag2=value2. Default value is None. + :paramtype tags: str + :keyword list_view_type: [ListViewType.ActiveOnly, ListViewType.ArchivedOnly, ListViewType.All] + View type for including/excluding (for example) archived entities. Known values are: + "ActiveOnly", "ArchivedOnly", and "All". Default value is None. + :paramtype list_view_type: str or ~azure.ai.projects.onedp.models.ListViewType + :return: An iterator like instance of EvaluationResult + :rtype: + ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.onedp.models._models.EvaluationResult] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models._models.EvaluationResult]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + _request = build_evaluation_results_list_latest_request( + top=top, + skip=skip, + tags=tags, + list_view_type=list_view_type, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + else: + # make call to next link with the client's api-version + _parsed_next_link = urllib.parse.urlparse(next_link) + _next_request_params = case_insensitive_dict( + { + key: [urllib.parse.quote(v) for v in value] + for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() + } + ) + _next_request_params["api-version"] = self._config.api_version + _request = HttpRequest( + "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + return _request + + async def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models._models.EvaluationResult], deserialized.get("value", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("nextLink") or None, AsyncList(list_of_elem) + + async def get_next(next_link=None): + _request = prepare_request(next_link) + + _stream = False + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return AsyncItemPaged(get_next, extract_data) + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "name", "version", "accept"]}, + ) + async def _get_version(self, name: str, version: str, **kwargs: Any) -> _models._models.EvaluationResult: + """Get the specific version of the EvaluationResult. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the EvaluationResult to retrieve. Required. + :type version: str + :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models._models.EvaluationResult + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models._models.EvaluationResult] = kwargs.pop("cls", None) + + _request = build_evaluation_results_get_version_request( + name=name, + version=version, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize( + _models._models.EvaluationResult, response.json() # pylint: disable=protected-access + ) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "name", "version", "accept"]}, + ) + async def _delete_version(self, name: str, version: str, **kwargs: Any) -> None: + """Delete the specific version of the EvaluationResult. + + :param name: The name of the resource. Required. + :type name: str + :param version: The version of the EvaluationResult to delete. Required. + :type version: str + :return: None + :rtype: None + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[None] = kwargs.pop("cls", None) + + _request = build_evaluation_results_delete_version_request( + name=name, + version=version, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = False + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [204]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if cls: + return cls(pipeline_response, None, {}) # type: ignore + + @overload + async def _create( + self, + name: str, + body: _models._models.EvaluationResult, + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models._models.EvaluationResult: ... + @overload + async def _create( + self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models._models.EvaluationResult: ... + @overload + async def _create( + self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models._models.EvaluationResult: ... + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={ + "2025-05-15-preview": [ + "api_version", + "name", + "repeatability_request_id", + "repeatability_first_sent", + "client_request_id", + "content_type", + "accept", + ] + }, + ) + async def _create( + self, name: str, body: Union[_models._models.EvaluationResult, JSON, IO[bytes]], **kwargs: Any + ) -> _models._models.EvaluationResult: + """Create a new EvaluationResult. The version id will be generated by the service. + + :param name: The name of the resource. Required. + :type name: str + :param body: The definition of the EvaluationResult to create. Is one of the following types: + EvaluationResult, JSON, IO[bytes] Required. + :type body: ~azure.ai.projects.onedp.models._models.EvaluationResult or JSON or IO[bytes] + :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models._models.EvaluationResult + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models._models.EvaluationResult] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_evaluation_results_create_request( + name=name, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + response_headers = {} + response_headers["Repeatability-Result"] = self._deserialize( + "str", response.headers.get("Repeatability-Result") + ) + response_headers["x-ms-client-request-id"] = self._deserialize( + "str", response.headers.get("x-ms-client-request-id") + ) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize( + _models._models.EvaluationResult, response.json() # pylint: disable=protected-access + ) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @overload + async def _create_version( + self, + name: str, + version: str, + body: _models._models.EvaluationResult, + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models._models.EvaluationResult: ... + @overload + async def _create_version( + self, name: str, version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models._models.EvaluationResult: ... + @overload + async def _create_version( + self, name: str, version: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models._models.EvaluationResult: ... + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "name", "version", "content_type", "accept"]}, + ) + async def _create_version( + self, name: str, version: str, body: Union[_models._models.EvaluationResult, JSON, IO[bytes]], **kwargs: Any + ) -> _models._models.EvaluationResult: + """Create a new or replace an existing EvaluationResult with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the EvaluationResult to create or replace. Required. + :type version: str + :param body: The definition of the EvaluationResult to create. Is one of the following types: + EvaluationResult, JSON, IO[bytes] Required. + :type body: ~azure.ai.projects.onedp.models._models.EvaluationResult or JSON or IO[bytes] + :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models._models.EvaluationResult + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models._models.EvaluationResult] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_evaluation_results_create_version_request( + name=name, + version=version, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200, 201]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize( + _models._models.EvaluationResult, response.json() # pylint: disable=protected-access + ) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + async def _start_pending_upload( + self, + name: str, + version: str, + body: _models.PendingUploadRequest, + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models.PendingUploadResponse: ... + @overload + async def _start_pending_upload( + self, name: str, version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.PendingUploadResponse: ... + @overload + async def _start_pending_upload( + self, name: str, version: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.PendingUploadResponse: ... + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "name", "version", "content_type", "accept"]}, + ) + async def _start_pending_upload( + self, name: str, version: str, body: Union[_models.PendingUploadRequest, JSON, IO[bytes]], **kwargs: Any + ) -> _models.PendingUploadResponse: + """Create or start a pending upload of a evaluation results for a specific version. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the EvaluationResult to operate on. Required. + :type version: str + :param body: Parameters for the action. Is one of the following types: PendingUploadRequest, + JSON, IO[bytes] Required. + :type body: ~azure.ai.projects.onedp.models.PendingUploadRequest or JSON or IO[bytes] + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.PendingUploadResponse] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_evaluation_results_start_pending_upload_request( + name=name, + version=version, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.PendingUploadResponse, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + async def _fetch_asset_credentials( + self, + name: str, + version: str, + asset_credential_request: _models.AssetCredentialRequest, + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models.AssetCredentialResponse: ... + @overload + async def _fetch_asset_credentials( + self, + name: str, + version: str, + asset_credential_request: JSON, + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models.AssetCredentialResponse: ... + @overload + async def _fetch_asset_credentials( + self, + name: str, + version: str, + asset_credential_request: IO[bytes], + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models.AssetCredentialResponse: ... + + @distributed_trace_async + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "name", "version", "content_type", "accept"]}, + ) + async def _fetch_asset_credentials( + self, + name: str, + version: str, + asset_credential_request: Union[_models.AssetCredentialRequest, JSON, IO[bytes]], + **kwargs: Any + ) -> _models.AssetCredentialResponse: + """Enable downloading json. + + :param name: Name of the resource. Required. + :type name: str + :param version: Version of the resource. Required. + :type version: str + :param asset_credential_request: Input asset to fetch credentials for. Is one of the following + types: AssetCredentialRequest, JSON, IO[bytes] Required. + :type asset_credential_request: ~azure.ai.projects.onedp.models.AssetCredentialRequest or JSON + or IO[bytes] + :return: AssetCredentialResponse. The AssetCredentialResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.AssetCredentialResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.AssetCredentialResponse] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(asset_credential_request, (IOBase, bytes)): + _content = asset_credential_request + else: + _content = json.dumps(asset_credential_request, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_evaluation_results_fetch_asset_credentials_request( + name=name, + version=version, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.AssetCredentialResponse, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + +class ServicePatternsBuildingBlocksOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.onedp.aio.AIProjectClient`'s + :attr:`building_blocks` attribute. + """ + + def __init__(self, *args, **kwargs) -> None: + input_args = list(args) + self._client: AsyncPipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/operations/_patch.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/operations/_patch.py new file mode 100644 index 000000000000..c4a030cff13f --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/operations/_patch.py @@ -0,0 +1,247 @@ +# pylint: disable=line-too-long,useless-suppression +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +"""Customize generated code here. + +Follow our quickstart for examples: https://aka.ms/azsdk/python/dpcodegen/python/customize +""" +import logging +import inspect +from typing import List, Optional, Any, Tuple +from pathlib import Path +from azure.storage.blob.aio import ContainerClient + +from ._operations import DatasetsOperations as DatasetsOperationsGenerated +from ...models._models import ( + DatasetVersion, + PendingUploadRequest, + PendingUploadType, + PendingUploadResponse, +) +from ...models._enums import ( + DatasetType, + AuthenticationType, +) + +logger = logging.getLogger(__name__) + + +class DatasetsOperations(DatasetsOperationsGenerated): + + # Internal helper method to create a new dataset and return a ContainerClient from azure-storage-blob package, + # to the dataset's blob storage. + async def _create_dataset_and_get_its_container_client( + self, + name: str, + input_version: Optional[str] = None, + ) -> Tuple[ContainerClient, str]: + + if input_version: + pending_upload_response: PendingUploadResponse = await self.start_pending_upload_version( + name=name, + version=input_version, + body=PendingUploadRequest(pending_upload_type=PendingUploadType.TEMPORARY_BLOB_REFERENCE), + ) + output_version: str = input_version + else: + pending_upload_response: PendingUploadResponse = await self.start_pending_upload( + name=name, + body=PendingUploadRequest(pending_upload_type=PendingUploadType.TEMPORARY_BLOB_REFERENCE), + ) + if pending_upload_response.dataset_version: + output_version: str = pending_upload_response.dataset_version + else: + raise ValueError("Dataset version is not present in the response") + + if not pending_upload_response.blob_reference_for_consumption: + raise ValueError("Blob reference for consumption is not present") + if not pending_upload_response.blob_reference_for_consumption.credential.type: + raise ValueError("Credential type is not present") + if pending_upload_response.blob_reference_for_consumption.credential.type != AuthenticationType.SAS: + raise ValueError("Credential type is not SAS") + if not pending_upload_response.blob_reference_for_consumption.blob_uri: + raise ValueError("Blob URI is not present or empty") + + if logger.getEffectiveLevel() == logging.DEBUG: + method = inspect.currentframe().f_code.co_name + logger.debug( + "[%s] pending_upload_response.pending_upload_id = %s.", + method, + pending_upload_response.pending_upload_id, + ) + logger.debug( + "[%s] pending_upload_response.pending_upload_type = %s.", + method, + pending_upload_response.pending_upload_type, + ) # == PendingUploadType.TEMPORARY_BLOB_REFERENCE + logger.debug( + "[%s] pending_upload_response.blob_reference_for_consumption.blob_uri = %s.", + method, + pending_upload_response.blob_reference_for_consumption.blob_uri, + ) # Hosted on behalf of (HOBO) not visible to the user. If the form of: "https://.blob.core.windows.net/?" + logger.debug( + "[%s] pending_upload_response.blob_reference_for_consumption.storage_account_arm_id = %s.", + method, + pending_upload_response.blob_reference_for_consumption.storage_account_arm_id, + ) # /subscriptions/<>/resourceGroups/<>/Microsoft.Storage/accounts/<> + logger.debug( + "[%s] pending_upload_response.blob_reference_for_consumption.credential.sas_uri = %s.", + method, + pending_upload_response.blob_reference_for_consumption.credential.sas_uri, + ) + logger.debug( + "[%s] pending_upload_response.blob_reference_for_consumption.credential.type = %s.", + method, + pending_upload_response.blob_reference_for_consumption.credential.type, + ) # == AuthenticationType.SAS + + # For overview on Blob storage SDK in Python see: + # https://learn.microsoft.com/azure/storage/blobs/storage-quickstart-blobs-python + # https://learn.microsoft.com/azure/storage/blobs/storage-blob-upload-python + + # See https://learn.microsoft.com/python/api/azure-storage-blob/azure.storage.blob.containerclient?view=azure-python#azure-storage-blob-containerclient-from-container-url + return ( + await ContainerClient.from_container_url( + container_url=pending_upload_response.blob_reference_for_consumption.blob_uri, # Of the form: "https://.blob.core.windows.net/?" + ), + output_version, + ) + + async def upload_file_and_create( + self, *, name: str, version: Optional[str] = None, file: str, **kwargs: Any + ) -> DatasetVersion: + """Upload file to a blob storage, and create a dataset that references this file. + This method uses the `ContainerClient.upload_blob` method from the azure-storage-blob package + to upload the file. Any keyword arguments provided will be passed to the `upload_blob` method. + + :param name: The name of the dataset. Required. + :type name: str + :param version: The version identifier for the dataset. Optional. + :type version: str or None + :param file: The file name (including optional path) to be uploaded. Required. + :type file: str + :return: The created dataset version. + :rtype: ~azure.ai.projects.models.DatasetVersion + :raises ~azure.core.exceptions.HttpResponseError: If an error occurs during the HTTP request. + """ + + path_file = Path(file) + if not path_file.exists(): + raise ValueError("The provided file does not exist.") + if path_file.is_dir(): + raise ValueError("The provided file is actually a folder. Use method `create_and_upload_folder` instead") + + container_client, output_version = await self._create_dataset_and_get_its_container_client( + name=name, input_version=version + ) + + async with container_client: + + with open(file=file, mode="rb") as data: # TODO: What is the best async options for file reading? + + blob_name = path_file.name # Extract the file name from the path. + logger.debug( + "[%s] Start uploading file `%s` as blob `%s`.", + inspect.currentframe().f_code.co_name, + file, + blob_name, + ) + + # See https://learn.microsoft.com/python/api/azure-storage-blob/azure.storage.blob.containerclient?view=azure-python#azure-storage-blob-containerclient-upload-blob + with await container_client.upload_blob(name=blob_name, data=data, **kwargs) as blob_client: + + logger.debug("[%s] Done uploading", inspect.currentframe().f_code.co_name) + + dataset_version = await self.create_version( + name=name, + version=output_version, + body=DatasetVersion( + # See https://learn.microsoft.com/python/api/azure-storage-blob/azure.storage.blob.blobclient?view=azure-python#azure-storage-blob-blobclient-url + # Per above doc the ".url" contains SAS token... should this be stripped away? + dataset_uri=blob_client.url, # ".blob.windows.core.net//" + type=DatasetType.URI_FILE, + ), + ) + + return dataset_version + + async def upload_folder_and_create( + self, *, name: str, version: Optional[str] = None, folder: str, **kwargs: Any + ) -> DatasetVersion: + """Upload all files in a folder and its sub folders to a blob storage, while maintaining + relative paths, and create a dataset that references this folder. + This method uses the `ContainerClient.upload_blob` method from the azure-storage-blob package + to upload each file. Any keyword arguments provided will be passed to the `upload_blob` method. + + :param name: The name of the dataset. Required. + :type name: str + :param version: The version identifier for the dataset. Optional. + :type version: str or None + :param folder: The folder name (including optional path) to be uploaded. Required. + :type file: str + :return: The created dataset version. + :rtype: ~azure.ai.projects.models.DatasetVersion + :raises ~azure.core.exceptions.HttpResponseError: If an error occurs during the HTTP request. + """ + path_folder = Path(folder) + if not Path(path_folder).exists(): + raise ValueError("The provided folder does not exist.") + if Path(path_folder).is_file(): + raise ValueError("The provided folder is actually a file. Use method `create_and_upload_file` instead.") + + container_client, output_version = await self._create_dataset_and_get_its_container_client( + name=name, input_version=version + ) + + async with container_client: + + # Recursively traverse all files in the folder + files_uploaded: bool = False + for file_path in path_folder.rglob("*"): # `rglob` matches all files and folders recursively + if file_path.is_file(): # Check if the path is a file. Skip folders. + blob_name = file_path.relative_to(path_folder) # Blob name relative to the folder + logger.debug( + "[%s] Start uploading file `%s` as blob `%s`.", + inspect.currentframe().f_code.co_name, + file_path, + blob_name, + ) + with file_path.open( + "rb" + ) as data: # Open the file for reading in binary mode # TODO: async version? + # See https://learn.microsoft.com/python/api/azure-storage-blob/azure.storage.blob.containerclient?view=azure-python#azure-storage-blob-containerclient-upload-blob + container_client.upload_blob(name=str(blob_name), data=data, **kwargs) + logger.debug("[%s] Done uploaded.", inspect.currentframe().f_code.co_name) + files_uploaded = True + + if not files_uploaded: + raise ValueError("The provided folder is empty.") + + dataset_version = await self.create_version( + name=name, + version=output_version, + body=DatasetVersion( + # See https://learn.microsoft.com/python/api/azure-storage-blob/azure.storage.blob.blobclient?view=azure-python#azure-storage-blob-blobclient-url + # Per above doc the ".url" contains SAS token... should this be stripped away? + dataset_uri=container_client.url, # ".blob.windows.core.net/ ?" + type=DatasetType.URI_FOLDER, + ), + ) + + return dataset_version + + +__all__: List[str] = [ + "DatasetsOperations" +] # Add all objects you want publicly available to users at this package level + + +def patch_sdk(): + """Do not remove from this file. + + `patch_sdk` is a last resort escape hatch that allows you to do customizations + you can't accomplish using the techniques described in + https://aka.ms/azsdk/python/dpcodegen/python/customize + """ diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__init__.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__init__.py new file mode 100644 index 000000000000..08b478d508d5 --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__init__.py @@ -0,0 +1,96 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# Code generated by Microsoft (R) Python Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is regenerated. +# -------------------------------------------------------------------------- +# pylint: disable=wrong-import-position + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from ._patch import * # pylint: disable=unused-wildcard-import + + +from ._models import ( # type: ignore + AssetCredentialRequest, + AssetCredentialResponse, + AzureAISearchIndex, + BlobReferenceForConsumption, + Connection, + CosmosDBIndex, + DatasetVersion, + Deployment, + EmbeddingConfiguration, + Evaluation, + EvaluatorConfiguration, + FileDatasetVersion, + FolderDatasetVersion, + Index, + InputData, + InputDataset, + ManagedAzureAISearchIndex, + ModelDeployment, + PendingUploadRequest, + PendingUploadResponse, + RedTeam, + SasCredential, + Sku, + SystemData, +) + +from ._enums import ( # type: ignore + AttackStrategy, + AuthenticationType, + ConnectionType, + DatasetType, + DeploymentType, + IndexType, + ListViewType, + PendingUploadType, + RepeatabilityResult, + RiskCategory, +) +from ._patch import __all__ as _patch_all +from ._patch import * +from ._patch import patch_sdk as _patch_sdk + +__all__ = [ + "AssetCredentialRequest", + "AssetCredentialResponse", + "AzureAISearchIndex", + "BlobReferenceForConsumption", + "Connection", + "CosmosDBIndex", + "DatasetVersion", + "Deployment", + "EmbeddingConfiguration", + "Evaluation", + "EvaluatorConfiguration", + "FileDatasetVersion", + "FolderDatasetVersion", + "Index", + "InputData", + "InputDataset", + "ManagedAzureAISearchIndex", + "ModelDeployment", + "PendingUploadRequest", + "PendingUploadResponse", + "RedTeam", + "SasCredential", + "Sku", + "SystemData", + "AttackStrategy", + "AuthenticationType", + "ConnectionType", + "DatasetType", + "DeploymentType", + "IndexType", + "ListViewType", + "PendingUploadType", + "RepeatabilityResult", + "RiskCategory", +] +__all__.extend([p for p in _patch_all if p not in __all__]) # pyright: ignore +_patch_sdk() diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__pycache__/__init__.cpython-312.pyc b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02ed908982e9611896b3da2cb8e1124200a59e67 GIT binary patch literal 1689 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 literal 0 HcmV?d00001 diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__pycache__/_models.cpython-312.pyc b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__pycache__/_models.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e418074be334d96c5f8e66481ef3491750c619bd GIT binary patch literal 49298 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 XW>5 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 literal 0 HcmV?d00001 diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__pycache__/_patch.cpython-312.pyc b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__pycache__/_patch.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08b5a81bfb8a50256ced6c7fc058b26e1b09784a GIT binary patch literal 812 zcmbVKF^|(Q6tWKKn~&;q}Mn zK7L%06C%l+NGgMj=D|FmWJ%^B1kgLcIPA#q5Kq~AL*`MvGm6$Pk1FeQuGYYoP=MhM zBokT!OToZoIDD+LOkXfv8Fp4Fv9gXE#}?W!c){~B13P1>bETb4r+mdHxt;R0m8)r4 zyHpobS^8>NyK{)H;qZ&cKB7(UiL$QgCkfB8BoW^GulW%-J>0HHO-I4{>m$ty?U;dF zp95PMoimpz%N8p0h#A^x$(=|O#Bs_n!db?x&#)T7gB85Q0sRxqtv-reyzwH2OIRXUDn# zS$3H!?)>rApQC7*jgywgNm)0$e;GBq2;~MYi$5cIO-vt;<5Ax$D78qECUSL&;EY$! zc;%YVI@8=lg$q<}OKOs|h1%)b5@z6E4i2$(mBB;fTToo~E^gmKO6m7uNP9mAgx>jd Xd;eAc^46tzd+?F$Z=#3}+8TcVc_;VL literal 0 HcmV?d00001 diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/_enums.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/_enums.py new file mode 100644 index 000000000000..f91141b6ea9d --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/_enums.py @@ -0,0 +1,171 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# Code generated by Microsoft (R) Python Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is regenerated. +# -------------------------------------------------------------------------- + +from enum import Enum +from azure.core import CaseInsensitiveEnumMeta + + +class AttackStrategy(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Strategies for attacks.""" + + EASY = "easy" + """Represents a default set of easy complexity attacks. Easy complexity attack strategies are + defined as attacks that do not require any Large Language Model to convert or orchestrate.""" + ASCII_ART = "ascii_art" + """Represents ASCII art, a graphic design technique that uses printable characters.""" + ASCII_SMUGGLER = "ascii_smuggler" + """Represents ASCII smuggling, a technique for encoding or hiding data.""" + ATBASH = "atbash" + """Represents the Atbash cipher, a substitution cipher that reverses the alphabet.""" + BASE64 = "base64" + """Represents Base64 encoding, a method for encoding binary data as text.""" + BINARY = "binary" + """Represents binary encoding, a representation of data in binary format.""" + CAESAR = "caesar" + """Represents the Caesar cipher, a substitution cipher that shifts characters.""" + CHARACTER_SPACE = "character_space" + """Represents character space manipulation, a technique involving spacing between characters.""" + JAILBREAK = "jailbreak" + """Represents character swapping, a technique for rearranging characters in text.""" + + +class AuthenticationType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """The authentication type used by the connection.""" + + API_KEY = "ApiKey" + """API Key authentication""" + ENTRA_ID = "AAD" + """Entra ID authentication (formerly known as AAD)""" + SAS = "SAS" + """Shared Access Signature (SAS) authentication""" + CUSTOM = "CustomKeys" + """Custom authentication""" + NONE = "None" + """No authentication""" + + +class ConnectionType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """The Type (or category) of the connection.""" + + AZURE_OPEN_AI = "AzureOpenAI" + """Azure OpenAI Service""" + AZURE_BLOB_STORAGE = "AzureBlob" + """Azure Blob Storage""" + AZURE_AI_SEARCH = "CognitiveSearch" + """Azure AI Search""" + COSMOS_DB = "CosmosDB" + """CosmosDB""" + API_KEY = "ApiKey" + """Generic connection that uses API Key authentication""" + APPLICATION_INSIGHTS = "AppInsights" + """Application Insights""" + CUSTOM = "CustomKeys" + """Custom Keys""" + + +class DatasetType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Enum to determine the type of data.""" + + URI_FILE = "uri_file" + """URI file.""" + URI_FOLDER = "uri_folder" + """URI folder.""" + + +class DeploymentType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Type of DeploymentType.""" + + MODEL_DEPLOYMENT = "ModelDeployment" + """Model deployment""" + + +class IndexType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Type of IndexType.""" + + AZURE_SEARCH = "AzureSearch" + """Azure search""" + COSMOS_DB = "CosmosDBNoSqlVectorStore" + """CosmosDB""" + MANAGED_AZURE_SEARCH = "ManagedAzureSearch" + """Managed Azure Search""" + + +class ListViewType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """List View Type Definition.""" + + ACTIVE_ONLY = "ActiveOnly" + """List only active items.""" + ARCHIVED_ONLY = "ArchivedOnly" + """List only archived items.""" + ALL = "All" + """List all items.""" + + +class PendingUploadType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """The type of pending upload.""" + + NONE = "None" + """No pending upload.""" + TEMPORARY_BLOB_REFERENCE = "TemporaryBlobReference" + """Temporary Blob Reference is the only supported type.""" + + +class RepeatabilityResult(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Repeatability Result header options.""" + + ACCEPTED = "accepted" + """If the request was accepted and the server guarantees that the server state reflects a single + execution of the operation.""" + REJECTED = "rejected" + """If the request was rejected because the combination of Repeatability-First-Sent and + Repeatability-Request-ID were invalid + or because the Repeatability-First-Sent value was outside the range of values held by the + server.""" + + +class ResultType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Type of Evaluation result.""" + + BENCHMARK = "Benchmark" + """Benchmark result""" + EVALUATION = "Evaluation" + """Evaluations Result""" + REDTEAM = "Redteam" + """Red Team Result""" + SIMULATION = "Simulation" + """Simulation Result""" + + +class RiskCategory(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Risk category for the attack objective.""" + + HATE_UNFAIRNESS = "HateUnfairness" + """Represents content related to hate or unfairness.""" + VIOLENCE = "Violence" + """Represents content related to violence.""" + SEXUAL = "Sexual" + """Represents content of a sexual nature.""" + SELF_HARM = "SelfHarm" + """Represents content related to self-harm.""" + PROTECTED_MATERIAL = "ProtectedMaterial" + """Represents content involving protected material.""" + CODE_VULNERABILITY = "CodeVulnerability" + """Represents content related to code vulnerabilities.""" + UNGROUNDED_ATTRIBUTES = "UngroundedAttributes" + """Represents content with ungrounded attributes.""" + + +class SimulationType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Simulation type.""" + + DEFAULT = "Default" + """Default simulation type.""" + CUSTOM_PERSONA = "CustomPersona" + """Custom persona simulation type.""" + HARM_TURN_GENERATOR = "HarmTurnGenerator" + """Harm turn generator simulation type.""" diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/_models.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/_models.py new file mode 100644 index 000000000000..09855e6e5f97 --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/_models.py @@ -0,0 +1,2027 @@ +# pylint: disable=line-too-long,useless-suppression,too-many-lines +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# Code generated by Microsoft (R) Python Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is regenerated. +# -------------------------------------------------------------------------- +# pylint: disable=useless-super-delegation + +import datetime +from typing import Any, Dict, List, Literal, Mapping, Optional, TYPE_CHECKING, Union, overload + +from .. import _model_base +from .._model_base import rest_discriminator, rest_field +from ._enums import DatasetType, DeploymentType, IndexType, PendingUploadType + +if TYPE_CHECKING: + from .. import models as _models + + +class AnnotationDTO(_model_base.Model): + """Represents the data transfer object for an annotation. + + :ivar annotation_task: The task associated with the annotation. Required. + :vartype annotation_task: str + :ivar content_type: The type of content being annotated. Required. + :vartype content_type: str + :ivar user_text_list: A list of user-provided text inputs. Required. + :vartype user_text_list: list[str] + :ivar contents: A collection of content objects related to the annotation. Required. + :vartype contents: list[~azure.ai.projects.onedp.models._models.Content] + :ivar metric_list: A list of metrics associated with the annotation. Required. + :vartype metric_list: list[str] + :ivar prompt_version: The version of the prompt used for the annotation. Required. + :vartype prompt_version: str + :ivar user_agent: The user agent information. Required. + :vartype user_agent: str + :ivar partner_id: The partner identifier. Required. + :vartype partner_id: str + :ivar model_id: The model identifier. Required. + :vartype model_id: str + :ivar inference_type: The type of inference performed. Required. + :vartype inference_type: str + :ivar client_request_id: The client request identifier. Required. + :vartype client_request_id: str + """ + + annotation_task: str = rest_field(name="AnnotationTask", visibility=["read", "create", "update", "delete", "query"]) + """The task associated with the annotation. Required.""" + content_type: str = rest_field(name="ContentType", visibility=["read", "create", "update", "delete", "query"]) + """The type of content being annotated. Required.""" + user_text_list: List[str] = rest_field( + name="UserTextList", visibility=["read", "create", "update", "delete", "query"] + ) + """A list of user-provided text inputs. Required.""" + contents: List["_models._models.Content"] = rest_field( + name="Contents", visibility=["read", "create", "update", "delete", "query"] + ) + """A collection of content objects related to the annotation. Required.""" + metric_list: List[str] = rest_field(name="MetricList", visibility=["read", "create", "update", "delete", "query"]) + """A list of metrics associated with the annotation. Required.""" + prompt_version: str = rest_field(name="PromptVersion", visibility=["read", "create", "update", "delete", "query"]) + """The version of the prompt used for the annotation. Required.""" + user_agent: str = rest_field(name="UserAgent", visibility=["read", "create", "update", "delete", "query"]) + """The user agent information. Required.""" + partner_id: str = rest_field(name="PartnerId", visibility=["read", "create", "update", "delete", "query"]) + """The partner identifier. Required.""" + model_id: str = rest_field(name="ModelId", visibility=["read", "create", "update", "delete", "query"]) + """The model identifier. Required.""" + inference_type: str = rest_field(name="InferenceType", visibility=["read", "create", "update", "delete", "query"]) + """The type of inference performed. Required.""" + client_request_id: str = rest_field( + name="ClientRequestId", visibility=["read", "create", "update", "delete", "query"] + ) + """The client request identifier. Required.""" + + @overload + def __init__( + self, + *, + annotation_task: str, + content_type: str, + user_text_list: List[str], + contents: List["_models._models.Content"], + metric_list: List[str], + prompt_version: str, + user_agent: str, + partner_id: str, + model_id: str, + inference_type: str, + client_request_id: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class TargetModelConfig(_model_base.Model): + """Abstract class for model configuration. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + AOAIModelConfig, MAASModelConfig + + :ivar type: Type of the model configuration. Required. Default value is None. + :vartype type: str + """ + + __mapping__: Dict[str, _model_base.Model] = {} + type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) + """Type of the model configuration. Required. Default value is None.""" + + @overload + def __init__( + self, + *, + type: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class AOAIModelConfig(TargetModelConfig, discriminator="AOAI"): + """Azure OpenAI model configuration. The API version would be selected by the service for querying + the model. + + :ivar type: Required. Default value is "AOAI". + :vartype type: str + :ivar azure_endpoint: Endpoint targetURI for AOAI model. Required. + :vartype azure_endpoint: str + :ivar api_key: API Key for AOAI model. Required. + :vartype api_key: str + :ivar azure_deployment: Deployment name for AOAI model. Required. + :vartype azure_deployment: str + """ + + type: Literal["AOAI"] = rest_discriminator(name="type", visibility=["read"]) # type: ignore + """Required. Default value is \"AOAI\".""" + azure_endpoint: str = rest_field(name="azureEndpoint", visibility=["read", "create", "update", "delete", "query"]) + """Endpoint targetURI for AOAI model. Required.""" + api_key: str = rest_field(name="apiKey", visibility=["read", "create", "update", "delete", "query"]) + """API Key for AOAI model. Required.""" + azure_deployment: str = rest_field( + name="azureDeployment", visibility=["read", "create", "update", "delete", "query"] + ) + """Deployment name for AOAI model. Required.""" + + @overload + def __init__( + self, + *, + azure_endpoint: str, + api_key: str, + azure_deployment: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, type="AOAI", **kwargs) + + +class AssetCredentialRequest(_model_base.Model): + """Asset Credential Request. + + :ivar blob_uri: Blob URI. Required. + :vartype blob_uri: str + """ + + blob_uri: str = rest_field(name="BlobUri", visibility=["read", "create", "update", "delete", "query"]) + """Blob URI. Required.""" + + @overload + def __init__( + self, + *, + blob_uri: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class AssetCredentialResponse(_model_base.Model): + """Asset Credential Response. + + :ivar blob_reference_for_consumption: Blob Reference for Consumption. Required. + :vartype blob_reference_for_consumption: + ~azure.ai.projects.onedp.models.BlobReferenceForConsumption + """ + + blob_reference_for_consumption: "_models.BlobReferenceForConsumption" = rest_field( + name="BlobReferenceForConsumption", visibility=["read", "create", "update", "delete", "query"] + ) + """Blob Reference for Consumption. Required.""" + + @overload + def __init__( + self, + *, + blob_reference_for_consumption: "_models.BlobReferenceForConsumption", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class AttackObjective(_model_base.Model): + """Attack Objective. + + :ivar id: The unique identifier. Required. + :vartype id: str + :ivar metadata: The metadata. + :vartype metadata: ~azure.ai.projects.onedp.models._models.Metadata + :ivar source: List of sources. Required. + :vartype source: list[str] + :ivar modality: The modality. Required. + :vartype modality: str + :ivar messages: The messages. Required. + :vartype messages: list[~azure.ai.projects.onedp.models._models.Message] + """ + + id: str = rest_field(name="Id", visibility=["read", "create", "update", "delete", "query"]) + """The unique identifier. Required.""" + metadata: Optional["_models._models.Metadata"] = rest_field( + name="Metadata", visibility=["read", "create", "update", "delete", "query"] + ) + """The metadata.""" + source: List[str] = rest_field(name="Source", visibility=["read", "create", "update", "delete", "query"]) + """List of sources. Required.""" + modality: str = rest_field(name="Modality", visibility=["read", "create", "update", "delete", "query"]) + """The modality. Required.""" + messages: List["_models._models.Message"] = rest_field( + name="Messages", visibility=["read", "create", "update", "delete", "query"] + ) + """The messages. Required.""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + source: List[str], + modality: str, + messages: List["_models._models.Message"], + metadata: Optional["_models._models.Metadata"] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class Index(_model_base.Model): + """Index resource Definition. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + AzureAISearchIndex, CosmosDBIndex, ManagedAzureAISearchIndex + + :ivar type: Type of index. Required. Known values are: "AzureSearch", + "CosmosDBNoSqlVectorStore", and "ManagedAzureSearch". + :vartype type: str or ~azure.ai.projects.onedp.models.IndexType + :ivar stage: Asset stage. + :vartype stage: str + :ivar id: A unique identifier for the asset, assetId probably?. + :vartype id: str + :ivar name: The name of the resource. Required. + :vartype name: str + :ivar version: The version of the resource. Required. + :vartype version: str + :ivar description: The asset description text. + :vartype description: str + :ivar tags: Tag dictionary. Tags can be added, removed, and updated. + :vartype tags: dict[str, str] + """ + + __mapping__: Dict[str, _model_base.Model] = {} + type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) + """Type of index. Required. Known values are: \"AzureSearch\", \"CosmosDBNoSqlVectorStore\", and + \"ManagedAzureSearch\".""" + stage: Optional[str] = rest_field(visibility=["read", "create", "update"]) + """Asset stage.""" + id: Optional[str] = rest_field(visibility=["read"]) + """A unique identifier for the asset, assetId probably?.""" + name: str = rest_field(visibility=["read"]) + """The name of the resource. Required.""" + version: str = rest_field(visibility=["read"]) + """The version of the resource. Required.""" + description: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The asset description text.""" + tags: Optional[Dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Tag dictionary. Tags can be added, removed, and updated.""" + + @overload + def __init__( + self, + *, + type: str, + stage: Optional[str] = None, + description: Optional[str] = None, + tags: Optional[Dict[str, str]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class AzureAISearchIndex(Index, discriminator="AzureSearch"): + """Azure AI Search Index Definition. + + :ivar stage: Asset stage. + :vartype stage: str + :ivar id: A unique identifier for the asset, assetId probably?. + :vartype id: str + :ivar name: The name of the resource. Required. + :vartype name: str + :ivar version: The version of the resource. Required. + :vartype version: str + :ivar description: The asset description text. + :vartype description: str + :ivar tags: Tag dictionary. Tags can be added, removed, and updated. + :vartype tags: dict[str, str] + :ivar type: Type of index. Required. Azure search + :vartype type: str or ~azure.ai.projects.onedp.models.AZURE_SEARCH + :ivar connection_name: Name of connection to Azure AI Search. Required. + :vartype connection_name: str + :ivar index_name: Name of index in Azure AI Search resource to attach. Required. + :vartype index_name: str + """ + + type: Literal[IndexType.AZURE_SEARCH] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Type of index. Required. Azure search""" + connection_name: str = rest_field(name="connectionName", visibility=["read", "create", "update", "delete", "query"]) + """Name of connection to Azure AI Search. Required.""" + index_name: str = rest_field(name="indexName", visibility=["read", "create", "update", "delete", "query"]) + """Name of index in Azure AI Search resource to attach. Required.""" + + @overload + def __init__( + self, + *, + connection_name: str, + index_name: str, + stage: Optional[str] = None, + description: Optional[str] = None, + tags: Optional[Dict[str, str]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, type=IndexType.AZURE_SEARCH, **kwargs) + + +class BlobReferenceForConsumption(_model_base.Model): + """Represents a reference to a blob for consumption. + + :ivar blob_uri: Blob URI path for client to upload data. Example: + `https://blob.windows.core.net/Container/Path `_. + Required. + :vartype blob_uri: str + :ivar storage_account_arm_id: ARM ID of the storage account to use. Required. + :vartype storage_account_arm_id: str + :ivar credential: Credential info to access the storage account. Required. + :vartype credential: ~azure.ai.projects.onedp.models.SasCredential + """ + + blob_uri: str = rest_field(name="blobUri", visibility=["read", "create", "update", "delete", "query"]) + """Blob URI path for client to upload data. Example: `https://blob.windows.core.net/Container/Path + `_. Required.""" + storage_account_arm_id: str = rest_field( + name="storageAccountArmId", visibility=["read", "create", "update", "delete", "query"] + ) + """ARM ID of the storage account to use. Required.""" + credential: "_models.SasCredential" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Credential info to access the storage account. Required.""" + + @overload + def __init__( + self, + *, + blob_uri: str, + storage_account_arm_id: str, + credential: "_models.SasCredential", + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class Connection(_model_base.Model): + """Response from the listSecrets operation. + + :ivar name: The name of the resource. Required. + :vartype name: str + :ivar type: Category of the connection. Required. Known values are: "AzureOpenAI", "AzureBlob", + "CognitiveSearch", "CosmosDB", "ApiKey", "AppInsights", and "CustomKeys". + :vartype type: str or ~azure.ai.projects.onedp.models.ConnectionType + :ivar target: The connection URL to be used for this service. Required. + :vartype target: str + :ivar auth_type: The authentication type used by the connection. Required. Known values are: + "ApiKey", "AAD", "SAS", "CustomKeys", and "None". + :vartype auth_type: str or ~azure.ai.projects.onedp.models.AuthenticationType + :ivar metadata: Metadata of the connection. Required. + :vartype metadata: dict[str, str] + """ + + name: str = rest_field(visibility=["read"]) + """The name of the resource. Required.""" + type: Union[str, "_models.ConnectionType"] = rest_field(visibility=["read"]) + """Category of the connection. Required. Known values are: \"AzureOpenAI\", \"AzureBlob\", + \"CognitiveSearch\", \"CosmosDB\", \"ApiKey\", \"AppInsights\", and \"CustomKeys\".""" + target: str = rest_field(visibility=["read"]) + """The connection URL to be used for this service. Required.""" + auth_type: Union[str, "_models.AuthenticationType"] = rest_field(name="authType", visibility=["read"]) + """The authentication type used by the connection. Required. Known values are: \"ApiKey\", + \"AAD\", \"SAS\", \"CustomKeys\", and \"None\".""" + metadata: Dict[str, str] = rest_field(visibility=["read"]) + """Metadata of the connection. Required.""" + + +class Content(_model_base.Model): + """Message content. + + :ivar messages: The type of content. Required. + :vartype messages: list[any] + """ + + messages: List[Any] = rest_field(name="Messages", visibility=["read", "create", "update", "delete", "query"]) + """The type of content. Required.""" + + @overload + def __init__( + self, + *, + messages: List[Any], + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class CosmosDBIndex(Index, discriminator="CosmosDBNoSqlVectorStore"): + """CosmosDB Vector Store Index Definition. + + :ivar stage: Asset stage. + :vartype stage: str + :ivar id: A unique identifier for the asset, assetId probably?. + :vartype id: str + :ivar name: The name of the resource. Required. + :vartype name: str + :ivar version: The version of the resource. Required. + :vartype version: str + :ivar description: The asset description text. + :vartype description: str + :ivar tags: Tag dictionary. Tags can be added, removed, and updated. + :vartype tags: dict[str, str] + :ivar type: Type of index. Required. CosmosDB + :vartype type: str or ~azure.ai.projects.onedp.models.COSMOS_DB + :ivar connection_name: Name of connection to CosmosDB. Required. + :vartype connection_name: str + :ivar database_name: Name of the CosmosDB Database. Required. + :vartype database_name: str + :ivar container_name: Name of CosmosDB Container. Required. + :vartype container_name: str + :ivar embedding_configuration: Embedding model configuration. Required. + :vartype embedding_configuration: ~azure.ai.projects.onedp.models.EmbeddingConfiguration + """ + + type: Literal[IndexType.COSMOS_DB] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Type of index. Required. CosmosDB""" + connection_name: str = rest_field(name="connectionName", visibility=["read", "create", "update", "delete", "query"]) + """Name of connection to CosmosDB. Required.""" + database_name: str = rest_field(name="databaseName", visibility=["read", "create", "update", "delete", "query"]) + """Name of the CosmosDB Database. Required.""" + container_name: str = rest_field(name="containerName", visibility=["read", "create", "update", "delete", "query"]) + """Name of CosmosDB Container. Required.""" + embedding_configuration: "_models.EmbeddingConfiguration" = rest_field( + name="embeddingConfiguration", visibility=["read", "create", "update", "delete", "query"] + ) + """Embedding model configuration. Required.""" + + @overload + def __init__( + self, + *, + connection_name: str, + database_name: str, + container_name: str, + embedding_configuration: "_models.EmbeddingConfiguration", + stage: Optional[str] = None, + description: Optional[str] = None, + tags: Optional[Dict[str, str]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, type=IndexType.COSMOS_DB, **kwargs) + + +class CustomizationParameters(_model_base.Model): + """Customization Parameters. + + :ivar application_scenario: Application scenario. + :vartype application_scenario: str + :ivar harm_categories: List of harm categories. Required. + :vartype harm_categories: list[str] + """ + + application_scenario: Optional[str] = rest_field( + name="ApplicationScenario", visibility=["read", "create", "update", "delete", "query"] + ) + """Application scenario.""" + harm_categories: List[str] = rest_field( + name="HarmCategories", visibility=["read", "create", "update", "delete", "query"] + ) + """List of harm categories. Required.""" + + @overload + def __init__( + self, + *, + harm_categories: List[str], + application_scenario: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class DatasetVersion(_model_base.Model): + """DatasetVersion Definition. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + FileDatasetVersion, FolderDatasetVersion + + :ivar dataset_uri: [Required] Uri of the data. Example: + `https://go.microsoft.com/fwlink/?linkid=2202330 + `_. Required. + :vartype dataset_uri: str + :ivar type: Dataset type. Required. Known values are: "uri_file" and "uri_folder". + :vartype type: str or ~azure.ai.projects.onedp.models.DatasetType + :ivar is_reference: Indicates if dataset is reference only or managed by dataset service. If + true, the underlying data will be deleted when the dataset version is deleted. + :vartype is_reference: bool + :ivar stage: Asset stage. + :vartype stage: str + :ivar id: A unique identifier for the asset, assetId probably?. + :vartype id: str + :ivar name: The name of the resource. Required. + :vartype name: str + :ivar version: The version of the resource. Required. + :vartype version: str + :ivar description: The asset description text. + :vartype description: str + :ivar tags: Tag dictionary. Tags can be added, removed, and updated. + :vartype tags: dict[str, str] + """ + + __mapping__: Dict[str, _model_base.Model] = {} + dataset_uri: str = rest_field(name="datasetUri", visibility=["read", "create"]) + """[Required] Uri of the data. Example: `https://go.microsoft.com/fwlink/?linkid=2202330 + `_. Required.""" + type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) + """Dataset type. Required. Known values are: \"uri_file\" and \"uri_folder\".""" + is_reference: Optional[bool] = rest_field(name="isReference", visibility=["read"]) + """Indicates if dataset is reference only or managed by dataset service. If true, the underlying + data will be deleted when the dataset version is deleted.""" + stage: Optional[str] = rest_field(visibility=["read", "create", "update"]) + """Asset stage.""" + id: Optional[str] = rest_field(visibility=["read"]) + """A unique identifier for the asset, assetId probably?.""" + name: str = rest_field(visibility=["read"]) + """The name of the resource. Required.""" + version: str = rest_field(visibility=["read"]) + """The version of the resource. Required.""" + description: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The asset description text.""" + tags: Optional[Dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Tag dictionary. Tags can be added, removed, and updated.""" + + @overload + def __init__( + self, + *, + dataset_uri: str, + type: str, + stage: Optional[str] = None, + description: Optional[str] = None, + tags: Optional[Dict[str, str]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class Deployment(_model_base.Model): + """Model Deployment Definition. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + ModelDeployment + + :ivar type: The type of the deployment. Required. "ModelDeployment" + :vartype type: str or ~azure.ai.projects.onedp.models.DeploymentType + :ivar name: Name of the deployment. Required. + :vartype name: str + """ + + __mapping__: Dict[str, _model_base.Model] = {} + type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) + """The type of the deployment. Required. \"ModelDeployment\"""" + name: str = rest_field(visibility=["read"]) + """Name of the deployment. Required.""" + + @overload + def __init__( + self, + *, + type: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class EmbeddingConfiguration(_model_base.Model): + """Embedding configuration class. + + :ivar model_deployment_name: Deployment name of embedding model. It can point to a model + deployment either in the parent AIServices or a connection. Required. + :vartype model_deployment_name: str + :ivar embedding_field: Embedding field. Required. + :vartype embedding_field: str + """ + + model_deployment_name: str = rest_field( + name="modelDeploymentName", visibility=["read", "create", "update", "delete", "query"] + ) + """Deployment name of embedding model. It can point to a model deployment either in the parent + AIServices or a connection. Required.""" + embedding_field: str = rest_field(name="embeddingField", visibility=["read", "create", "update", "delete", "query"]) + """Embedding field. Required.""" + + @overload + def __init__( + self, + *, + model_deployment_name: str, + embedding_field: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class Evaluation(_model_base.Model): + """Evaluation Definition. + + :ivar id: Identifier of the evaluation. Required. + :vartype id: str + :ivar data: Data for evaluation. Required. + :vartype data: ~azure.ai.projects.onedp.models.InputData + :ivar target: Evaluation target specifying the model config and parameters. + :vartype target: ~azure.ai.projects.onedp.models._models.EvaluationTarget + :ivar display_name: Display Name for evaluation. It helps to find the evaluation easily in AI + Foundry. It does not need to be unique. + :vartype display_name: str + :ivar description: Description of the evaluation. It can be used to store additional + information about the evaluation and is mutable. + :vartype description: str + :ivar system_data: Metadata containing createdBy and modifiedBy information. + :vartype system_data: ~azure.ai.projects.onedp.models.SystemData + :ivar status: Status of the evaluation. It is set by service and is read-only. + :vartype status: str + :ivar tags: Evaluation's tags. Unlike properties, tags are fully mutable. + :vartype tags: dict[str, str] + :ivar properties: Evaluation's properties. Unlike tags, properties are add-only. Once added, a + property cannot be removed. + :vartype properties: dict[str, str] + :ivar evaluators: Evaluators to be used for the evaluation. Required. + :vartype evaluators: dict[str, ~azure.ai.projects.onedp.models.EvaluatorConfiguration] + :ivar outputs: Read-only result outputs. Example: { 'evaluationResultId': + 'azureai://accounts/{AccountName}/projects/{myproject}/evaluationresults/{name}/versions/{version}', + 'logId': + 'azureai://accounts/{AccountName}/projects/{myproject}/datasets/{dataset-name}/versions/{dataset-version}' + }. Required. + :vartype outputs: dict[str, str] + """ + + id: str = rest_field(visibility=["read"]) + """Identifier of the evaluation. Required.""" + data: "_models.InputData" = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Data for evaluation. Required.""" + target: Optional["_models._models.EvaluationTarget"] = rest_field(visibility=["read", "create"]) + """Evaluation target specifying the model config and parameters.""" + display_name: Optional[str] = rest_field( + name="displayName", visibility=["read", "create", "update", "delete", "query"] + ) + """Display Name for evaluation. It helps to find the evaluation easily in AI Foundry. It does not + need to be unique.""" + description: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Description of the evaluation. It can be used to store additional information about the + evaluation and is mutable.""" + system_data: Optional["_models.SystemData"] = rest_field(name="systemData", visibility=["read"]) + """Metadata containing createdBy and modifiedBy information.""" + status: Optional[str] = rest_field(visibility=["read"]) + """Status of the evaluation. It is set by service and is read-only.""" + tags: Optional[Dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Evaluation's tags. Unlike properties, tags are fully mutable.""" + properties: Optional[Dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Evaluation's properties. Unlike tags, properties are add-only. Once added, a property cannot be + removed.""" + evaluators: Dict[str, "_models.EvaluatorConfiguration"] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Evaluators to be used for the evaluation. Required.""" + outputs: Dict[str, str] = rest_field(visibility=["read"]) + """Read-only result outputs. Example: { 'evaluationResultId': + 'azureai://accounts/{AccountName}/projects/{myproject}/evaluationresults/{name}/versions/{version}', + 'logId': + 'azureai://accounts/{AccountName}/projects/{myproject}/datasets/{dataset-name}/versions/{dataset-version}' + }. Required.""" + + @overload + def __init__( + self, + *, + data: "_models.InputData", + evaluators: Dict[str, "_models.EvaluatorConfiguration"], + target: Optional["_models._models.EvaluationTarget"] = None, + display_name: Optional[str] = None, + description: Optional[str] = None, + tags: Optional[Dict[str, str]] = None, + properties: Optional[Dict[str, str]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class EvaluationResult(_model_base.Model): + """Evaluation Result resource Definition. + + :ivar result_type: Type of Evaluation result. Known values are: "Benchmark", "Evaluation", + "Redteam", and "Simulation". + :vartype result_type: str or ~azure.ai.projects.onedp.models.ResultType + :ivar blob_uri: Blob URI. + :vartype blob_uri: str + :ivar stage: Asset stage. + :vartype stage: str + :ivar id: A unique identifier for the asset, assetId probably?. + :vartype id: str + :ivar name: The name of the resource. Required. + :vartype name: str + :ivar version: The version of the resource. Required. + :vartype version: str + :ivar description: The asset description text. + :vartype description: str + :ivar tags: Tag dictionary. Tags can be added, removed, and updated. + :vartype tags: dict[str, str] + """ + + result_type: Optional[Union[str, "_models._enums.ResultType"]] = rest_field( + name="ResultType", visibility=["read", "create", "update", "delete", "query"] + ) + """Type of Evaluation result. Known values are: \"Benchmark\", \"Evaluation\", \"Redteam\", and + \"Simulation\".""" + blob_uri: Optional[str] = rest_field(name="BlobUri", visibility=["read", "create", "update", "delete", "query"]) + """Blob URI.""" + stage: Optional[str] = rest_field(visibility=["read", "create", "update"]) + """Asset stage.""" + id: Optional[str] = rest_field(visibility=["read"]) + """A unique identifier for the asset, assetId probably?.""" + name: str = rest_field(visibility=["read"]) + """The name of the resource. Required.""" + version: str = rest_field(visibility=["read"]) + """The version of the resource. Required.""" + description: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """The asset description text.""" + tags: Optional[Dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Tag dictionary. Tags can be added, removed, and updated.""" + + @overload + def __init__( + self, + *, + result_type: Optional[Union[str, "_models._enums.ResultType"]] = None, + blob_uri: Optional[str] = None, + stage: Optional[str] = None, + description: Optional[str] = None, + tags: Optional[Dict[str, str]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class EvaluationTarget(_model_base.Model): + """Target for the evaluation process. + + :ivar system_message: System message related to the evaluation target. Required. + :vartype system_message: str + :ivar model_config: Model configuration for the evaluation. Required. + :vartype model_config: ~azure.ai.projects.onedp.models._models.TargetModelConfig + :ivar model_params: A dictionary of parameters for the model. + :vartype model_params: dict[str, any] + """ + + system_message: str = rest_field(name="systemMessage", visibility=["read", "create", "update", "delete", "query"]) + """System message related to the evaluation target. Required.""" + model_config: "_models._models.TargetModelConfig" = rest_field( + name="modelConfig", visibility=["read", "create", "update", "delete", "query"] + ) + """Model configuration for the evaluation. Required.""" + model_params: Optional[Dict[str, Any]] = rest_field( + name="modelParams", visibility=["read", "create", "update", "delete", "query"] + ) + """A dictionary of parameters for the model.""" + + @overload + def __init__( + self, + *, + system_message: str, + model_config: "_models._models.TargetModelConfig", + model_params: Optional[Dict[str, Any]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class EvaluationUpload(_model_base.Model): + """Upload a local SDK evaluation run. Currently update supports status, outputs, properties, and + tags updates. + + :ivar id: Identifier of the evaluation. Required. + :vartype id: str + :ivar data: Data for evaluation. + :vartype data: ~azure.ai.projects.onedp.models.InputData + :ivar target: Evaluation target specifying the model config and parameters. + :vartype target: ~azure.ai.projects.onedp.models._models.EvaluationTarget + :ivar display_name: Display Name for evaluation. It helps to find the evaluation easily in AI + Foundry. It does not need to be unique. + :vartype display_name: str + :ivar description: Description of the evaluation. It can be used to store additional + information about the evaluation and is mutable. + :vartype description: str + :ivar system_data: Metadata containing createdBy and modifiedBy information. + :vartype system_data: ~azure.ai.projects.onedp.models.SystemData + :ivar status: Status of the evaluation. For upload: Failed or Completed. + :vartype status: str + :ivar tags: Evaluation's tags. Unlike properties, tags are fully mutable. + :vartype tags: dict[str, str] + :ivar properties: Evaluation's properties. Unlike tags, properties are add-only. Once added, a + property cannot be removed. + :vartype properties: dict[str, str] + :ivar evaluators: Evaluators to be used for the evaluation. + :vartype evaluators: dict[str, ~azure.ai.projects.onedp.models.EvaluatorConfiguration] + :ivar outputs: Outputs of the evaluation as a dictionary of IDs. Example: { + 'evaluationResultId': + 'azureai://accounts/{AccountName}/projects/{myproject}/evaluationresults/{name}/versions/{version}'}. + :vartype outputs: dict[str, str] + """ + + id: str = rest_field(visibility=["read"]) + """Identifier of the evaluation. Required.""" + data: Optional["_models.InputData"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Data for evaluation.""" + target: Optional["_models._models.EvaluationTarget"] = rest_field(visibility=["read", "create"]) + """Evaluation target specifying the model config and parameters.""" + display_name: Optional[str] = rest_field( + name="displayName", visibility=["read", "create", "update", "delete", "query"] + ) + """Display Name for evaluation. It helps to find the evaluation easily in AI Foundry. It does not + need to be unique.""" + description: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Description of the evaluation. It can be used to store additional information about the + evaluation and is mutable.""" + system_data: Optional["_models.SystemData"] = rest_field(name="systemData", visibility=["read"]) + """Metadata containing createdBy and modifiedBy information.""" + status: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Status of the evaluation. For upload: Failed or Completed.""" + tags: Optional[Dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Evaluation's tags. Unlike properties, tags are fully mutable.""" + properties: Optional[Dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Evaluation's properties. Unlike tags, properties are add-only. Once added, a property cannot be + removed.""" + evaluators: Optional[Dict[str, "_models.EvaluatorConfiguration"]] = rest_field( + visibility=["read", "create", "update", "delete", "query"] + ) + """Evaluators to be used for the evaluation.""" + outputs: Optional[Dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Outputs of the evaluation as a dictionary of IDs. Example: { 'evaluationResultId': + 'azureai://accounts/{AccountName}/projects/{myproject}/evaluationresults/{name}/versions/{version}'}.""" + + @overload + def __init__( + self, + *, + data: Optional["_models.InputData"] = None, + target: Optional["_models._models.EvaluationTarget"] = None, + display_name: Optional[str] = None, + description: Optional[str] = None, + status: Optional[str] = None, + tags: Optional[Dict[str, str]] = None, + properties: Optional[Dict[str, str]] = None, + evaluators: Optional[Dict[str, "_models.EvaluatorConfiguration"]] = None, + outputs: Optional[Dict[str, str]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class EvaluatorConfiguration(_model_base.Model): + """Evaluator Configuration. + + :ivar id: Identifier of the evaluator. Required. + :vartype id: str + :ivar init_params: Initialization parameters of the evaluator. + :vartype init_params: dict[str, any] + :ivar data_mapping: Data parameters of the evaluator. + :vartype data_mapping: dict[str, str] + """ + + id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Identifier of the evaluator. Required.""" + init_params: Optional[Dict[str, Any]] = rest_field( + name="initParams", visibility=["read", "create", "update", "delete", "query"] + ) + """Initialization parameters of the evaluator.""" + data_mapping: Optional[Dict[str, str]] = rest_field( + name="dataMapping", visibility=["read", "create", "update", "delete", "query"] + ) + """Data parameters of the evaluator.""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + init_params: Optional[Dict[str, Any]] = None, + data_mapping: Optional[Dict[str, str]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class FileDatasetVersion(DatasetVersion, discriminator="uri_file"): + """FileDatasetVersion Definition. + + :ivar dataset_uri: [Required] Uri of the data. Example: + `https://go.microsoft.com/fwlink/?linkid=2202330 + `_. Required. + :vartype dataset_uri: str + :ivar is_reference: Indicates if dataset is reference only or managed by dataset service. If + true, the underlying data will be deleted when the dataset version is deleted. + :vartype is_reference: bool + :ivar stage: Asset stage. + :vartype stage: str + :ivar id: A unique identifier for the asset, assetId probably?. + :vartype id: str + :ivar name: The name of the resource. Required. + :vartype name: str + :ivar version: The version of the resource. Required. + :vartype version: str + :ivar description: The asset description text. + :vartype description: str + :ivar tags: Tag dictionary. Tags can be added, removed, and updated. + :vartype tags: dict[str, str] + :ivar type: Dataset type. Required. URI file. + :vartype type: str or ~azure.ai.projects.onedp.models.URI_FILE + :ivar open_ai_purpose: Indicates OpenAI Purpose. FileDatasets created with this field will be + compatible with OpenAI-specific features. Required. + :vartype open_ai_purpose: str + """ + + type: Literal[DatasetType.URI_FILE] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Dataset type. Required. URI file.""" + open_ai_purpose: str = rest_field(name="openAIPurpose", visibility=["read", "create", "update", "delete", "query"]) + """Indicates OpenAI Purpose. FileDatasets created with this field will be compatible with + OpenAI-specific features. Required.""" + + @overload + def __init__( + self, + *, + dataset_uri: str, + open_ai_purpose: str, + stage: Optional[str] = None, + description: Optional[str] = None, + tags: Optional[Dict[str, str]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, type=DatasetType.URI_FILE, **kwargs) + + +class FolderDatasetVersion(DatasetVersion, discriminator="uri_folder"): + """FileDatasetVersion Definition. + + :ivar dataset_uri: [Required] Uri of the data. Example: + `https://go.microsoft.com/fwlink/?linkid=2202330 + `_. Required. + :vartype dataset_uri: str + :ivar is_reference: Indicates if dataset is reference only or managed by dataset service. If + true, the underlying data will be deleted when the dataset version is deleted. + :vartype is_reference: bool + :ivar stage: Asset stage. + :vartype stage: str + :ivar id: A unique identifier for the asset, assetId probably?. + :vartype id: str + :ivar name: The name of the resource. Required. + :vartype name: str + :ivar version: The version of the resource. Required. + :vartype version: str + :ivar description: The asset description text. + :vartype description: str + :ivar tags: Tag dictionary. Tags can be added, removed, and updated. + :vartype tags: dict[str, str] + :ivar type: Dataset type. Required. URI folder. + :vartype type: str or ~azure.ai.projects.onedp.models.URI_FOLDER + """ + + type: Literal[DatasetType.URI_FOLDER] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Dataset type. Required. URI folder.""" + + @overload + def __init__( + self, + *, + dataset_uri: str, + stage: Optional[str] = None, + description: Optional[str] = None, + tags: Optional[Dict[str, str]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, type=DatasetType.URI_FOLDER, **kwargs) + + +class InputData(_model_base.Model): + """Abstract data class. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + InputDataset + + :ivar type: Type of the data. Required. Default value is None. + :vartype type: str + """ + + __mapping__: Dict[str, _model_base.Model] = {} + type: str = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) + """Type of the data. Required. Default value is None.""" + + @overload + def __init__( + self, + *, + type: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class InputDataset(InputData, discriminator="dataset"): + """Dataset as source for evaluation. + + :ivar type: Required. Default value is "dataset". + :vartype type: str + :ivar id: Evaluation input data. Required. + :vartype id: str + """ + + type: Literal["dataset"] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Required. Default value is \"dataset\".""" + id: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Evaluation input data. Required.""" + + @overload + def __init__( + self, + *, + id: str, # pylint: disable=redefined-builtin + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, type="dataset", **kwargs) + + +class LongRunningResponse(_model_base.Model): + """Long Running Response. + + :ivar location: The location. Required. + :vartype location: str + :ivar operation_result: The OperationResult. Required. + :vartype operation_result: any + """ + + location: str = rest_field(name="Location", visibility=["read", "create", "update", "delete", "query"]) + """The location. Required.""" + operation_result: Any = rest_field( + name="OperationResult", visibility=["read", "create", "update", "delete", "query"] + ) + """The OperationResult. Required.""" + + @overload + def __init__( + self, + *, + location: str, + operation_result: Any, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class MAASModelConfig(TargetModelConfig, discriminator="MAAS"): + """MaaS model configuration. The API version would be selected by the service for querying the + model. + + :ivar type: Required. Default value is "MAAS". + :vartype type: str + :ivar azure_endpoint: Endpoint targetURI for MAAS model. Required. + :vartype azure_endpoint: str + :ivar api_key: API Key for MAAS model. Required. + :vartype api_key: str + """ + + type: Literal["MAAS"] = rest_discriminator(name="type", visibility=["read"]) # type: ignore + """Required. Default value is \"MAAS\".""" + azure_endpoint: str = rest_field(name="azureEndpoint", visibility=["read", "create", "update", "delete", "query"]) + """Endpoint targetURI for MAAS model. Required.""" + api_key: str = rest_field(name="apiKey", visibility=["read", "create", "update", "delete", "query"]) + """API Key for MAAS model. Required.""" + + @overload + def __init__( + self, + *, + azure_endpoint: str, + api_key: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, type="MAAS", **kwargs) + + +class ManagedAzureAISearchIndex(Index, discriminator="ManagedAzureSearch"): + """Managed Azure AI Search Index Definition. + + :ivar stage: Asset stage. + :vartype stage: str + :ivar id: A unique identifier for the asset, assetId probably?. + :vartype id: str + :ivar name: The name of the resource. Required. + :vartype name: str + :ivar version: The version of the resource. Required. + :vartype version: str + :ivar description: The asset description text. + :vartype description: str + :ivar tags: Tag dictionary. Tags can be added, removed, and updated. + :vartype tags: dict[str, str] + :ivar type: Type of index. Required. Managed Azure Search + :vartype type: str or ~azure.ai.projects.onedp.models.MANAGED_AZURE_SEARCH + :ivar vector_store_id: Vector store id of managed index. Required. + :vartype vector_store_id: str + """ + + type: Literal[IndexType.MANAGED_AZURE_SEARCH] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """Type of index. Required. Managed Azure Search""" + vector_store_id: str = rest_field(name="vectorStoreId", visibility=["read", "create", "update", "delete", "query"]) + """Vector store id of managed index. Required.""" + + @overload + def __init__( + self, + *, + vector_store_id: str, + stage: Optional[str] = None, + description: Optional[str] = None, + tags: Optional[Dict[str, str]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, type=IndexType.MANAGED_AZURE_SEARCH, **kwargs) + + +class Message(_model_base.Model): + """Message. + + :ivar role: The role. + :vartype role: str + :ivar content: The content. + :vartype content: str + """ + + role: Optional[str] = rest_field(name="Role", visibility=["read", "create", "update", "delete", "query"]) + """The role.""" + content: Optional[str] = rest_field(name="Content", visibility=["read", "create", "update", "delete", "query"]) + """The content.""" + + @overload + def __init__( + self, + *, + role: Optional[str] = None, + content: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class Metadata(_model_base.Model): + """Metadata. + + :ivar target_harms: List of target harms. Required. + :vartype target_harms: list[~azure.ai.projects.onedp.models._models.TargetHarm] + :ivar language: The language. Required. + :vartype language: str + """ + + target_harms: List["_models._models.TargetHarm"] = rest_field( + name="TargetHarms", visibility=["read", "create", "update", "delete", "query"] + ) + """List of target harms. Required.""" + language: str = rest_field(name="Language", visibility=["read", "create", "update", "delete", "query"]) + """The language. Required.""" + + @overload + def __init__( + self, + *, + target_harms: List["_models._models.TargetHarm"], + language: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class ModelDeployment(Deployment, discriminator="ModelDeployment"): + """Model Deployment Definition. + + :ivar name: Name of the deployment. Required. + :vartype name: str + :ivar type: The type of the deployment. Required. Model deployment + :vartype type: str or ~azure.ai.projects.onedp.models.MODEL_DEPLOYMENT + :ivar model_name: Publisher-specific name of the deployed model. Required. + :vartype model_name: str + :ivar model_version: Publisher-specific version of the deployed model. Required. + :vartype model_version: str + :ivar model_publisher: Name of the deployed model's publisher. Required. + :vartype model_publisher: str + :ivar capabilities: Capabilities of deployed model. Required. + :vartype capabilities: dict[str, str] + :ivar sku: Sku of the model deployment. Required. + :vartype sku: ~azure.ai.projects.onedp.models.Sku + :ivar connection_name: Name of the connection the deployment comes from. + :vartype connection_name: str + """ + + type: Literal[DeploymentType.MODEL_DEPLOYMENT] = rest_discriminator(name="type", visibility=["read", "create", "update", "delete", "query"]) # type: ignore + """The type of the deployment. Required. Model deployment""" + model_name: str = rest_field(name="modelName", visibility=["read"]) + """Publisher-specific name of the deployed model. Required.""" + model_version: str = rest_field(name="modelVersion", visibility=["read"]) + """Publisher-specific version of the deployed model. Required.""" + model_publisher: str = rest_field(name="modelPublisher", visibility=["read"]) + """Name of the deployed model's publisher. Required.""" + capabilities: Dict[str, str] = rest_field(visibility=["read"]) + """Capabilities of deployed model. Required.""" + sku: "_models.Sku" = rest_field(visibility=["read"]) + """Sku of the model deployment. Required.""" + connection_name: Optional[str] = rest_field(name="connectionName", visibility=["read"]) + """Name of the connection the deployment comes from.""" + + @overload + def __init__( + self, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, type=DeploymentType.MODEL_DEPLOYMENT, **kwargs) + + +class PendingUploadRequest(_model_base.Model): + """Represents a request for a pending upload. + + :ivar pending_upload_id: If PendingUploadId is not provided, a random GUID will be used. + :vartype pending_upload_id: str + :ivar connection_name: Name of Azure blob storage connection to use for generating temporary + SAS token. + :vartype connection_name: str + :ivar pending_upload_type: TemporaryBlobReference is the only supported type. Required. + Temporary Blob Reference is the only supported type. + :vartype pending_upload_type: str or ~azure.ai.projects.onedp.models.TEMPORARY_BLOB_REFERENCE + """ + + pending_upload_id: Optional[str] = rest_field( + name="pendingUploadId", visibility=["read", "create", "update", "delete", "query"] + ) + """If PendingUploadId is not provided, a random GUID will be used.""" + connection_name: Optional[str] = rest_field( + name="connectionName", visibility=["read", "create", "update", "delete", "query"] + ) + """Name of Azure blob storage connection to use for generating temporary SAS token.""" + pending_upload_type: Literal[PendingUploadType.TEMPORARY_BLOB_REFERENCE] = rest_field( + name="pendingUploadType", visibility=["read", "create", "update", "delete", "query"] + ) + """TemporaryBlobReference is the only supported type. Required. Temporary Blob Reference is the + only supported type.""" + + @overload + def __init__( + self, + *, + pending_upload_type: Literal[PendingUploadType.TEMPORARY_BLOB_REFERENCE], + pending_upload_id: Optional[str] = None, + connection_name: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class PendingUploadResponse(_model_base.Model): + """Represents the response for a pending upload request. + + :ivar blob_reference_for_consumption: Container-level read, write, list SAS. Required. + :vartype blob_reference_for_consumption: + ~azure.ai.projects.onedp.models.BlobReferenceForConsumption + :ivar pending_upload_id: ID for this upload request. Required. + :vartype pending_upload_id: str + :ivar dataset_version: Version of dataset to be created if user did not specify version when + initially creating upload. + :vartype dataset_version: str + :ivar pending_upload_type: TemporaryBlobReference is the only supported type. Required. + Temporary Blob Reference is the only supported type. + :vartype pending_upload_type: str or ~azure.ai.projects.onedp.models.TEMPORARY_BLOB_REFERENCE + """ + + blob_reference_for_consumption: "_models.BlobReferenceForConsumption" = rest_field( + name="blobReferenceForConsumption", visibility=["read", "create", "update", "delete", "query"] + ) + """Container-level read, write, list SAS. Required.""" + pending_upload_id: str = rest_field( + name="pendingUploadId", visibility=["read", "create", "update", "delete", "query"] + ) + """ID for this upload request. Required.""" + dataset_version: Optional[str] = rest_field( + name="datasetVersion", visibility=["read", "create", "update", "delete", "query"] + ) + """Version of dataset to be created if user did not specify version when initially creating + upload.""" + pending_upload_type: Literal[PendingUploadType.TEMPORARY_BLOB_REFERENCE] = rest_field( + name="pendingUploadType", visibility=["read", "create", "update", "delete", "query"] + ) + """TemporaryBlobReference is the only supported type. Required. Temporary Blob Reference is the + only supported type.""" + + @overload + def __init__( + self, + *, + blob_reference_for_consumption: "_models.BlobReferenceForConsumption", + pending_upload_id: str, + pending_upload_type: Literal[PendingUploadType.TEMPORARY_BLOB_REFERENCE], + dataset_version: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class RedTeam(_model_base.Model): + """Red team details. + + :ivar id: Identifier of the red team. Required. + :vartype id: str + :ivar scan_name: Name of the red-team scan. Required. + :vartype scan_name: str + :ivar num_turns: Number of simulation rounds. Required. + :vartype num_turns: int + :ivar attack_strategy: List of attack strategies or nested lists of attack strategies. + Required. + :vartype attack_strategy: list[str or ~azure.ai.projects.onedp.models.AttackStrategy] + :ivar simulation_only: Simulation-only or Simulation + Evaluation. Default false, if true the + scan outputs conversation not evaluation result. Required. + :vartype simulation_only: bool + :ivar risk_categories: List of risk categories to generate attack objectives for. Required. + :vartype risk_categories: list[str or ~azure.ai.projects.onedp.models.RiskCategory] + :ivar application_scenario: Application scenario for the red team operation, to generate + scenario specific attacks. + :vartype application_scenario: str + :ivar tags: Red team's tags. Unlike properties, tags are fully mutable. + :vartype tags: dict[str, str] + :ivar properties: Red team's properties. Unlike tags, properties are add-only. Once added, a + property cannot be removed. + :vartype properties: dict[str, str] + :ivar status: Status of the red-team. It is set by service and is read-only. + :vartype status: str + :ivar outputs: Read-only result outputs. Example: { 'evaluationResultId': + 'azureai://accounts/{AccountName}/projects/{myproject}/evaluationresults/{name}/versions/{version}', + 'logId': + 'azureai://accounts/{AccountName}/projects/{myproject}/datasets/{dataset-name}/versions/{dataset-version}' + }. Required. + :vartype outputs: dict[str, str] + :ivar system_data: Metadata containing createdBy and modifiedBy information. + :vartype system_data: ~azure.ai.projects.onedp.models.SystemData + """ + + id: str = rest_field(visibility=["read"]) + """Identifier of the red team. Required.""" + scan_name: str = rest_field(name="scanName", visibility=["read", "create", "update", "delete", "query"]) + """Name of the red-team scan. Required.""" + num_turns: int = rest_field(name="numTurns", visibility=["read", "create", "update", "delete", "query"]) + """Number of simulation rounds. Required.""" + attack_strategy: List[Union[str, "_models.AttackStrategy"]] = rest_field( + name="attackStrategy", visibility=["read", "create", "update", "delete", "query"] + ) + """List of attack strategies or nested lists of attack strategies. Required.""" + simulation_only: bool = rest_field( + name="simulationOnly", visibility=["read", "create", "update", "delete", "query"] + ) + """Simulation-only or Simulation + Evaluation. Default false, if true the scan outputs + conversation not evaluation result. Required.""" + risk_categories: List[Union[str, "_models.RiskCategory"]] = rest_field( + name="riskCategories", visibility=["read", "create", "update", "delete", "query"] + ) + """List of risk categories to generate attack objectives for. Required.""" + application_scenario: Optional[str] = rest_field( + name="applicationScenario", visibility=["read", "create", "update", "delete", "query"] + ) + """Application scenario for the red team operation, to generate scenario specific attacks.""" + tags: Optional[Dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Red team's tags. Unlike properties, tags are fully mutable.""" + properties: Optional[Dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Red team's properties. Unlike tags, properties are add-only. Once added, a property cannot be + removed.""" + status: Optional[str] = rest_field(visibility=["read"]) + """Status of the red-team. It is set by service and is read-only.""" + outputs: Dict[str, str] = rest_field(visibility=["read"]) + """Read-only result outputs. Example: { 'evaluationResultId': + 'azureai://accounts/{AccountName}/projects/{myproject}/evaluationresults/{name}/versions/{version}', + 'logId': + 'azureai://accounts/{AccountName}/projects/{myproject}/datasets/{dataset-name}/versions/{dataset-version}' + }. Required.""" + system_data: Optional["_models.SystemData"] = rest_field(name="systemData", visibility=["read"]) + """Metadata containing createdBy and modifiedBy information.""" + + @overload + def __init__( + self, + *, + scan_name: str, + num_turns: int, + attack_strategy: List[Union[str, "_models.AttackStrategy"]], + simulation_only: bool, + risk_categories: List[Union[str, "_models.RiskCategory"]], + application_scenario: Optional[str] = None, + tags: Optional[Dict[str, str]] = None, + properties: Optional[Dict[str, str]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class RedTeamUpload(_model_base.Model): + """Red team details. + + :ivar id: Identifier of the red team. Required. + :vartype id: str + :ivar scan_name: Name of the red-team scan. + :vartype scan_name: str + :ivar num_turns: Number of simulation rounds. + :vartype num_turns: int + :ivar attack_strategy: List of attack strategies or nested lists of attack strategies. + :vartype attack_strategy: list[str or ~azure.ai.projects.onedp.models.AttackStrategy] + :ivar simulation_only: Simulation-only or Simulation + Evaluation. Default false, if true the + scan outputs conversation not evaluation result. + :vartype simulation_only: bool + :ivar risk_categories: List of risk categories to generate attack objectives for. + :vartype risk_categories: list[str or ~azure.ai.projects.onedp.models.RiskCategory] + :ivar application_scenario: Application scenario for the red team operation, to generate + scenario specific attacks. + :vartype application_scenario: str + :ivar tags: Red team's tags. Unlike properties, tags are fully mutable. + :vartype tags: dict[str, str] + :ivar properties: Red team's properties. Unlike tags, properties are add-only. Once added, a + property cannot be removed. + :vartype properties: dict[str, str] + :ivar status: Status of the red-team. It is set by service and is read-only. + :vartype status: str + :ivar outputs: Read-only result outputs. Example: { 'evaluationResultId': + 'azureai://accounts/{AccountName}/projects/{myproject}/evaluationresults/{name}/versions/{version}' + }. + :vartype outputs: dict[str, str] + :ivar system_data: Metadata containing createdBy and modifiedBy information. + :vartype system_data: ~azure.ai.projects.onedp.models.SystemData + """ + + id: str = rest_field(visibility=["read"]) + """Identifier of the red team. Required.""" + scan_name: Optional[str] = rest_field(name="scanName", visibility=["read", "create", "update", "delete", "query"]) + """Name of the red-team scan.""" + num_turns: Optional[int] = rest_field(name="numTurns", visibility=["read", "create", "update", "delete", "query"]) + """Number of simulation rounds.""" + attack_strategy: Optional[List[Union[str, "_models.AttackStrategy"]]] = rest_field( + name="attackStrategy", visibility=["read", "create", "update", "delete", "query"] + ) + """List of attack strategies or nested lists of attack strategies.""" + simulation_only: Optional[bool] = rest_field( + name="simulationOnly", visibility=["read", "create", "update", "delete", "query"] + ) + """Simulation-only or Simulation + Evaluation. Default false, if true the scan outputs + conversation not evaluation result.""" + risk_categories: Optional[List[Union[str, "_models.RiskCategory"]]] = rest_field( + name="riskCategories", visibility=["read", "create", "update", "delete", "query"] + ) + """List of risk categories to generate attack objectives for.""" + application_scenario: Optional[str] = rest_field( + name="applicationScenario", visibility=["read", "create", "update", "delete", "query"] + ) + """Application scenario for the red team operation, to generate scenario specific attacks.""" + tags: Optional[Dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Red team's tags. Unlike properties, tags are fully mutable.""" + properties: Optional[Dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Red team's properties. Unlike tags, properties are add-only. Once added, a property cannot be + removed.""" + status: Optional[str] = rest_field(visibility=["read"]) + """Status of the red-team. It is set by service and is read-only.""" + outputs: Optional[Dict[str, str]] = rest_field(visibility=["read"]) + """Read-only result outputs. Example: { 'evaluationResultId': + 'azureai://accounts/{AccountName}/projects/{myproject}/evaluationresults/{name}/versions/{version}' + }.""" + system_data: Optional["_models.SystemData"] = rest_field(name="systemData", visibility=["read"]) + """Metadata containing createdBy and modifiedBy information.""" + + @overload + def __init__( + self, + *, + scan_name: Optional[str] = None, + num_turns: Optional[int] = None, + attack_strategy: Optional[List[Union[str, "_models.AttackStrategy"]]] = None, + simulation_only: Optional[bool] = None, + risk_categories: Optional[List[Union[str, "_models.RiskCategory"]]] = None, + application_scenario: Optional[str] = None, + tags: Optional[Dict[str, str]] = None, + properties: Optional[Dict[str, str]] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class SasCredential(_model_base.Model): + """SAS Credential definition. + + :ivar sas_uri: SAS uri. Required. + :vartype sas_uri: str + :ivar type: Type of credential. Required. Default value is "SAS". + :vartype type: str + """ + + sas_uri: str = rest_field(name="sasUri", visibility=["read"]) + """SAS uri. Required.""" + type: Literal["SAS"] = rest_field(visibility=["read"]) + """Type of credential. Required. Default value is \"SAS\".""" + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.type: Literal["SAS"] = "SAS" + + +class SimulationDTO(_model_base.Model): + """Customization Parameters. + + :ivar headers: Additional headers. + :vartype headers: dict[str, str] + :ivar params: Parameters. + :vartype params: dict[str, str] + :ivar template_parameters: Template parameters. + :vartype template_parameters: dict[str, str] + :ivar customization_parameters: Customization parameters. + :vartype customization_parameters: + ~azure.ai.projects.onedp.models._models.CustomizationParameters + :ivar json: Json. + :vartype json: str + :ivar url: Url. + :vartype url: str + :ivar template_key: Template key. + :vartype template_key: str + :ivar simulation_type: Type of Simulation. Known values are: "Default", "CustomPersona", and + "HarmTurnGenerator". + :vartype simulation_type: str or ~azure.ai.projects.onedp.models.SimulationType + :ivar is_microsoft_tenant: 'True' if Microsoft internal tenant and 'False' otherwise. + :vartype is_microsoft_tenant: bool + :ivar subscription_id: Azure subscription id. + :vartype subscription_id: str + :ivar resource_group_name: Resource group name. + :vartype resource_group_name: str + :ivar workspace_name: Workspace name. + :vartype workspace_name: str + """ + + headers: Optional[Dict[str, str]] = rest_field( + name="Headers", visibility=["read", "create", "update", "delete", "query"] + ) + """Additional headers.""" + params: Optional[Dict[str, str]] = rest_field( + name="Params", visibility=["read", "create", "update", "delete", "query"] + ) + """Parameters.""" + template_parameters: Optional[Dict[str, str]] = rest_field( + name="TemplateParameters", visibility=["read", "create", "update", "delete", "query"] + ) + """Template parameters.""" + customization_parameters: Optional["_models._models.CustomizationParameters"] = rest_field( + name="CustomizationParameters", visibility=["read", "create", "update", "delete", "query"] + ) + """Customization parameters.""" + json: Optional[str] = rest_field(name="Json", visibility=["read", "create", "update", "delete", "query"]) + """Json.""" + url: Optional[str] = rest_field(name="Url", visibility=["read", "create", "update", "delete", "query"]) + """Url.""" + template_key: Optional[str] = rest_field( + name="TemplateKey", visibility=["read", "create", "update", "delete", "query"] + ) + """Template key.""" + simulation_type: Optional[Union[str, "_models._enums.SimulationType"]] = rest_field( + name="SimulationType", visibility=["read", "create", "update", "delete", "query"] + ) + """Type of Simulation. Known values are: \"Default\", \"CustomPersona\", and + \"HarmTurnGenerator\".""" + is_microsoft_tenant: Optional[bool] = rest_field( + name="IsMicrosoftTenant", visibility=["read", "create", "update", "delete", "query"] + ) + """'True' if Microsoft internal tenant and 'False' otherwise.""" + subscription_id: Optional[str] = rest_field( + name="SubscriptionId", visibility=["read", "create", "update", "delete", "query"] + ) + """Azure subscription id.""" + resource_group_name: Optional[str] = rest_field( + name="ResourceGroupName", visibility=["read", "create", "update", "delete", "query"] + ) + """Resource group name.""" + workspace_name: Optional[str] = rest_field( + name="WorkspaceName", visibility=["read", "create", "update", "delete", "query"] + ) + """Workspace name.""" + + @overload + def __init__( + self, + *, + headers: Optional[Dict[str, str]] = None, + params: Optional[Dict[str, str]] = None, + template_parameters: Optional[Dict[str, str]] = None, + customization_parameters: Optional["_models._models.CustomizationParameters"] = None, + json: Optional[str] = None, + url: Optional[str] = None, + template_key: Optional[str] = None, + simulation_type: Optional[Union[str, "_models._enums.SimulationType"]] = None, + is_microsoft_tenant: Optional[bool] = None, + subscription_id: Optional[str] = None, + resource_group_name: Optional[str] = None, + workspace_name: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class Sku(_model_base.Model): + """Sku information. + + :ivar capacity: Sku capacity. Required. + :vartype capacity: int + :ivar family: Sku family. Required. + :vartype family: str + :ivar name: Sku name. Required. + :vartype name: str + :ivar size: Sku size. Required. + :vartype size: str + :ivar tier: Sku tier. Required. + :vartype tier: str + """ + + capacity: int = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Sku capacity. Required.""" + family: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Sku family. Required.""" + name: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Sku name. Required.""" + size: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Sku size. Required.""" + tier: str = rest_field(visibility=["read", "create", "update", "delete", "query"]) + """Sku tier. Required.""" + + @overload + def __init__( + self, + *, + capacity: int, + family: str, + name: str, + size: str, + tier: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class SystemData(_model_base.Model): + """Metadata pertaining to creation and last modification of the resource. + + :ivar created_at: The timestamp the resource was created at. + :vartype created_at: ~datetime.datetime + :ivar created_by: The identity that created the resource. + :vartype created_by: str + :ivar created_by_type: The identity type that created the resource. + :vartype created_by_type: str + :ivar last_modified_at: The timestamp of resource last modification (UTC). + :vartype last_modified_at: ~datetime.datetime + """ + + created_at: Optional[datetime.datetime] = rest_field(name="createdAt", visibility=["read"], format="rfc3339") + """The timestamp the resource was created at.""" + created_by: Optional[str] = rest_field(name="createdBy", visibility=["read"]) + """The identity that created the resource.""" + created_by_type: Optional[str] = rest_field(name="createdByType", visibility=["read"]) + """The identity type that created the resource.""" + last_modified_at: Optional[datetime.datetime] = rest_field( + name="lastModifiedAt", visibility=["read"], format="rfc3339" + ) + """The timestamp of resource last modification (UTC).""" + + +class TargetHarm(_model_base.Model): + """Target Harm. + + :ivar risk_type: The risk type. + :vartype risk_type: str + :ivar risk_sub_type: The risk sub type. + :vartype risk_sub_type: str + """ + + risk_type: Optional[str] = rest_field(name="RiskType", visibility=["read", "create", "update", "delete", "query"]) + """The risk type.""" + risk_sub_type: Optional[str] = rest_field( + name="RiskSubType", visibility=["read", "create", "update", "delete", "query"] + ) + """The risk sub type.""" + + @overload + def __init__( + self, + *, + risk_type: Optional[str] = None, + risk_sub_type: Optional[str] = None, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/_patch.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/_patch.py new file mode 100644 index 000000000000..7e1e323dbcf5 --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/_patch.py @@ -0,0 +1,30 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +"""Customize generated code here. + +Follow our quickstart for examples: https://aka.ms/azsdk/python/dpcodegen/python/customize +""" +from enum import Enum +from typing import List + + +class EvaluationMetrics(str, Enum): + Relevance = "relevance" + HateUnfairness = "hate_unfairness" + Violence = "violence" + Groundedness = "groundedness" + GroundednessPro = "groundedness_pro" + + +__all__: List[str] = ["EvaluationMetrics"] + + +def patch_sdk(): + """Do not remove from this file. + + `patch_sdk` is a last resort escape hatch that allows you to do customizations + you can't accomplish using the techniques described in + https://aka.ms/azsdk/python/dpcodegen/python/customize + """ diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/operations/__init__.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/operations/__init__.py new file mode 100644 index 000000000000..cff79d256c20 --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/operations/__init__.py @@ -0,0 +1,39 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# Code generated by Microsoft (R) Python Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is regenerated. +# -------------------------------------------------------------------------- +# pylint: disable=wrong-import-position + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from ._patch import * # pylint: disable=unused-wildcard-import + +from ._operations import ServicePatternsOperations # type: ignore +from ._operations import ConnectionsOperations # type: ignore +from ._operations import EvaluationsOperations # type: ignore +from ._operations import DatasetsOperations # type: ignore +from ._operations import IndexesOperations # type: ignore +from ._operations import DeploymentsOperations # type: ignore +from ._operations import RedTeamsOperations # type: ignore +from ._operations import EvaluationResultsOperations # type: ignore + +from ._patch import __all__ as _patch_all +from ._patch import * +from ._patch import patch_sdk as _patch_sdk + +__all__ = [ + "ServicePatternsOperations", + "ConnectionsOperations", + "EvaluationsOperations", + "DatasetsOperations", + "IndexesOperations", + "DeploymentsOperations", + "RedTeamsOperations", + "EvaluationResultsOperations", +] +__all__.extend([p for p in _patch_all if p not in __all__]) # pyright: ignore +_patch_sdk() diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/operations/__pycache__/__init__.cpython-312.pyc b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/operations/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4209b56949240923babb9be2df60a1897cb07314 GIT binary patch literal 1008 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 (3, 9): + from collections.abc import MutableMapping +else: + from typing import MutableMapping # type: ignore +T = TypeVar("T") +ClsType = Optional[Callable[[PipelineResponse[HttpRequest, HttpResponse], T, Dict[str, Any]], Any]] +JSON = MutableMapping[str, Any] # pylint: disable=unsubscriptable-object + +_SERIALIZER = Serializer() +_SERIALIZER.client_side_validation = False + + +def build_connections_get_request(name: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/connections/{name}" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_connections_list_request( + *, + connection_type: Optional[Union[str, _models.ConnectionType]] = None, + top: Optional[int] = None, + skip: Optional[int] = None, + maxpagesize: Optional[int] = None, + **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/connections" + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + if connection_type is not None: + _params["connectionType"] = _SERIALIZER.query("connection_type", connection_type, "str") + if top is not None: + _params["top"] = _SERIALIZER.query("top", top, "int") + if skip is not None: + _params["skip"] = _SERIALIZER.query("skip", skip, "int") + if maxpagesize is not None: + _params["maxpagesize"] = _SERIALIZER.query("maxpagesize", maxpagesize, "int") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_evaluations_get_request(name: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/evaluations/runs/{name}" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_evaluations_list_request( + *, + tags: Optional[str] = None, + properties: Optional[str] = None, + top: Optional[int] = None, + skip: Optional[int] = None, + maxpagesize: Optional[int] = None, + **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/evaluations/runs" + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + if tags is not None: + _params["tags"] = _SERIALIZER.query("tags", tags, "str") + if properties is not None: + _params["properties"] = _SERIALIZER.query("properties", properties, "str") + if top is not None: + _params["top"] = _SERIALIZER.query("top", top, "int") + if skip is not None: + _params["skip"] = _SERIALIZER.query("skip", skip, "int") + if maxpagesize is not None: + _params["maxpagesize"] = _SERIALIZER.query("maxpagesize", maxpagesize, "int") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_evaluations_create_run_request(**kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/evaluations/runs:run" + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_evaluations_check_annotation_request(**kwargs: Any) -> HttpRequest: # pylint: disable=name-too-long + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("apiVersion", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/evaluations/checkannotation" + + # Construct parameters + _params["apiVersion"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_evaluations_submit_annotation_request(**kwargs: Any) -> HttpRequest: # pylint: disable=name-too-long + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("apiVersion", "2025-05-15-preview")) + accept = _headers.pop("Accept", "text/plain") + + # Construct URL + _url = "/evaluations/submitannotation" + + # Construct parameters + _params["apiVersion"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_evaluations_upload_run_request(**kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/evaluations/runs:upload" + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_evaluations_upload_update_run_request( # pylint: disable=name-too-long + name: str, **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/evaluations/runs:updateUpload/{name}" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="PATCH", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_datasets_list_versions_request( + name: str, + *, + top: Optional[int] = None, + skip: Optional[str] = None, + tags: Optional[str] = None, + list_view_type: Optional[Union[str, _models.ListViewType]] = None, + **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/datasets/{name}/versions" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + if top is not None: + _params["top"] = _SERIALIZER.query("top", top, "int") + if skip is not None: + _params["skip"] = _SERIALIZER.query("skip", skip, "str") + if tags is not None: + _params["tags"] = _SERIALIZER.query("tags", tags, "str") + if list_view_type is not None: + _params["listViewType"] = _SERIALIZER.query("list_view_type", list_view_type, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_datasets_list_latest_request( + *, + top: Optional[int] = None, + skip: Optional[str] = None, + tags: Optional[str] = None, + list_view_type: Optional[Union[str, _models.ListViewType]] = None, + **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/datasets" + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + if top is not None: + _params["top"] = _SERIALIZER.query("top", top, "int") + if skip is not None: + _params["skip"] = _SERIALIZER.query("skip", skip, "str") + if tags is not None: + _params["tags"] = _SERIALIZER.query("tags", tags, "str") + if list_view_type is not None: + _params["listViewType"] = _SERIALIZER.query("list_view_type", list_view_type, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_datasets_get_version_request(name: str, version: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/datasets/{name}/versions/{version}" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + "version": _SERIALIZER.url("version", version, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_datasets_delete_version_request(name: str, version: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/datasets/{name}/versions/{version}" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + "version": _SERIALIZER.url("version", version, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="DELETE", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_datasets_create_request(name: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/datasets/{name}/versions" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + if "Repeatability-Request-ID" not in _headers: + _headers["Repeatability-Request-ID"] = str(uuid.uuid4()) + if "Repeatability-First-Sent" not in _headers: + _headers["Repeatability-First-Sent"] = _SERIALIZER.serialize_data( + datetime.datetime.now(datetime.timezone.utc), "rfc-1123" + ) + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_datasets_create_version_request(name: str, version: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/datasets/{name}/versions/{version}" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + "version": _SERIALIZER.url("version", version, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="PUT", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_datasets_start_pending_upload_version_request( # pylint: disable=name-too-long + name: str, version: str, **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/datasets/{name}/versions/{version}/startPendingUpload" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + "version": _SERIALIZER.url("version", version, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_datasets_start_pending_upload_request( # pylint: disable=name-too-long + name: str, **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/datasets/{name}/startPendingUpload" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_datasets_fetch_asset_credentials_request( # pylint: disable=name-too-long + name: str, version: str, **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/datasets/{name}/versions/{version}/credentials" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + "version": _SERIALIZER.url("version", version, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_indexes_list_versions_request( + name: str, + *, + top: Optional[int] = None, + skip: Optional[str] = None, + tags: Optional[str] = None, + list_view_type: Optional[Union[str, _models.ListViewType]] = None, + **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/indexes/{name}/versions" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + if top is not None: + _params["top"] = _SERIALIZER.query("top", top, "int") + if skip is not None: + _params["skip"] = _SERIALIZER.query("skip", skip, "str") + if tags is not None: + _params["tags"] = _SERIALIZER.query("tags", tags, "str") + if list_view_type is not None: + _params["listViewType"] = _SERIALIZER.query("list_view_type", list_view_type, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_indexes_list_latest_request( + *, + top: Optional[int] = None, + skip: Optional[str] = None, + tags: Optional[str] = None, + list_view_type: Optional[Union[str, _models.ListViewType]] = None, + **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/indexes" + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + if top is not None: + _params["top"] = _SERIALIZER.query("top", top, "int") + if skip is not None: + _params["skip"] = _SERIALIZER.query("skip", skip, "str") + if tags is not None: + _params["tags"] = _SERIALIZER.query("tags", tags, "str") + if list_view_type is not None: + _params["listViewType"] = _SERIALIZER.query("list_view_type", list_view_type, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_indexes_get_version_request(name: str, version: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/indexes/{name}/versions/{version}" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + "version": _SERIALIZER.url("version", version, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_indexes_delete_version_request(name: str, version: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/indexes/{name}/versions/{version}" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + "version": _SERIALIZER.url("version", version, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="DELETE", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_indexes_create_request(name: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/indexes/{name}/versions" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + if "Repeatability-Request-ID" not in _headers: + _headers["Repeatability-Request-ID"] = str(uuid.uuid4()) + if "Repeatability-First-Sent" not in _headers: + _headers["Repeatability-First-Sent"] = _SERIALIZER.serialize_data( + datetime.datetime.now(datetime.timezone.utc), "rfc-1123" + ) + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_indexes_create_version_request(name: str, version: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/indexes/{name}/versions/{version}" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + "version": _SERIALIZER.url("version", version, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="PUT", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_deployments_get_request(name: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/deployments/{name}" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_deployments_list_request( + *, + model_publisher: Optional[str] = None, + model_name: Optional[str] = None, + top: Optional[int] = None, + skip: Optional[int] = None, + maxpagesize: Optional[int] = None, + **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/deployments" + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + if model_publisher is not None: + _params["modelPublisher"] = _SERIALIZER.query("model_publisher", model_publisher, "str") + if model_name is not None: + _params["modelName"] = _SERIALIZER.query("model_name", model_name, "str") + if top is not None: + _params["top"] = _SERIALIZER.query("top", top, "int") + if skip is not None: + _params["skip"] = _SERIALIZER.query("skip", skip, "int") + if maxpagesize is not None: + _params["maxpagesize"] = _SERIALIZER.query("maxpagesize", maxpagesize, "int") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_red_teams_get_request(name: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/redTeams/runs/{name}" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_red_teams_list_request( + *, top: Optional[int] = None, skip: Optional[int] = None, maxpagesize: Optional[int] = None, **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/redTeams/runs" + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + if top is not None: + _params["top"] = _SERIALIZER.query("top", top, "int") + if skip is not None: + _params["skip"] = _SERIALIZER.query("skip", skip, "int") + if maxpagesize is not None: + _params["maxpagesize"] = _SERIALIZER.query("maxpagesize", maxpagesize, "int") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_red_teams_create_run_request(**kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/redTeams/runs:run" + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_red_teams_upload_run_request(**kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/redTeams/runs:upload" + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_red_teams_upload_update_run_request(name: str, **kwargs: Any) -> HttpRequest: # pylint: disable=name-too-long + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/redTeams/runs:updateUpload/{name}" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="PATCH", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_red_teams_get_jail_break_dataset_with_type_request( # pylint: disable=name-too-long + type: str, **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/redTeams/simulation/jailbreak/{type}" + path_format_arguments = { + "type": _SERIALIZER.url("type", type, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_red_teams_get_attack_objectives_request( # pylint: disable=name-too-long + *, risk_types: Optional[List[str]] = None, lang: Optional[str] = None, strategy: Optional[str] = None, **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/redTeams/simulation/attackobjectives" + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + if risk_types is not None: + _params["riskTypes"] = [_SERIALIZER.query("risk_types", q, "str") if q is not None else "" for q in risk_types] + if lang is not None: + _params["lang"] = _SERIALIZER.query("lang", lang, "str") + if strategy is not None: + _params["strategy"] = _SERIALIZER.query("strategy", strategy, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_red_teams_get_jail_break_dataset_request(**kwargs: Any) -> HttpRequest: # pylint: disable=name-too-long + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/redTeams/simulation/jailbreak/" + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_red_teams_get_template_parameters_with_type_request( # pylint: disable=name-too-long + type: str, **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "text/plain") + + # Construct URL + _url = "/redTeams/simulation/template/parameters/{type}" + path_format_arguments = { + "type": _SERIALIZER.url("type", type, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_red_teams_get_template_parameters_request(**kwargs: Any) -> HttpRequest: # pylint: disable=name-too-long + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "text/plain") + + # Construct URL + _url = "/redTeams/simulation/template/parameters/" + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_red_teams_get_template_parameters_image_request( # pylint: disable=name-too-long + *, path: str, **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "text/plain") + + # Construct URL + _url = "/redTeams/simulation/template/parameters/image" + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + _params["path"] = _SERIALIZER.query("path", path, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_red_teams_submit_simulation_request(**kwargs: Any) -> HttpRequest: # pylint: disable=name-too-long + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/redTeams/simulation/chat/completions/submit" + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_evaluation_results_list_versions_request( # pylint: disable=name-too-long + name: str, + *, + top: Optional[int] = None, + skip: Optional[str] = None, + tags: Optional[str] = None, + list_view_type: Optional[Union[str, _models.ListViewType]] = None, + **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/evaluationResult/{name}/versions" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + if top is not None: + _params["top"] = _SERIALIZER.query("top", top, "int") + if skip is not None: + _params["skip"] = _SERIALIZER.query("skip", skip, "str") + if tags is not None: + _params["tags"] = _SERIALIZER.query("tags", tags, "str") + if list_view_type is not None: + _params["listViewType"] = _SERIALIZER.query("list_view_type", list_view_type, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_evaluation_results_list_latest_request( # pylint: disable=name-too-long + *, + top: Optional[int] = None, + skip: Optional[str] = None, + tags: Optional[str] = None, + list_view_type: Optional[Union[str, _models.ListViewType]] = None, + **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/evaluationResult" + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + if top is not None: + _params["top"] = _SERIALIZER.query("top", top, "int") + if skip is not None: + _params["skip"] = _SERIALIZER.query("skip", skip, "str") + if tags is not None: + _params["tags"] = _SERIALIZER.query("tags", tags, "str") + if list_view_type is not None: + _params["listViewType"] = _SERIALIZER.query("list_view_type", list_view_type, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_evaluation_results_get_version_request( # pylint: disable=name-too-long + name: str, version: str, **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/evaluationResult/{name}/versions/{version}" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + "version": _SERIALIZER.url("version", version, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_evaluation_results_delete_version_request( # pylint: disable=name-too-long + name: str, version: str, **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/evaluationResult/{name}/versions/{version}" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + "version": _SERIALIZER.url("version", version, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="DELETE", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_evaluation_results_create_request(name: str, **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/evaluationResult/{name}/versions" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + if "Repeatability-Request-ID" not in _headers: + _headers["Repeatability-Request-ID"] = str(uuid.uuid4()) + if "Repeatability-First-Sent" not in _headers: + _headers["Repeatability-First-Sent"] = _SERIALIZER.serialize_data( + datetime.datetime.now(datetime.timezone.utc), "rfc-1123" + ) + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_evaluation_results_create_version_request( # pylint: disable=name-too-long + name: str, version: str, **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/evaluationResult/{name}/versions/{version}" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + "version": _SERIALIZER.url("version", version, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="PUT", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_evaluation_results_start_pending_upload_request( # pylint: disable=name-too-long + name: str, version: str, **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/evaluationResult/{name}/versions/{version}/startPendingUpload" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + "version": _SERIALIZER.url("version", version, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_evaluation_results_fetch_asset_credentials_request( # pylint: disable=name-too-long + name: str, version: str, **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/evaluationResult/{name}/versions/{version}/credentials" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + "version": _SERIALIZER.url("version", version, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) + + +class ServicePatternsOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.onedp.AIProjectClient`'s + :attr:`service_patterns` attribute. + """ + + def __init__(self, *args, **kwargs): + input_args = list(args) + self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + + self.building_blocks = ServicePatternsBuildingBlocksOperations( + self._client, self._config, self._serialize, self._deserialize + ) + + +class ConnectionsOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.onedp.AIProjectClient`'s + :attr:`connections` attribute. + """ + + def __init__(self, *args, **kwargs): + input_args = list(args) + self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + + @distributed_trace + def get(self, name: str, **kwargs: Any) -> _models.Connection: + """Get a connection by name. + + :param name: The name of the resource. Required. + :type name: str + :return: Connection. The Connection is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Connection + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.Connection] = kwargs.pop("cls", None) + + _request = build_connections_get_request( + name=name, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + response_headers = {} + response_headers["x-ms-client-request-id"] = self._deserialize( + "str", response.headers.get("x-ms-client-request-id") + ) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.Connection, response.json()) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + def list( + self, + *, + connection_type: Optional[Union[str, _models.ConnectionType]] = None, + top: Optional[int] = None, + skip: Optional[int] = None, + **kwargs: Any + ) -> Iterable["_models.Connection"]: + """List all connections in the project. + + :keyword connection_type: Specific type of connection to return in list. Known values are: + "AzureOpenAI", "AzureBlob", "CognitiveSearch", "CosmosDB", "ApiKey", "AppInsights", and + "CustomKeys". Default value is None. + :paramtype connection_type: str or ~azure.ai.projects.onedp.models.ConnectionType + :keyword top: The number of result items to return. Default value is None. + :paramtype top: int + :keyword skip: The number of result items to skip. Default value is None. + :paramtype skip: int + :return: An iterator like instance of Connection + :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.onedp.models.Connection] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + maxpagesize = kwargs.pop("maxpagesize", None) + cls: ClsType[List[_models.Connection]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + _request = build_connections_list_request( + connection_type=connection_type, + top=top, + skip=skip, + maxpagesize=maxpagesize, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + else: + # make call to next link with the client's api-version + _parsed_next_link = urllib.parse.urlparse(next_link) + _next_request_params = case_insensitive_dict( + { + key: [urllib.parse.quote(v) for v in value] + for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() + } + ) + _next_request_params["api-version"] = self._config.api_version + _request = HttpRequest( + "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + return _request + + def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.Connection], deserialized.get("value", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("nextLink") or None, iter(list_of_elem) + + def get_next(next_link=None): + _request = prepare_request(next_link) + + _stream = False + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return ItemPaged(get_next, extract_data) + + +class EvaluationsOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.onedp.AIProjectClient`'s + :attr:`evaluations` attribute. + """ + + def __init__(self, *args, **kwargs): + input_args = list(args) + self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + + @distributed_trace + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "name", "client_request_id", "accept"]}, + ) + def get(self, name: str, **kwargs: Any) -> _models.Evaluation: + """Get an evaluation run by name. + + :param name: Identifier of the evaluation. Required. + :type name: str + :return: Evaluation. The Evaluation is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Evaluation + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.Evaluation] = kwargs.pop("cls", None) + + _request = build_evaluations_get_request( + name=name, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + response_headers = {} + response_headers["x-ms-client-request-id"] = self._deserialize( + "str", response.headers.get("x-ms-client-request-id") + ) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.Evaluation, response.json()) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={ + "2025-05-15-preview": [ + "api_version", + "tags", + "properties", + "top", + "skip", + "maxpagesize", + "client_request_id", + "accept", + ] + }, + ) + def list( + self, + *, + tags: Optional[str] = None, + properties: Optional[str] = None, + top: Optional[int] = None, + skip: Optional[int] = None, + **kwargs: Any + ) -> Iterable["_models.Evaluation"]: + """List evaluation runs. + + :keyword tags: Comma-separated list of tag names (and optionally values). Example: + tag1,tag2=value2. Default value is None. + :paramtype tags: str + :keyword properties: Comma-separated list of property names (and optionally values). Example: + prop1,prop2=value2. Default value is None. + :paramtype properties: str + :keyword top: The number of result items to return. Default value is None. + :paramtype top: int + :keyword skip: The number of result items to skip. Default value is None. + :paramtype skip: int + :return: An iterator like instance of Evaluation + :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.onedp.models.Evaluation] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + maxpagesize = kwargs.pop("maxpagesize", None) + cls: ClsType[List[_models.Evaluation]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + _request = build_evaluations_list_request( + tags=tags, + properties=properties, + top=top, + skip=skip, + maxpagesize=maxpagesize, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + else: + # make call to next link with the client's api-version + _parsed_next_link = urllib.parse.urlparse(next_link) + _next_request_params = case_insensitive_dict( + { + key: [urllib.parse.quote(v) for v in value] + for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() + } + ) + _next_request_params["api-version"] = self._config.api_version + _request = HttpRequest( + "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + return _request + + def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.Evaluation], deserialized.get("value", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("nextLink") or None, iter(list_of_elem) + + def get_next(next_link=None): + _request = prepare_request(next_link) + + _stream = False + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return ItemPaged(get_next, extract_data) + + @overload + def create_run( + self, evaluation: _models.Evaluation, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Evaluation: + """Creates an evaluation run. + + :param evaluation: Evaluation to be run. Required. + :type evaluation: ~azure.ai.projects.onedp.models.Evaluation + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: Evaluation. The Evaluation is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Evaluation + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def create_run( + self, evaluation: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Evaluation: + """Creates an evaluation run. + + :param evaluation: Evaluation to be run. Required. + :type evaluation: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: Evaluation. The Evaluation is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Evaluation + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def create_run( + self, evaluation: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Evaluation: + """Creates an evaluation run. + + :param evaluation: Evaluation to be run. Required. + :type evaluation: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: Evaluation. The Evaluation is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Evaluation + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "content_type", "accept"]}, + ) + def create_run(self, evaluation: Union[_models.Evaluation, JSON, IO[bytes]], **kwargs: Any) -> _models.Evaluation: + """Creates an evaluation run. + + :param evaluation: Evaluation to be run. Is one of the following types: Evaluation, JSON, + IO[bytes] Required. + :type evaluation: ~azure.ai.projects.onedp.models.Evaluation or JSON or IO[bytes] + :return: Evaluation. The Evaluation is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Evaluation + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.Evaluation] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(evaluation, (IOBase, bytes)): + _content = evaluation + else: + _content = json.dumps(evaluation, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_evaluations_create_run_request( + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.Evaluation, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "accept"]}, + ) + def _check_annotation(self, **kwargs: Any) -> List[str]: + """Check annotation supported by the service. + + :return: list of str + :rtype: list[str] + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[str]] = kwargs.pop("cls", None) + + _request = build_evaluations_check_annotation_request( + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(List[str], response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + def _submit_annotation( + self, annotation_dto: _models._models.AnnotationDTO, *, content_type: str = "application/json", **kwargs: Any + ) -> str: ... + @overload + def _submit_annotation( + self, annotation_dto: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> str: ... + @overload + def _submit_annotation( + self, annotation_dto: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> str: ... + + @distributed_trace + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "content_type", "accept"]}, + ) + def _submit_annotation( + self, annotation_dto: Union[_models._models.AnnotationDTO, JSON, IO[bytes]], **kwargs: Any + ) -> str: + """Submit the annotation. + + :param annotation_dto: Annotation data inputList of supported annotation. Is one of the + following types: AnnotationDTO, JSON, IO[bytes] Required. + :type annotation_dto: ~azure.ai.projects.onedp.models._models.AnnotationDTO or JSON or + IO[bytes] + :return: str + :rtype: str + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[str] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(annotation_dto, (IOBase, bytes)): + _content = annotation_dto + else: + _content = json.dumps(annotation_dto, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_evaluations_submit_annotation_request( + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [202]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(str, response.text()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + def _upload_run( + self, evaluation: _models._models.EvaluationUpload, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Evaluation: ... + @overload + def _upload_run( + self, evaluation: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Evaluation: ... + @overload + def _upload_run( + self, evaluation: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Evaluation: ... + + @distributed_trace + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "content_type", "accept"]}, + ) + def _upload_run( + self, evaluation: Union[_models._models.EvaluationUpload, JSON, IO[bytes]], **kwargs: Any + ) -> _models.Evaluation: + """Upload the result to an evaluation run. + + :param evaluation: Evaluation to upload. Is one of the following types: EvaluationUpload, JSON, + IO[bytes] Required. + :type evaluation: ~azure.ai.projects.onedp.models._models.EvaluationUpload or JSON or IO[bytes] + :return: Evaluation. The Evaluation is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Evaluation + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.Evaluation] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(evaluation, (IOBase, bytes)): + _content = evaluation + else: + _content = json.dumps(evaluation, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_evaluations_upload_run_request( + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.Evaluation, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + def _upload_update_run( + self, + name: str, + evaluation: _models._models.EvaluationUpload, + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models.Evaluation: ... + @overload + def _upload_update_run( + self, name: str, evaluation: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Evaluation: ... + @overload + def _upload_update_run( + self, name: str, evaluation: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Evaluation: ... + + @distributed_trace + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "name", "content_type", "accept"]}, + ) + def _upload_update_run( + self, name: str, evaluation: Union[_models._models.EvaluationUpload, JSON, IO[bytes]], **kwargs: Any + ) -> _models.Evaluation: + """Update the uploaded the result to an evaluation run. + + :param name: Name of the evaluation run to update. Required. + :type name: str + :param evaluation: Evaluation upload to update. Is one of the following types: + EvaluationUpload, JSON, IO[bytes] Required. + :type evaluation: ~azure.ai.projects.onedp.models._models.EvaluationUpload or JSON or IO[bytes] + :return: Evaluation. The Evaluation is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Evaluation + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.Evaluation] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(evaluation, (IOBase, bytes)): + _content = evaluation + else: + _content = json.dumps(evaluation, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_evaluations_upload_update_run_request( + name=name, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.Evaluation, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + +class DatasetsOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.onedp.AIProjectClient`'s + :attr:`datasets` attribute. + """ + + def __init__(self, *args, **kwargs): + input_args = list(args) + self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + + @distributed_trace + def list_versions( + self, + name: str, + *, + top: Optional[int] = None, + skip: Optional[str] = None, + tags: Optional[str] = None, + list_view_type: Optional[Union[str, _models.ListViewType]] = None, + **kwargs: Any + ) -> Iterable["_models.DatasetVersion"]: + """List all versions of the given DatasetVersion. + + :param name: The name of the resource. Required. + :type name: str + :keyword top: Top count of results, top count cannot be greater than the page size. If topCount + > page size, results with be default page size count will be returned. Default value is None. + :paramtype top: int + :keyword skip: Continuation token for pagination. Default value is None. + :paramtype skip: str + :keyword tags: Comma-separated list of tag names (and optionally values). Example: + tag1,tag2=value2. Default value is None. + :paramtype tags: str + :keyword list_view_type: [ListViewType.ActiveOnly, ListViewType.ArchivedOnly, ListViewType.All] + View type for including/excluding (for example) archived entities. Known values are: + "ActiveOnly", "ArchivedOnly", and "All". Default value is None. + :paramtype list_view_type: str or ~azure.ai.projects.onedp.models.ListViewType + :return: An iterator like instance of DatasetVersion + :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.onedp.models.DatasetVersion] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models.DatasetVersion]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + _request = build_datasets_list_versions_request( + name=name, + top=top, + skip=skip, + tags=tags, + list_view_type=list_view_type, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + else: + # make call to next link with the client's api-version + _parsed_next_link = urllib.parse.urlparse(next_link) + _next_request_params = case_insensitive_dict( + { + key: [urllib.parse.quote(v) for v in value] + for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() + } + ) + _next_request_params["api-version"] = self._config.api_version + _request = HttpRequest( + "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + return _request + + def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.DatasetVersion], deserialized.get("value", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("nextLink") or None, iter(list_of_elem) + + def get_next(next_link=None): + _request = prepare_request(next_link) + + _stream = False + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return ItemPaged(get_next, extract_data) + + @distributed_trace + def list_latest( + self, + *, + top: Optional[int] = None, + skip: Optional[str] = None, + tags: Optional[str] = None, + list_view_type: Optional[Union[str, _models.ListViewType]] = None, + **kwargs: Any + ) -> Iterable["_models.DatasetVersion"]: + """List the latest version of each DatasetVersion. + + :keyword top: Top count of results, top count cannot be greater than the page size. If topCount + > page size, results with be default page size count will be returned. Default value is None. + :paramtype top: int + :keyword skip: Continuation token for pagination. Default value is None. + :paramtype skip: str + :keyword tags: Comma-separated list of tag names (and optionally values). Example: + tag1,tag2=value2. Default value is None. + :paramtype tags: str + :keyword list_view_type: [ListViewType.ActiveOnly, ListViewType.ArchivedOnly, ListViewType.All] + View type for including/excluding (for example) archived entities. Known values are: + "ActiveOnly", "ArchivedOnly", and "All". Default value is None. + :paramtype list_view_type: str or ~azure.ai.projects.onedp.models.ListViewType + :return: An iterator like instance of DatasetVersion + :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.onedp.models.DatasetVersion] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models.DatasetVersion]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + _request = build_datasets_list_latest_request( + top=top, + skip=skip, + tags=tags, + list_view_type=list_view_type, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + else: + # make call to next link with the client's api-version + _parsed_next_link = urllib.parse.urlparse(next_link) + _next_request_params = case_insensitive_dict( + { + key: [urllib.parse.quote(v) for v in value] + for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() + } + ) + _next_request_params["api-version"] = self._config.api_version + _request = HttpRequest( + "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + return _request + + def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.DatasetVersion], deserialized.get("value", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("nextLink") or None, iter(list_of_elem) + + def get_next(next_link=None): + _request = prepare_request(next_link) + + _stream = False + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return ItemPaged(get_next, extract_data) + + @distributed_trace + def get_version(self, name: str, version: str, **kwargs: Any) -> _models.DatasetVersion: + """Get the specific version of the DatasetVersion. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to retrieve. Required. + :type version: str + :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.DatasetVersion + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.DatasetVersion] = kwargs.pop("cls", None) + + _request = build_datasets_get_version_request( + name=name, + version=version, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.DatasetVersion, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + def delete_version( # pylint: disable=inconsistent-return-statements + self, name: str, version: str, **kwargs: Any + ) -> None: + """Delete the specific version of the DatasetVersion. + + :param name: The name of the resource. Required. + :type name: str + :param version: The version of the DatasetVersion to delete. Required. + :type version: str + :return: None + :rtype: None + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[None] = kwargs.pop("cls", None) + + _request = build_datasets_delete_version_request( + name=name, + version=version, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = False + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [204]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if cls: + return cls(pipeline_response, None, {}) # type: ignore + + @overload + def create( + self, name: str, body: _models.DatasetVersion, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.DatasetVersion: + """Create a new DatasetVersion. The version id will be generated by the service. + + :param name: The name of the resource. Required. + :type name: str + :param body: The definition of the DatasetVersion to create. Required. + :type body: ~azure.ai.projects.onedp.models.DatasetVersion + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.DatasetVersion + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def create( + self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.DatasetVersion: + """Create a new DatasetVersion. The version id will be generated by the service. + + :param name: The name of the resource. Required. + :type name: str + :param body: The definition of the DatasetVersion to create. Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.DatasetVersion + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def create( + self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.DatasetVersion: + """Create a new DatasetVersion. The version id will be generated by the service. + + :param name: The name of the resource. Required. + :type name: str + :param body: The definition of the DatasetVersion to create. Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.DatasetVersion + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace + def create( + self, name: str, body: Union[_models.DatasetVersion, JSON, IO[bytes]], **kwargs: Any + ) -> _models.DatasetVersion: + """Create a new DatasetVersion. The version id will be generated by the service. + + :param name: The name of the resource. Required. + :type name: str + :param body: The definition of the DatasetVersion to create. Is one of the following types: + DatasetVersion, JSON, IO[bytes] Required. + :type body: ~azure.ai.projects.onedp.models.DatasetVersion or JSON or IO[bytes] + :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.DatasetVersion + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.DatasetVersion] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_datasets_create_request( + name=name, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + response_headers = {} + response_headers["Repeatability-Result"] = self._deserialize( + "str", response.headers.get("Repeatability-Result") + ) + response_headers["x-ms-client-request-id"] = self._deserialize( + "str", response.headers.get("x-ms-client-request-id") + ) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.DatasetVersion, response.json()) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @overload + def create_version( + self, + name: str, + version: str, + body: _models.DatasetVersion, + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models.DatasetVersion: + """Create a new or replace an existing DatasetVersion with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to create or replace. Required. + :type version: str + :param body: The definition of the DatasetVersion to create. Required. + :type body: ~azure.ai.projects.onedp.models.DatasetVersion + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.DatasetVersion + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def create_version( + self, name: str, version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.DatasetVersion: + """Create a new or replace an existing DatasetVersion with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to create or replace. Required. + :type version: str + :param body: The definition of the DatasetVersion to create. Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.DatasetVersion + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def create_version( + self, name: str, version: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.DatasetVersion: + """Create a new or replace an existing DatasetVersion with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to create or replace. Required. + :type version: str + :param body: The definition of the DatasetVersion to create. Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.DatasetVersion + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace + def create_version( + self, name: str, version: str, body: Union[_models.DatasetVersion, JSON, IO[bytes]], **kwargs: Any + ) -> _models.DatasetVersion: + """Create a new or replace an existing DatasetVersion with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to create or replace. Required. + :type version: str + :param body: The definition of the DatasetVersion to create. Is one of the following types: + DatasetVersion, JSON, IO[bytes] Required. + :type body: ~azure.ai.projects.onedp.models.DatasetVersion or JSON or IO[bytes] + :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.DatasetVersion + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.DatasetVersion] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_datasets_create_version_request( + name=name, + version=version, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200, 201]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.DatasetVersion, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + def start_pending_upload_version( + self, + name: str, + version: str, + body: _models.PendingUploadRequest, + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models.PendingUploadResponse: + """Create or start a pending upload of a dataset for a specific version. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to operate on. Required. + :type version: str + :param body: Parameters for the action. Required. + :type body: ~azure.ai.projects.onedp.models.PendingUploadRequest + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def start_pending_upload_version( + self, name: str, version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.PendingUploadResponse: + """Create or start a pending upload of a dataset for a specific version. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to operate on. Required. + :type version: str + :param body: Parameters for the action. Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def start_pending_upload_version( + self, name: str, version: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.PendingUploadResponse: + """Create or start a pending upload of a dataset for a specific version. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to operate on. Required. + :type version: str + :param body: Parameters for the action. Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace + def start_pending_upload_version( + self, name: str, version: str, body: Union[_models.PendingUploadRequest, JSON, IO[bytes]], **kwargs: Any + ) -> _models.PendingUploadResponse: + """Create or start a pending upload of a dataset for a specific version. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the DatasetVersion to operate on. Required. + :type version: str + :param body: Parameters for the action. Is one of the following types: PendingUploadRequest, + JSON, IO[bytes] Required. + :type body: ~azure.ai.projects.onedp.models.PendingUploadRequest or JSON or IO[bytes] + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.PendingUploadResponse] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_datasets_start_pending_upload_version_request( + name=name, + version=version, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.PendingUploadResponse, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + def start_pending_upload( + self, name: str, body: _models.PendingUploadRequest, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.PendingUploadResponse: + """Create or start a pending upload of a dataset. The version id will be generated by the service. + + :param name: The name of the resource. Required. + :type name: str + :param body: Parameters for the action. Required. + :type body: ~azure.ai.projects.onedp.models.PendingUploadRequest + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def start_pending_upload( + self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.PendingUploadResponse: + """Create or start a pending upload of a dataset. The version id will be generated by the service. + + :param name: The name of the resource. Required. + :type name: str + :param body: Parameters for the action. Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def start_pending_upload( + self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.PendingUploadResponse: + """Create or start a pending upload of a dataset. The version id will be generated by the service. + + :param name: The name of the resource. Required. + :type name: str + :param body: Parameters for the action. Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace + def start_pending_upload( + self, name: str, body: Union[_models.PendingUploadRequest, JSON, IO[bytes]], **kwargs: Any + ) -> _models.PendingUploadResponse: + """Create or start a pending upload of a dataset. The version id will be generated by the service. + + :param name: The name of the resource. Required. + :type name: str + :param body: Parameters for the action. Is one of the following types: PendingUploadRequest, + JSON, IO[bytes] Required. + :type body: ~azure.ai.projects.onedp.models.PendingUploadRequest or JSON or IO[bytes] + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.PendingUploadResponse] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_datasets_start_pending_upload_request( + name=name, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.PendingUploadResponse, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + def fetch_asset_credentials( + self, + name: str, + version: str, + asset_credential_request: _models.AssetCredentialRequest, + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models.AssetCredentialResponse: + """Enable downloading json. + + :param name: Name of the resource. Required. + :type name: str + :param version: Version of the resource. Required. + :type version: str + :param asset_credential_request: Input asset to fetch credentials for. Required. + :type asset_credential_request: ~azure.ai.projects.onedp.models.AssetCredentialRequest + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: AssetCredentialResponse. The AssetCredentialResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.AssetCredentialResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def fetch_asset_credentials( + self, + name: str, + version: str, + asset_credential_request: JSON, + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models.AssetCredentialResponse: + """Enable downloading json. + + :param name: Name of the resource. Required. + :type name: str + :param version: Version of the resource. Required. + :type version: str + :param asset_credential_request: Input asset to fetch credentials for. Required. + :type asset_credential_request: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: AssetCredentialResponse. The AssetCredentialResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.AssetCredentialResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def fetch_asset_credentials( + self, + name: str, + version: str, + asset_credential_request: IO[bytes], + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models.AssetCredentialResponse: + """Enable downloading json. + + :param name: Name of the resource. Required. + :type name: str + :param version: Version of the resource. Required. + :type version: str + :param asset_credential_request: Input asset to fetch credentials for. Required. + :type asset_credential_request: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: AssetCredentialResponse. The AssetCredentialResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.AssetCredentialResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "name", "version", "content_type", "accept"]}, + ) + def fetch_asset_credentials( + self, + name: str, + version: str, + asset_credential_request: Union[_models.AssetCredentialRequest, JSON, IO[bytes]], + **kwargs: Any + ) -> _models.AssetCredentialResponse: + """Enable downloading json. + + :param name: Name of the resource. Required. + :type name: str + :param version: Version of the resource. Required. + :type version: str + :param asset_credential_request: Input asset to fetch credentials for. Is one of the following + types: AssetCredentialRequest, JSON, IO[bytes] Required. + :type asset_credential_request: ~azure.ai.projects.onedp.models.AssetCredentialRequest or JSON + or IO[bytes] + :return: AssetCredentialResponse. The AssetCredentialResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.AssetCredentialResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.AssetCredentialResponse] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(asset_credential_request, (IOBase, bytes)): + _content = asset_credential_request + else: + _content = json.dumps(asset_credential_request, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_datasets_fetch_asset_credentials_request( + name=name, + version=version, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.AssetCredentialResponse, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + +class IndexesOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.onedp.AIProjectClient`'s + :attr:`indexes` attribute. + """ + + def __init__(self, *args, **kwargs): + input_args = list(args) + self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + + @distributed_trace + def list_versions( + self, + name: str, + *, + top: Optional[int] = None, + skip: Optional[str] = None, + tags: Optional[str] = None, + list_view_type: Optional[Union[str, _models.ListViewType]] = None, + **kwargs: Any + ) -> Iterable["_models.Index"]: + """List all versions of the given Index. + + :param name: The name of the resource. Required. + :type name: str + :keyword top: Top count of results, top count cannot be greater than the page size. If topCount + > page size, results with be default page size count will be returned. Default value is None. + :paramtype top: int + :keyword skip: Continuation token for pagination. Default value is None. + :paramtype skip: str + :keyword tags: Comma-separated list of tag names (and optionally values). Example: + tag1,tag2=value2. Default value is None. + :paramtype tags: str + :keyword list_view_type: [ListViewType.ActiveOnly, ListViewType.ArchivedOnly, ListViewType.All] + View type for including/excluding (for example) archived entities. Known values are: + "ActiveOnly", "ArchivedOnly", and "All". Default value is None. + :paramtype list_view_type: str or ~azure.ai.projects.onedp.models.ListViewType + :return: An iterator like instance of Index + :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.onedp.models.Index] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models.Index]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + _request = build_indexes_list_versions_request( + name=name, + top=top, + skip=skip, + tags=tags, + list_view_type=list_view_type, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + else: + # make call to next link with the client's api-version + _parsed_next_link = urllib.parse.urlparse(next_link) + _next_request_params = case_insensitive_dict( + { + key: [urllib.parse.quote(v) for v in value] + for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() + } + ) + _next_request_params["api-version"] = self._config.api_version + _request = HttpRequest( + "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + return _request + + def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.Index], deserialized.get("value", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("nextLink") or None, iter(list_of_elem) + + def get_next(next_link=None): + _request = prepare_request(next_link) + + _stream = False + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return ItemPaged(get_next, extract_data) + + @distributed_trace + def list_latest( + self, + *, + top: Optional[int] = None, + skip: Optional[str] = None, + tags: Optional[str] = None, + list_view_type: Optional[Union[str, _models.ListViewType]] = None, + **kwargs: Any + ) -> Iterable["_models.Index"]: + """List the latest version of each Index. + + :keyword top: Top count of results, top count cannot be greater than the page size. If topCount + > page size, results with be default page size count will be returned. Default value is None. + :paramtype top: int + :keyword skip: Continuation token for pagination. Default value is None. + :paramtype skip: str + :keyword tags: Comma-separated list of tag names (and optionally values). Example: + tag1,tag2=value2. Default value is None. + :paramtype tags: str + :keyword list_view_type: [ListViewType.ActiveOnly, ListViewType.ArchivedOnly, ListViewType.All] + View type for including/excluding (for example) archived entities. Known values are: + "ActiveOnly", "ArchivedOnly", and "All". Default value is None. + :paramtype list_view_type: str or ~azure.ai.projects.onedp.models.ListViewType + :return: An iterator like instance of Index + :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.onedp.models.Index] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models.Index]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + _request = build_indexes_list_latest_request( + top=top, + skip=skip, + tags=tags, + list_view_type=list_view_type, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + else: + # make call to next link with the client's api-version + _parsed_next_link = urllib.parse.urlparse(next_link) + _next_request_params = case_insensitive_dict( + { + key: [urllib.parse.quote(v) for v in value] + for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() + } + ) + _next_request_params["api-version"] = self._config.api_version + _request = HttpRequest( + "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + return _request + + def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.Index], deserialized.get("value", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("nextLink") or None, iter(list_of_elem) + + def get_next(next_link=None): + _request = prepare_request(next_link) + + _stream = False + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return ItemPaged(get_next, extract_data) + + @distributed_trace + def get_version(self, name: str, version: str, **kwargs: Any) -> _models.Index: + """Get the specific version of the Index. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the Index to retrieve. Required. + :type version: str + :return: Index. The Index is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Index + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.Index] = kwargs.pop("cls", None) + + _request = build_indexes_get_version_request( + name=name, + version=version, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.Index, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + def delete_version( # pylint: disable=inconsistent-return-statements + self, name: str, version: str, **kwargs: Any + ) -> None: + """Delete the specific version of the Index. + + :param name: The name of the resource. Required. + :type name: str + :param version: The version of the Index to delete. Required. + :type version: str + :return: None + :rtype: None + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[None] = kwargs.pop("cls", None) + + _request = build_indexes_delete_version_request( + name=name, + version=version, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = False + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [204]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if cls: + return cls(pipeline_response, None, {}) # type: ignore + + @overload + def create( + self, name: str, body: _models.Index, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Index: + """Create a new Index. The version id will be generated by the service. + + :param name: The name of the resource. Required. + :type name: str + :param body: The definition of the Index to create. Required. + :type body: ~azure.ai.projects.onedp.models.Index + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: Index. The Index is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Index + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def create(self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any) -> _models.Index: + """Create a new Index. The version id will be generated by the service. + + :param name: The name of the resource. Required. + :type name: str + :param body: The definition of the Index to create. Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: Index. The Index is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Index + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def create( + self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Index: + """Create a new Index. The version id will be generated by the service. + + :param name: The name of the resource. Required. + :type name: str + :param body: The definition of the Index to create. Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: Index. The Index is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Index + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace + def create(self, name: str, body: Union[_models.Index, JSON, IO[bytes]], **kwargs: Any) -> _models.Index: + """Create a new Index. The version id will be generated by the service. + + :param name: The name of the resource. Required. + :type name: str + :param body: The definition of the Index to create. Is one of the following types: Index, JSON, + IO[bytes] Required. + :type body: ~azure.ai.projects.onedp.models.Index or JSON or IO[bytes] + :return: Index. The Index is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Index + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.Index] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_indexes_create_request( + name=name, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + response_headers = {} + response_headers["Repeatability-Result"] = self._deserialize( + "str", response.headers.get("Repeatability-Result") + ) + response_headers["x-ms-client-request-id"] = self._deserialize( + "str", response.headers.get("x-ms-client-request-id") + ) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.Index, response.json()) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @overload + def create_version( + self, name: str, version: str, body: _models.Index, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Index: + """Create a new or replace an existing Index with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the Index to create or replace. Required. + :type version: str + :param body: The definition of the Index to create. Required. + :type body: ~azure.ai.projects.onedp.models.Index + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: Index. The Index is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Index + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def create_version( + self, name: str, version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Index: + """Create a new or replace an existing Index with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the Index to create or replace. Required. + :type version: str + :param body: The definition of the Index to create. Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: Index. The Index is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Index + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def create_version( + self, name: str, version: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Index: + """Create a new or replace an existing Index with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the Index to create or replace. Required. + :type version: str + :param body: The definition of the Index to create. Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: Index. The Index is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Index + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace + def create_version( + self, name: str, version: str, body: Union[_models.Index, JSON, IO[bytes]], **kwargs: Any + ) -> _models.Index: + """Create a new or replace an existing Index with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the Index to create or replace. Required. + :type version: str + :param body: The definition of the Index to create. Is one of the following types: Index, JSON, + IO[bytes] Required. + :type body: ~azure.ai.projects.onedp.models.Index or JSON or IO[bytes] + :return: Index. The Index is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Index + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.Index] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_indexes_create_version_request( + name=name, + version=version, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200, 201]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.Index, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + +class DeploymentsOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.onedp.AIProjectClient`'s + :attr:`deployments` attribute. + """ + + def __init__(self, *args, **kwargs): + input_args = list(args) + self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + + @distributed_trace + def get(self, name: str, **kwargs: Any) -> _models.Deployment: + """Get a deployed model. + + :param name: Name of the deployment. Required. + :type name: str + :return: Deployment. The Deployment is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Deployment + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.Deployment] = kwargs.pop("cls", None) + + _request = build_deployments_get_request( + name=name, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + response_headers = {} + response_headers["x-ms-client-request-id"] = self._deserialize( + "str", response.headers.get("x-ms-client-request-id") + ) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.Deployment, response.json()) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + def list( + self, + *, + model_publisher: Optional[str] = None, + model_name: Optional[str] = None, + top: Optional[int] = None, + skip: Optional[int] = None, + **kwargs: Any + ) -> Iterable["_models.Deployment"]: + """List all deployed models in the project. + + :keyword model_publisher: Model publisher to filter models by. Default value is None. + :paramtype model_publisher: str + :keyword model_name: Model name (the publisher specific name) to filter models by. Default + value is None. + :paramtype model_name: str + :keyword top: The number of result items to return. Default value is None. + :paramtype top: int + :keyword skip: The number of result items to skip. Default value is None. + :paramtype skip: int + :return: An iterator like instance of Deployment + :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.onedp.models.Deployment] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + maxpagesize = kwargs.pop("maxpagesize", None) + cls: ClsType[List[_models.Deployment]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + _request = build_deployments_list_request( + model_publisher=model_publisher, + model_name=model_name, + top=top, + skip=skip, + maxpagesize=maxpagesize, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + else: + # make call to next link with the client's api-version + _parsed_next_link = urllib.parse.urlparse(next_link) + _next_request_params = case_insensitive_dict( + { + key: [urllib.parse.quote(v) for v in value] + for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() + } + ) + _next_request_params["api-version"] = self._config.api_version + _request = HttpRequest( + "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + return _request + + def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.Deployment], deserialized.get("value", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("nextLink") or None, iter(list_of_elem) + + def get_next(next_link=None): + _request = prepare_request(next_link) + + _stream = False + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return ItemPaged(get_next, extract_data) + + +class RedTeamsOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.onedp.AIProjectClient`'s + :attr:`red_teams` attribute. + """ + + def __init__(self, *args, **kwargs): + input_args = list(args) + self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + + @distributed_trace + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "name", "client_request_id", "accept"]}, + ) + def get(self, name: str, **kwargs: Any) -> _models.RedTeam: + """Get a redteam by name. + + :param name: Identifier of the red team. Required. + :type name: str + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.RedTeam + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.RedTeam] = kwargs.pop("cls", None) + + _request = build_red_teams_get_request( + name=name, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + response_headers = {} + response_headers["x-ms-client-request-id"] = self._deserialize( + "str", response.headers.get("x-ms-client-request-id") + ) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.RedTeam, response.json()) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={ + "2025-05-15-preview": ["api_version", "top", "skip", "maxpagesize", "client_request_id", "accept"] + }, + ) + def list( + self, *, top: Optional[int] = None, skip: Optional[int] = None, **kwargs: Any + ) -> Iterable["_models.RedTeam"]: + """List a redteam by name. + + :keyword top: The number of result items to return. Default value is None. + :paramtype top: int + :keyword skip: The number of result items to skip. Default value is None. + :paramtype skip: int + :return: An iterator like instance of RedTeam + :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.onedp.models.RedTeam] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + maxpagesize = kwargs.pop("maxpagesize", None) + cls: ClsType[List[_models.RedTeam]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + _request = build_red_teams_list_request( + top=top, + skip=skip, + maxpagesize=maxpagesize, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + else: + # make call to next link with the client's api-version + _parsed_next_link = urllib.parse.urlparse(next_link) + _next_request_params = case_insensitive_dict( + { + key: [urllib.parse.quote(v) for v in value] + for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() + } + ) + _next_request_params["api-version"] = self._config.api_version + _request = HttpRequest( + "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + return _request + + def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.RedTeam], deserialized.get("value", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("nextLink") or None, iter(list_of_elem) + + def get_next(next_link=None): + _request = prepare_request(next_link) + + _stream = False + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return ItemPaged(get_next, extract_data) + + @overload + def _create_run( + self, red_team: _models.RedTeam, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.RedTeam: ... + @overload + def _create_run( + self, red_team: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.RedTeam: ... + @overload + def _create_run( + self, red_team: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.RedTeam: ... + + @distributed_trace + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "content_type", "accept"]}, + ) + def _create_run(self, red_team: Union[_models.RedTeam, JSON, IO[bytes]], **kwargs: Any) -> _models.RedTeam: + """Creates a redteam run. + + :param red_team: Redteam to be run. Is one of the following types: RedTeam, JSON, IO[bytes] + Required. + :type red_team: ~azure.ai.projects.onedp.models.RedTeam or JSON or IO[bytes] + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.RedTeam + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.RedTeam] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(red_team, (IOBase, bytes)): + _content = red_team + else: + _content = json.dumps(red_team, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_red_teams_create_run_request( + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.RedTeam, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + def _upload_run( + self, redteam: _models._models.RedTeamUpload, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.RedTeam: ... + @overload + def _upload_run( + self, redteam: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.RedTeam: ... + @overload + def _upload_run( + self, redteam: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.RedTeam: ... + + @distributed_trace + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "content_type", "accept"]}, + ) + def _upload_run( + self, redteam: Union[_models._models.RedTeamUpload, JSON, IO[bytes]], **kwargs: Any + ) -> _models.RedTeam: + """Upload the result to a redteam run. + + :param redteam: Redteam to upload. Is one of the following types: RedTeamUpload, JSON, + IO[bytes] Required. + :type redteam: ~azure.ai.projects.onedp.models._models.RedTeamUpload or JSON or IO[bytes] + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.RedTeam + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.RedTeam] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(redteam, (IOBase, bytes)): + _content = redteam + else: + _content = json.dumps(redteam, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_red_teams_upload_run_request( + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.RedTeam, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + def _upload_update_run( + self, + name: str, + redteam: _models._models.RedTeamUpload, + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models.RedTeam: ... + @overload + def _upload_update_run( + self, name: str, redteam: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.RedTeam: ... + @overload + def _upload_update_run( + self, name: str, redteam: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.RedTeam: ... + + @distributed_trace + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "name", "content_type", "accept"]}, + ) + def _upload_update_run( + self, name: str, redteam: Union[_models._models.RedTeamUpload, JSON, IO[bytes]], **kwargs: Any + ) -> _models.RedTeam: + """Update the uploaded the result to an redteam run. + + :param name: Name of the redteam run to update. Required. + :type name: str + :param redteam: Redteam upload to update. Is one of the following types: RedTeamUpload, JSON, + IO[bytes] Required. + :type redteam: ~azure.ai.projects.onedp.models._models.RedTeamUpload or JSON or IO[bytes] + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.RedTeam + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.RedTeam] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(redteam, (IOBase, bytes)): + _content = redteam + else: + _content = json.dumps(redteam, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_red_teams_upload_update_run_request( + name=name, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.RedTeam, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "type", "accept"]}, + ) + def _get_jail_break_dataset_with_type(self, type: str, **kwargs: Any) -> List[str]: + """Get the jailbreak dataset with type. + + :param type: Type of jailbreak dataset. Required. + :type type: str + :return: list of str + :rtype: list[str] + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[str]] = kwargs.pop("cls", None) + + _request = build_red_teams_get_jail_break_dataset_with_type_request( + type=type, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(List[str], response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "risk_types", "lang", "strategy", "accept"]}, + ) + def _get_attack_objectives( + self, + *, + risk_types: Optional[List[str]] = None, + lang: Optional[str] = None, + strategy: Optional[str] = None, + **kwargs: Any + ) -> List[_models._models.AttackObjective]: + """Get the attack objectives. + + :keyword risk_types: Risk types for the attack objectives dataset. Default value is None. + :paramtype risk_types: list[str] + :keyword lang: The language for the attack objectives dataset, defaults to 'en'. Default value + is None. + :paramtype lang: str + :keyword strategy: The strategy. Default value is None. + :paramtype strategy: str + :return: list of AttackObjective + :rtype: list[~azure.ai.projects.onedp.models._models.AttackObjective] + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models._models.AttackObjective]] = kwargs.pop("cls", None) + + _request = build_red_teams_get_attack_objectives_request( + risk_types=risk_types, + lang=lang, + strategy=strategy, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(List[_models._models.AttackObjective], response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "accept"]}, + ) + def _get_jail_break_dataset(self, **kwargs: Any) -> List[str]: + """Get the jailbreak dataset. + + :return: list of str + :rtype: list[str] + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[str]] = kwargs.pop("cls", None) + + _request = build_red_teams_get_jail_break_dataset_request( + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(List[str], response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "type", "accept"]}, + ) + def get_template_parameters_with_type(self, type: str, **kwargs: Any) -> str: + """Get template parameters with type. + + :param type: Type for the template parameters. Required. + :type type: str + :return: str + :rtype: str + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[str] = kwargs.pop("cls", None) + + _request = build_red_teams_get_template_parameters_with_type_request( + type=type, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(str, response.text()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "accept"]}, + ) + def _get_template_parameters(self, **kwargs: Any) -> str: + """Get template parameters. + + :return: str + :rtype: str + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[str] = kwargs.pop("cls", None) + + _request = build_red_teams_get_template_parameters_request( + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(str, response.text()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "path", "accept"]}, + ) + def get_template_parameters_image(self, *, path: str, **kwargs: Any) -> str: + """Get the template parameters image. + + :keyword path: Image path. Required. + :paramtype path: str + :return: str + :rtype: str + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[str] = kwargs.pop("cls", None) + + _request = build_red_teams_get_template_parameters_image_request( + path=path, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(str, response.text()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + def _submit_simulation( + self, body: _models._models.SimulationDTO, *, content_type: str = "application/json", **kwargs: Any + ) -> _models._models.LongRunningResponse: ... + @overload + def _submit_simulation( + self, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models._models.LongRunningResponse: ... + @overload + def _submit_simulation( + self, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models._models.LongRunningResponse: ... + + @distributed_trace + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "content_type", "accept"]}, + ) + def _submit_simulation( + self, body: Union[_models._models.SimulationDTO, JSON, IO[bytes]], **kwargs: Any + ) -> _models._models.LongRunningResponse: + """Submit a request for simulation. + + :param body: Properties of a Prompt Version. Is one of the following types: SimulationDTO, + JSON, IO[bytes] Required. + :type body: ~azure.ai.projects.onedp.models._models.SimulationDTO or JSON or IO[bytes] + :return: LongRunningResponse. The LongRunningResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models._models.LongRunningResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models._models.LongRunningResponse] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_red_teams_submit_simulation_request( + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [202]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize( + _models._models.LongRunningResponse, response.json() # pylint: disable=protected-access + ) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + +class EvaluationResultsOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.onedp.AIProjectClient`'s + :attr:`evaluation_results` attribute. + """ + + def __init__(self, *args, **kwargs): + input_args = list(args) + self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + + @distributed_trace + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={ + "2025-05-15-preview": ["api_version", "name", "top", "skip", "tags", "list_view_type", "accept"] + }, + ) + def _list_versions( + self, + name: str, + *, + top: Optional[int] = None, + skip: Optional[str] = None, + tags: Optional[str] = None, + list_view_type: Optional[Union[str, _models.ListViewType]] = None, + **kwargs: Any + ) -> Iterable["_models._models.EvaluationResult"]: + """List all versions of the given EvaluationResult. + + :param name: The name of the resource. Required. + :type name: str + :keyword top: Top count of results, top count cannot be greater than the page size. If topCount + > page size, results with be default page size count will be returned. Default value is None. + :paramtype top: int + :keyword skip: Continuation token for pagination. Default value is None. + :paramtype skip: str + :keyword tags: Comma-separated list of tag names (and optionally values). Example: + tag1,tag2=value2. Default value is None. + :paramtype tags: str + :keyword list_view_type: [ListViewType.ActiveOnly, ListViewType.ArchivedOnly, ListViewType.All] + View type for including/excluding (for example) archived entities. Known values are: + "ActiveOnly", "ArchivedOnly", and "All". Default value is None. + :paramtype list_view_type: str or ~azure.ai.projects.onedp.models.ListViewType + :return: An iterator like instance of EvaluationResult + :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.onedp.models._models.EvaluationResult] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models._models.EvaluationResult]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + _request = build_evaluation_results_list_versions_request( + name=name, + top=top, + skip=skip, + tags=tags, + list_view_type=list_view_type, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + else: + # make call to next link with the client's api-version + _parsed_next_link = urllib.parse.urlparse(next_link) + _next_request_params = case_insensitive_dict( + { + key: [urllib.parse.quote(v) for v in value] + for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() + } + ) + _next_request_params["api-version"] = self._config.api_version + _request = HttpRequest( + "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + return _request + + def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models._models.EvaluationResult], deserialized.get("value", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("nextLink") or None, iter(list_of_elem) + + def get_next(next_link=None): + _request = prepare_request(next_link) + + _stream = False + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return ItemPaged(get_next, extract_data) + + @distributed_trace + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "top", "skip", "tags", "list_view_type", "accept"]}, + ) + def _list_latest( + self, + *, + top: Optional[int] = None, + skip: Optional[str] = None, + tags: Optional[str] = None, + list_view_type: Optional[Union[str, _models.ListViewType]] = None, + **kwargs: Any + ) -> Iterable["_models._models.EvaluationResult"]: + """List the latest version of each EvaluationResult. + + :keyword top: Top count of results, top count cannot be greater than the page size. If topCount + > page size, results with be default page size count will be returned. Default value is None. + :paramtype top: int + :keyword skip: Continuation token for pagination. Default value is None. + :paramtype skip: str + :keyword tags: Comma-separated list of tag names (and optionally values). Example: + tag1,tag2=value2. Default value is None. + :paramtype tags: str + :keyword list_view_type: [ListViewType.ActiveOnly, ListViewType.ArchivedOnly, ListViewType.All] + View type for including/excluding (for example) archived entities. Known values are: + "ActiveOnly", "ArchivedOnly", and "All". Default value is None. + :paramtype list_view_type: str or ~azure.ai.projects.onedp.models.ListViewType + :return: An iterator like instance of EvaluationResult + :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.onedp.models._models.EvaluationResult] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[List[_models._models.EvaluationResult]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + _request = build_evaluation_results_list_latest_request( + top=top, + skip=skip, + tags=tags, + list_view_type=list_view_type, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + else: + # make call to next link with the client's api-version + _parsed_next_link = urllib.parse.urlparse(next_link) + _next_request_params = case_insensitive_dict( + { + key: [urllib.parse.quote(v) for v in value] + for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() + } + ) + _next_request_params["api-version"] = self._config.api_version + _request = HttpRequest( + "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + return _request + + def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models._models.EvaluationResult], deserialized.get("value", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("nextLink") or None, iter(list_of_elem) + + def get_next(next_link=None): + _request = prepare_request(next_link) + + _stream = False + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return ItemPaged(get_next, extract_data) + + @distributed_trace + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "name", "version", "accept"]}, + ) + def _get_version(self, name: str, version: str, **kwargs: Any) -> _models._models.EvaluationResult: + """Get the specific version of the EvaluationResult. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the EvaluationResult to retrieve. Required. + :type version: str + :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models._models.EvaluationResult + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models._models.EvaluationResult] = kwargs.pop("cls", None) + + _request = build_evaluation_results_get_version_request( + name=name, + version=version, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize( + _models._models.EvaluationResult, response.json() # pylint: disable=protected-access + ) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "name", "version", "accept"]}, + ) + def _delete_version( # pylint: disable=inconsistent-return-statements + self, name: str, version: str, **kwargs: Any + ) -> None: + """Delete the specific version of the EvaluationResult. + + :param name: The name of the resource. Required. + :type name: str + :param version: The version of the EvaluationResult to delete. Required. + :type version: str + :return: None + :rtype: None + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[None] = kwargs.pop("cls", None) + + _request = build_evaluation_results_delete_version_request( + name=name, + version=version, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = False + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [204]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if cls: + return cls(pipeline_response, None, {}) # type: ignore + + @overload + def _create( + self, + name: str, + body: _models._models.EvaluationResult, + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models._models.EvaluationResult: ... + @overload + def _create( + self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models._models.EvaluationResult: ... + @overload + def _create( + self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models._models.EvaluationResult: ... + + @distributed_trace + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={ + "2025-05-15-preview": [ + "api_version", + "name", + "repeatability_request_id", + "repeatability_first_sent", + "client_request_id", + "content_type", + "accept", + ] + }, + ) + def _create( + self, name: str, body: Union[_models._models.EvaluationResult, JSON, IO[bytes]], **kwargs: Any + ) -> _models._models.EvaluationResult: + """Create a new EvaluationResult. The version id will be generated by the service. + + :param name: The name of the resource. Required. + :type name: str + :param body: The definition of the EvaluationResult to create. Is one of the following types: + EvaluationResult, JSON, IO[bytes] Required. + :type body: ~azure.ai.projects.onedp.models._models.EvaluationResult or JSON or IO[bytes] + :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models._models.EvaluationResult + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models._models.EvaluationResult] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_evaluation_results_create_request( + name=name, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + response_headers = {} + response_headers["Repeatability-Result"] = self._deserialize( + "str", response.headers.get("Repeatability-Result") + ) + response_headers["x-ms-client-request-id"] = self._deserialize( + "str", response.headers.get("x-ms-client-request-id") + ) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize( + _models._models.EvaluationResult, response.json() # pylint: disable=protected-access + ) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @overload + def _create_version( + self, + name: str, + version: str, + body: _models._models.EvaluationResult, + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models._models.EvaluationResult: ... + @overload + def _create_version( + self, name: str, version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models._models.EvaluationResult: ... + @overload + def _create_version( + self, name: str, version: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models._models.EvaluationResult: ... + + @distributed_trace + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "name", "version", "content_type", "accept"]}, + ) + def _create_version( + self, name: str, version: str, body: Union[_models._models.EvaluationResult, JSON, IO[bytes]], **kwargs: Any + ) -> _models._models.EvaluationResult: + """Create a new or replace an existing EvaluationResult with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the EvaluationResult to create or replace. Required. + :type version: str + :param body: The definition of the EvaluationResult to create. Is one of the following types: + EvaluationResult, JSON, IO[bytes] Required. + :type body: ~azure.ai.projects.onedp.models._models.EvaluationResult or JSON or IO[bytes] + :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models._models.EvaluationResult + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models._models.EvaluationResult] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_evaluation_results_create_version_request( + name=name, + version=version, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200, 201]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize( + _models._models.EvaluationResult, response.json() # pylint: disable=protected-access + ) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + def _start_pending_upload( + self, + name: str, + version: str, + body: _models.PendingUploadRequest, + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models.PendingUploadResponse: ... + @overload + def _start_pending_upload( + self, name: str, version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.PendingUploadResponse: ... + @overload + def _start_pending_upload( + self, name: str, version: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.PendingUploadResponse: ... + + @distributed_trace + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "name", "version", "content_type", "accept"]}, + ) + def _start_pending_upload( + self, name: str, version: str, body: Union[_models.PendingUploadRequest, JSON, IO[bytes]], **kwargs: Any + ) -> _models.PendingUploadResponse: + """Create or start a pending upload of a evaluation results for a specific version. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the EvaluationResult to operate on. Required. + :type version: str + :param body: Parameters for the action. Is one of the following types: PendingUploadRequest, + JSON, IO[bytes] Required. + :type body: ~azure.ai.projects.onedp.models.PendingUploadRequest or JSON or IO[bytes] + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.PendingUploadResponse] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_evaluation_results_start_pending_upload_request( + name=name, + version=version, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.PendingUploadResponse, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + @overload + def _fetch_asset_credentials( + self, + name: str, + version: str, + asset_credential_request: _models.AssetCredentialRequest, + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models.AssetCredentialResponse: ... + @overload + def _fetch_asset_credentials( + self, + name: str, + version: str, + asset_credential_request: JSON, + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models.AssetCredentialResponse: ... + @overload + def _fetch_asset_credentials( + self, + name: str, + version: str, + asset_credential_request: IO[bytes], + *, + content_type: str = "application/json", + **kwargs: Any + ) -> _models.AssetCredentialResponse: ... + + @distributed_trace + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "name", "version", "content_type", "accept"]}, + ) + def _fetch_asset_credentials( + self, + name: str, + version: str, + asset_credential_request: Union[_models.AssetCredentialRequest, JSON, IO[bytes]], + **kwargs: Any + ) -> _models.AssetCredentialResponse: + """Enable downloading json. + + :param name: Name of the resource. Required. + :type name: str + :param version: Version of the resource. Required. + :type version: str + :param asset_credential_request: Input asset to fetch credentials for. Is one of the following + types: AssetCredentialRequest, JSON, IO[bytes] Required. + :type asset_credential_request: ~azure.ai.projects.onedp.models.AssetCredentialRequest or JSON + or IO[bytes] + :return: AssetCredentialResponse. The AssetCredentialResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.AssetCredentialResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} + + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.AssetCredentialResponse] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _content = None + if isinstance(asset_credential_request, (IOBase, bytes)): + _content = asset_credential_request + else: + _content = json.dumps(asset_credential_request, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + + _request = build_evaluation_results_fetch_asset_credentials_request( + name=name, + version=version, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.AssetCredentialResponse, response.json()) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + +class ServicePatternsBuildingBlocksOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.onedp.AIProjectClient`'s + :attr:`building_blocks` attribute. + """ + + def __init__(self, *args, **kwargs): + input_args = list(args) + self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/operations/_patch.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/operations/_patch.py new file mode 100644 index 000000000000..c8041306bd2e --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/operations/_patch.py @@ -0,0 +1,245 @@ +# pylint: disable=line-too-long,useless-suppression +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +"""Customize generated code here. + +Follow our quickstart for examples: https://aka.ms/azsdk/python/dpcodegen/python/customize +""" +import logging +import inspect +from typing import List, Optional, Any, Tuple +from pathlib import Path +from azure.storage.blob import ContainerClient + +from ._operations import DatasetsOperations as DatasetsOperationsGenerated +from ..models._models import ( + DatasetVersion, + PendingUploadRequest, + PendingUploadType, + PendingUploadResponse, +) +from ..models._enums import ( + DatasetType, + AuthenticationType, +) + +logger = logging.getLogger(__name__) + + +class DatasetsOperations(DatasetsOperationsGenerated): + + # Internal helper method to create a new dataset and return a ContainerClient from azure-storage-blob package, + # to the dataset's blob storage. + def _create_dataset_and_get_its_container_client( + self, + name: str, + input_version: Optional[str] = None, + ) -> Tuple[ContainerClient, str]: + + if input_version: + pending_upload_response: PendingUploadResponse = self.start_pending_upload_version( + name=name, + version=input_version, + body=PendingUploadRequest(pending_upload_type=PendingUploadType.TEMPORARY_BLOB_REFERENCE), + ) + output_version: str = input_version + else: + pending_upload_response: PendingUploadResponse = self.start_pending_upload( + name=name, + body=PendingUploadRequest(pending_upload_type=PendingUploadType.TEMPORARY_BLOB_REFERENCE), + ) + if pending_upload_response.dataset_version: + output_version: str = pending_upload_response.dataset_version + else: + raise ValueError("Dataset version is not present in the response") + + if not pending_upload_response.blob_reference_for_consumption: + raise ValueError("Blob reference for consumption is not present") + if not pending_upload_response.blob_reference_for_consumption.credential.type: + raise ValueError("Credential type is not present") + if pending_upload_response.blob_reference_for_consumption.credential.type != AuthenticationType.SAS: + raise ValueError("Credential type is not SAS") + if not pending_upload_response.blob_reference_for_consumption.blob_uri: + raise ValueError("Blob URI is not present or empty") + + if logger.getEffectiveLevel() == logging.DEBUG: + method = inspect.currentframe().f_code.co_name if inspect.currentframe() else "unknown" + logger.debug( + "[%s] pending_upload_response.pending_upload_id = %s.", + method, + pending_upload_response.pending_upload_id, + ) + logger.debug( + "[%s] pending_upload_response.pending_upload_type = %s.", + method, + pending_upload_response.pending_upload_type, + ) # == PendingUploadType.TEMPORARY_BLOB_REFERENCE + logger.debug( + "[%s] pending_upload_response.blob_reference_for_consumption.blob_uri = %s.", + method, + pending_upload_response.blob_reference_for_consumption.blob_uri, + ) # Hosted on behalf of (HOBO) not visible to the user. If the form of: "https://.blob.core.windows.net/?" + logger.debug( + "[%s] pending_upload_response.blob_reference_for_consumption.storage_account_arm_id = %s.", + method, + pending_upload_response.blob_reference_for_consumption.storage_account_arm_id, + ) # /subscriptions/<>/resourceGroups/<>/Microsoft.Storage/accounts/<> + logger.debug( + "[%s] pending_upload_response.blob_reference_for_consumption.credential.sas_uri = %s.", + method, + pending_upload_response.blob_reference_for_consumption.credential.sas_uri, + ) + logger.debug( + "[%s] pending_upload_response.blob_reference_for_consumption.credential.type = %s.", + method, + pending_upload_response.blob_reference_for_consumption.credential.type, + ) # == AuthenticationType.SAS + + # For overview on Blob storage SDK in Python see: + # https://learn.microsoft.com/azure/storage/blobs/storage-quickstart-blobs-python + # https://learn.microsoft.com/azure/storage/blobs/storage-blob-upload-python + + # See https://learn.microsoft.com/python/api/azure-storage-blob/azure.storage.blob.containerclient?view=azure-python#azure-storage-blob-containerclient-from-container-url + return ( + ContainerClient.from_container_url( + container_url=pending_upload_response.blob_reference_for_consumption.blob_uri, # Of the form: "https://.blob.core.windows.net/?" + ), + output_version, + ) + + def upload_file_and_create( + self, *, name: str, version: Optional[str] = None, file: str, **kwargs: Any + ) -> DatasetVersion: + """Upload file to a blob storage, and create a dataset that references this file. + This method uses the `ContainerClient.upload_blob` method from the azure-storage-blob package + to upload the file. Any keyword arguments provided will be passed to the `upload_blob` method. + + :param name: The name of the dataset. Required. + :type name: str + :param version: The version identifier for the dataset. Optional. + :type version: str or None + :param file: The file name (including optional path) to be uploaded. Required. + :type file: str + :return: The created dataset version. + :rtype: ~azure.ai.projects.models.DatasetVersion + :raises ~azure.core.exceptions.HttpResponseError: If an error occurs during the HTTP request. + """ + + path_file = Path(file) + if not path_file.exists(): + raise ValueError("The provided file does not exist.") + if path_file.is_dir(): + raise ValueError("The provided file is actually a folder. Use method `create_and_upload_folder` instead") + + container_client, output_version = self._create_dataset_and_get_its_container_client( + name=name, input_version=version + ) + + with container_client: + + with open(file=file, mode="rb") as data: + + blob_name = path_file.name # Extract the file name from the path. + logger.debug( + "[%s] Start uploading file `%s` as blob `%s`.", + inspect.currentframe().f_code.co_name, + file, + blob_name, + ) + + # See https://learn.microsoft.com/python/api/azure-storage-blob/azure.storage.blob.containerclient?view=azure-python#azure-storage-blob-containerclient-upload-blob + with container_client.upload_blob(name=blob_name, data=data, **kwargs) as blob_client: + + logger.debug("[%s] Done uploading", inspect.currentframe().f_code.co_name) + + dataset_version = self.create_version( + name=name, + version=output_version, + body=DatasetVersion( + # See https://learn.microsoft.com/python/api/azure-storage-blob/azure.storage.blob.blobclient?view=azure-python#azure-storage-blob-blobclient-url + # Per above doc the ".url" contains SAS token... should this be stripped away? + dataset_uri=blob_client.url, # ".blob.windows.core.net//" + type=DatasetType.URI_FILE, + ), + ) + + return dataset_version + + def upload_folder_and_create( + self, *, name: str, version: Optional[str] = None, folder: str, **kwargs: Any + ) -> DatasetVersion: + """Upload all files in a folder and its sub folders to a blob storage, while maintaining + relative paths, and create a dataset that references this folder. + This method uses the `ContainerClient.upload_blob` method from the azure-storage-blob package + to upload each file. Any keyword arguments provided will be passed to the `upload_blob` method. + + :param name: The name of the dataset. Required. + :type name: str + :param version: The version identifier for the dataset. Optional. + :type version: str or None + :param folder: The folder name (including optional path) to be uploaded. Required. + :type file: str + :return: The created dataset version. + :rtype: ~azure.ai.projects.models.DatasetVersion + :raises ~azure.core.exceptions.HttpResponseError: If an error occurs during the HTTP request. + """ + path_folder = Path(folder) + if not Path(path_folder).exists(): + raise ValueError("The provided folder does not exist.") + if Path(path_folder).is_file(): + raise ValueError("The provided folder is actually a file. Use method `create_and_upload_file` instead.") + + container_client, output_version = self._create_dataset_and_get_its_container_client( + name=name, input_version=version + ) + + with container_client: + + # Recursively traverse all files in the folder + files_uploaded: bool = False + for file_path in path_folder.rglob("*"): # `rglob` matches all files and folders recursively + if file_path.is_file(): # Check if the path is a file. Skip folders. + blob_name = file_path.relative_to(path_folder) # Blob name relative to the folder + logger.debug( + "[%s] Start uploading file `%s` as blob `%s`.", + inspect.currentframe().f_code.co_name, + file_path, + blob_name, + ) + with file_path.open("rb") as data: # Open the file for reading in binary mode + # See https://learn.microsoft.com/python/api/azure-storage-blob/azure.storage.blob.containerclient?view=azure-python#azure-storage-blob-containerclient-upload-blob + container_client.upload_blob(name=str(blob_name), data=data, **kwargs) + logger.debug("[%s] Done uploaded.", inspect.currentframe().f_code.co_name) + files_uploaded = True + + if not files_uploaded: + raise ValueError("The provided folder is empty.") + + dataset_version = self.create_version( + name=name, + version=output_version, + body=DatasetVersion( + # See https://learn.microsoft.com/python/api/azure-storage-blob/azure.storage.blob.blobclient?view=azure-python#azure-storage-blob-blobclient-url + # Per above doc the ".url" contains SAS token... should this be stripped away? + dataset_uri=container_client.url, # ".blob.windows.core.net/ ?" + type=DatasetType.URI_FOLDER, + ), + ) + + return dataset_version + + +__all__: List[str] = [ + "DatasetsOperations" +] # Add all objects you want publicly available to users at this package level + + +def patch_sdk(): + """Do not remove from this file. + + `patch_sdk` is a last resort escape hatch that allows you to do customizations + you can't accomplish using the techniques described in + https://aka.ms/azsdk/python/dpcodegen/python/customize + """ diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/py.typed b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/py.typed new file mode 100644 index 000000000000..e5aff4f83af8 --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/py.typed @@ -0,0 +1 @@ +# Marker file for PEP 561. \ No newline at end of file diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/__init__.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/__init__.py new file mode 100644 index 000000000000..ecd07b134612 --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/__init__.py @@ -0,0 +1 @@ +__path__ = __import__("pkgutil").extend_path(__path__, __name__) # type: ignore diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/aio/__init__.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/aio/__init__.py new file mode 100644 index 000000000000..ecd07b134612 --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/aio/__init__.py @@ -0,0 +1 @@ +__path__ = __import__("pkgutil").extend_path(__path__, __name__) # type: ignore diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/aio/operations/__init__.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/aio/operations/__init__.py new file mode 100644 index 000000000000..134859369c62 --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/aio/operations/__init__.py @@ -0,0 +1,25 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# Code generated by Microsoft (R) Python Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is regenerated. +# -------------------------------------------------------------------------- +# pylint: disable=wrong-import-position + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from ._patch import * # pylint: disable=unused-wildcard-import + +from ._operations import ServicePatternsOperations # type: ignore + +from ._patch import __all__ as _patch_all +from ._patch import * +from ._patch import patch_sdk as _patch_sdk + +__all__ = [ + "ServicePatternsOperations", +] +__all__.extend([p for p in _patch_all if p not in __all__]) # pyright: ignore +_patch_sdk() diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/aio/operations/_operations.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/aio/operations/_operations.py new file mode 100644 index 000000000000..25f11cf12b17 --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/aio/operations/_operations.py @@ -0,0 +1,34 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# Code generated by Microsoft (R) Python Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is regenerated. +# -------------------------------------------------------------------------- +from azure.core import AsyncPipelineClient + +from ...._serialization import Deserializer, Serializer +from ....aio._configuration import AIProjectClientConfiguration +from ...buildingblocks.aio.operations._operations import ServicePatternsBuildingBlocksOperations + + +class ServicePatternsOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.aio.AIProjectClient`'s + :attr:`service_patterns` attribute. + """ + + def __init__(self, *args, **kwargs) -> None: + input_args = list(args) + self._client: AsyncPipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + + self.building_blocks = ServicePatternsBuildingBlocksOperations( + self._client, self._config, self._serialize, self._deserialize + ) diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/aio/operations/_patch.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/aio/operations/_patch.py new file mode 100644 index 000000000000..1bb0db275def --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/aio/operations/_patch.py @@ -0,0 +1,20 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +"""Customize generated code here. + +Follow our quickstart for examples: https://aka.ms/azsdk/python/dpcodegen/python/customize +""" +from typing import List + +__all__: List[str] = [] # Add all objects you want publicly available to users at this package level + + +def patch_sdk(): + """Do not remove from this file. + + `patch_sdk` is a last resort escape hatch that allows you to do customizations + you can't accomplish using the techniques described in + https://aka.ms/azsdk/python/dpcodegen/python/customize + """ diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/__init__.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/__init__.py new file mode 100644 index 000000000000..ecd07b134612 --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/__init__.py @@ -0,0 +1 @@ +__path__ = __import__("pkgutil").extend_path(__path__, __name__) # type: ignore diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/aio/__init__.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/aio/__init__.py new file mode 100644 index 000000000000..ecd07b134612 --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/aio/__init__.py @@ -0,0 +1 @@ +__path__ = __import__("pkgutil").extend_path(__path__, __name__) # type: ignore diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/aio/operations/__init__.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/aio/operations/__init__.py new file mode 100644 index 000000000000..0005d7bbc87b --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/aio/operations/__init__.py @@ -0,0 +1,22 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# Code generated by Microsoft (R) Python Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is regenerated. +# -------------------------------------------------------------------------- +# pylint: disable=wrong-import-position + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from ._patch import * # pylint: disable=unused-wildcard-import + + +from ._patch import __all__ as _patch_all +from ._patch import * +from ._patch import patch_sdk as _patch_sdk + +__all__ = [] +__all__.extend([p for p in _patch_all if p not in __all__]) # pyright: ignore +_patch_sdk() diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/aio/operations/_operations.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/aio/operations/_operations.py new file mode 100644 index 000000000000..e5bc6b5b4b56 --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/aio/operations/_operations.py @@ -0,0 +1,29 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# Code generated by Microsoft (R) Python Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is regenerated. +# -------------------------------------------------------------------------- +from azure.core import AsyncPipelineClient + +from ....._serialization import Deserializer, Serializer +from .....aio._configuration import AIProjectClientConfiguration + + +class ServicePatternsBuildingBlocksOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.aio.AIProjectClient`'s + :attr:`building_blocks` attribute. + """ + + def __init__(self, *args, **kwargs) -> None: + input_args = list(args) + self._client: AsyncPipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/aio/operations/_patch.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/aio/operations/_patch.py new file mode 100644 index 000000000000..1bb0db275def --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/aio/operations/_patch.py @@ -0,0 +1,20 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +"""Customize generated code here. + +Follow our quickstart for examples: https://aka.ms/azsdk/python/dpcodegen/python/customize +""" +from typing import List + +__all__: List[str] = [] # Add all objects you want publicly available to users at this package level + + +def patch_sdk(): + """Do not remove from this file. + + `patch_sdk` is a last resort escape hatch that allows you to do customizations + you can't accomplish using the techniques described in + https://aka.ms/azsdk/python/dpcodegen/python/customize + """ diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/operations/__init__.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/operations/__init__.py new file mode 100644 index 000000000000..0005d7bbc87b --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/operations/__init__.py @@ -0,0 +1,22 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# Code generated by Microsoft (R) Python Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is regenerated. +# -------------------------------------------------------------------------- +# pylint: disable=wrong-import-position + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from ._patch import * # pylint: disable=unused-wildcard-import + + +from ._patch import __all__ as _patch_all +from ._patch import * +from ._patch import patch_sdk as _patch_sdk + +__all__ = [] +__all__.extend([p for p in _patch_all if p not in __all__]) # pyright: ignore +_patch_sdk() diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/operations/_operations.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/operations/_operations.py new file mode 100644 index 000000000000..d0de7043307f --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/operations/_operations.py @@ -0,0 +1,29 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# Code generated by Microsoft (R) Python Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is regenerated. +# -------------------------------------------------------------------------- +from azure.core import PipelineClient + +from ...._configuration import AIProjectClientConfiguration +from ...._serialization import Deserializer, Serializer + + +class ServicePatternsBuildingBlocksOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.AIProjectClient`'s + :attr:`building_blocks` attribute. + """ + + def __init__(self, *args, **kwargs): + input_args = list(args) + self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/operations/_patch.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/operations/_patch.py new file mode 100644 index 000000000000..1bb0db275def --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/operations/_patch.py @@ -0,0 +1,20 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +"""Customize generated code here. + +Follow our quickstart for examples: https://aka.ms/azsdk/python/dpcodegen/python/customize +""" +from typing import List + +__all__: List[str] = [] # Add all objects you want publicly available to users at this package level + + +def patch_sdk(): + """Do not remove from this file. + + `patch_sdk` is a last resort escape hatch that allows you to do customizations + you can't accomplish using the techniques described in + https://aka.ms/azsdk/python/dpcodegen/python/customize + """ diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/operations/__init__.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/operations/__init__.py new file mode 100644 index 000000000000..134859369c62 --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/operations/__init__.py @@ -0,0 +1,25 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# Code generated by Microsoft (R) Python Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is regenerated. +# -------------------------------------------------------------------------- +# pylint: disable=wrong-import-position + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from ._patch import * # pylint: disable=unused-wildcard-import + +from ._operations import ServicePatternsOperations # type: ignore + +from ._patch import __all__ as _patch_all +from ._patch import * +from ._patch import patch_sdk as _patch_sdk + +__all__ = [ + "ServicePatternsOperations", +] +__all__.extend([p for p in _patch_all if p not in __all__]) # pyright: ignore +_patch_sdk() diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/operations/_operations.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/operations/_operations.py new file mode 100644 index 000000000000..4ffe3f454207 --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/operations/_operations.py @@ -0,0 +1,34 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# Code generated by Microsoft (R) Python Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is regenerated. +# -------------------------------------------------------------------------- +from azure.core import PipelineClient + +from ..._configuration import AIProjectClientConfiguration +from ..._serialization import Deserializer, Serializer +from ..buildingblocks.operations._operations import ServicePatternsBuildingBlocksOperations + + +class ServicePatternsOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.ai.projects.AIProjectClient`'s + :attr:`service_patterns` attribute. + """ + + def __init__(self, *args, **kwargs): + input_args = list(args) + self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + + self.building_blocks = ServicePatternsBuildingBlocksOperations( + self._client, self._config, self._serialize, self._deserialize + ) diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/operations/_patch.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/operations/_patch.py new file mode 100644 index 000000000000..1bb0db275def --- /dev/null +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/servicepatterns/operations/_patch.py @@ -0,0 +1,20 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +"""Customize generated code here. + +Follow our quickstart for examples: https://aka.ms/azsdk/python/dpcodegen/python/customize +""" +from typing import List + +__all__: List[str] = [] # Add all objects you want publicly available to users at this package level + + +def patch_sdk(): + """Do not remove from this file. + + `patch_sdk` is a last resort escape hatch that allows you to do customizations + you can't accomplish using the techniques described in + https://aka.ms/azsdk/python/dpcodegen/python/customize + """ From dbcad7393bd9b3ad146517fd4ab4c4f76a5a696c Mon Sep 17 00:00:00 2001 From: Ankit Singhal <30610298+singankit@users.noreply.github.com> Date: Mon, 14 Apr 2025 12:56:54 -0700 Subject: [PATCH 2/7] Add files via upload --- .../onedp/aio/operations/_operations.py | 1602 +++++++-------- .../_common/onedp/models/__init__.py | 54 +- .../__pycache__/__init__.cpython-312.pyc | Bin 1689 -> 1653 bytes .../models/__pycache__/_enums.cpython-312.pyc | Bin 4417 -> 4747 bytes .../__pycache__/_models.cpython-312.pyc | Bin 49298 -> 83167 bytes .../models/__pycache__/_patch.cpython-312.pyc | Bin 812 -> 1223 bytes .../evaluation/_common/onedp/models/_enums.py | 49 +- .../_common/onedp/models/_models.py | 282 ++- .../__pycache__/__init__.cpython-312.pyc | Bin 1008 -> 1008 bytes .../__pycache__/_operations.cpython-312.pyc | Bin 0 -> 242149 bytes .../__pycache__/_patch.cpython-312.pyc | Bin 10648 -> 10648 bytes .../_common/onedp/operations/_operations.py | 1769 +++++++---------- 12 files changed, 1759 insertions(+), 1997 deletions(-) create mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/operations/__pycache__/_operations.cpython-312.pyc diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/operations/_operations.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/operations/_operations.py index 186ab08b5873..fa64ca9752d8 100644 --- a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/operations/_operations.py +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/aio/operations/_operations.py @@ -36,19 +36,17 @@ from ..._validation import api_version_validation from ...operations._operations import ( build_connections_get_request, + build_connections_get_with_credentials_request, build_connections_list_request, - build_datasets_create_request, build_datasets_create_version_request, build_datasets_delete_version_request, - build_datasets_fetch_asset_credentials_request, + build_datasets_get_credentials_request, build_datasets_get_version_request, build_datasets_list_latest_request, build_datasets_list_versions_request, - build_datasets_start_pending_upload_request, build_datasets_start_pending_upload_version_request, build_deployments_get_request, build_deployments_list_request, - build_evaluation_results_create_request, build_evaluation_results_create_version_request, build_evaluation_results_delete_version_request, build_evaluation_results_fetch_asset_credentials_request, @@ -63,7 +61,6 @@ build_evaluations_submit_annotation_request, build_evaluations_upload_run_request, build_evaluations_upload_update_run_request, - build_indexes_create_request, build_indexes_create_version_request, build_indexes_delete_version_request, build_indexes_get_version_request, @@ -134,7 +131,7 @@ def __init__(self, *args, **kwargs) -> None: @distributed_trace_async async def get(self, name: str, **kwargs: Any) -> _models.Connection: - """Get a connection by name. + """Get a connection by name, without populating connection credentials. :param name: The name of the resource. Required. :type name: str @@ -197,21 +194,90 @@ async def get(self, name: str, **kwargs: Any) -> _models.Connection: return deserialized # type: ignore + @distributed_trace_async + async def get_with_credentials(self, name: str, **kwargs: Any) -> _models.Connection: + """Get a connection by name, with its connection credentials. + + :param name: The name of the resource. Required. + :type name: str + :return: Connection. The Connection is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Connection + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.Connection] = kwargs.pop("cls", None) + + _request = build_connections_get_with_credentials_request( + name=name, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + response_headers = {} + response_headers["x-ms-client-request-id"] = self._deserialize( + "str", response.headers.get("x-ms-client-request-id") + ) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.Connection, response.json()) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + @distributed_trace def list( self, *, connection_type: Optional[Union[str, _models.ConnectionType]] = None, + default_connection: Optional[bool] = None, top: Optional[int] = None, skip: Optional[int] = None, **kwargs: Any ) -> AsyncIterable["_models.Connection"]: - """List all connections in the project. + """List all connections in the project, without populating connection credentials. - :keyword connection_type: Specific type of connection to return in list. Known values are: - "AzureOpenAI", "AzureBlob", "CognitiveSearch", "CosmosDB", "ApiKey", "AppInsights", and - "CustomKeys". Default value is None. + :keyword connection_type: List connections of this specific type. Known values are: + "AzureOpenAI", "AzureBlob", "AzureStorageAccount", "CognitiveSearch", "CosmosDB", "ApiKey", + "AppConfig", "AppInsights", and "CustomKeys". Default value is None. :paramtype connection_type: str or ~azure.ai.projects.onedp.models.ConnectionType + :keyword default_connection: List connections that are default connections. Default value is + None. + :paramtype default_connection: bool :keyword top: The number of result items to return. Default value is None. :paramtype top: int :keyword skip: The number of result items to skip. Default value is None. @@ -239,6 +305,7 @@ def prepare_request(next_link=None): _request = build_connections_list_request( connection_type=connection_type, + default_connection=default_connection, top=top, skip=skip, maxpagesize=maxpagesize, @@ -636,7 +703,7 @@ async def create_run( method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "accept"]}, ) - async def _check_annotation(self, **kwargs: Any) -> List[str]: + async def check_annotation(self, **kwargs: Any) -> List[str]: """Check annotation supported by the service. :return: list of str @@ -693,32 +760,66 @@ async def _check_annotation(self, **kwargs: Any) -> List[str]: return deserialized # type: ignore @overload - async def _submit_annotation( - self, annotation_dto: _models._models.AnnotationDTO, *, content_type: str = "application/json", **kwargs: Any - ) -> str: ... + async def submit_annotation( + self, annotation_dto: _models.AnnotationDTO, *, content_type: str = "application/json", **kwargs: Any + ) -> str: + """Submit the annotation. + + :param annotation_dto: Annotation data inputList of supported annotation. Required. + :type annotation_dto: ~azure.ai.projects.onedp.models.AnnotationDTO + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: str + :rtype: str + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - async def _submit_annotation( + async def submit_annotation( self, annotation_dto: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> str: ... + ) -> str: + """Submit the annotation. + + :param annotation_dto: Annotation data inputList of supported annotation. Required. + :type annotation_dto: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: str + :rtype: str + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - async def _submit_annotation( + async def submit_annotation( self, annotation_dto: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> str: ... + ) -> str: + """Submit the annotation. + + :param annotation_dto: Annotation data inputList of supported annotation. Required. + :type annotation_dto: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: str + :rtype: str + :raises ~azure.core.exceptions.HttpResponseError: + """ @distributed_trace_async @api_version_validation( method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "content_type", "accept"]}, ) - async def _submit_annotation( - self, annotation_dto: Union[_models._models.AnnotationDTO, JSON, IO[bytes]], **kwargs: Any + async def submit_annotation( + self, annotation_dto: Union[_models.AnnotationDTO, JSON, IO[bytes]], **kwargs: Any ) -> str: """Submit the annotation. :param annotation_dto: Annotation data inputList of supported annotation. Is one of the following types: AnnotationDTO, JSON, IO[bytes] Required. - :type annotation_dto: ~azure.ai.projects.onedp.models._models.AnnotationDTO or JSON or - IO[bytes] + :type annotation_dto: ~azure.ai.projects.onedp.models.AnnotationDTO or JSON or IO[bytes] :return: str :rtype: str :raises ~azure.core.exceptions.HttpResponseError: @@ -783,31 +884,66 @@ async def _submit_annotation( return deserialized # type: ignore @overload - async def _upload_run( - self, evaluation: _models._models.EvaluationUpload, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.Evaluation: ... + async def upload_run( + self, evaluation: _models.EvaluationUpload, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Evaluation: + """Upload the result to an evaluation run. + + :param evaluation: Evaluation to upload. Required. + :type evaluation: ~azure.ai.projects.onedp.models.EvaluationUpload + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: Evaluation. The Evaluation is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Evaluation + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - async def _upload_run( + async def upload_run( self, evaluation: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.Evaluation: ... + ) -> _models.Evaluation: + """Upload the result to an evaluation run. + + :param evaluation: Evaluation to upload. Required. + :type evaluation: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: Evaluation. The Evaluation is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Evaluation + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - async def _upload_run( + async def upload_run( self, evaluation: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.Evaluation: ... + ) -> _models.Evaluation: + """Upload the result to an evaluation run. + + :param evaluation: Evaluation to upload. Required. + :type evaluation: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: Evaluation. The Evaluation is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Evaluation + :raises ~azure.core.exceptions.HttpResponseError: + """ @distributed_trace_async @api_version_validation( method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "content_type", "accept"]}, ) - async def _upload_run( - self, evaluation: Union[_models._models.EvaluationUpload, JSON, IO[bytes]], **kwargs: Any + async def upload_run( + self, evaluation: Union[_models.EvaluationUpload, JSON, IO[bytes]], **kwargs: Any ) -> _models.Evaluation: """Upload the result to an evaluation run. :param evaluation: Evaluation to upload. Is one of the following types: EvaluationUpload, JSON, IO[bytes] Required. - :type evaluation: ~azure.ai.projects.onedp.models._models.EvaluationUpload or JSON or IO[bytes] + :type evaluation: ~azure.ai.projects.onedp.models.EvaluationUpload or JSON or IO[bytes] :return: Evaluation. The Evaluation is compatible with MutableMapping :rtype: ~azure.ai.projects.onedp.models.Evaluation :raises ~azure.core.exceptions.HttpResponseError: @@ -872,30 +1008,66 @@ async def _upload_run( return deserialized # type: ignore @overload - async def _upload_update_run( - self, - name: str, - evaluation: _models._models.EvaluationUpload, - *, - content_type: str = "application/json", - **kwargs: Any - ) -> _models.Evaluation: ... + async def upload_update_run( + self, name: str, evaluation: _models.EvaluationUpload, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Evaluation: + """Update the uploaded the result to an evaluation run. + + :param name: Name of the evaluation run to update. Required. + :type name: str + :param evaluation: Evaluation upload to update. Required. + :type evaluation: ~azure.ai.projects.onedp.models.EvaluationUpload + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: Evaluation. The Evaluation is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Evaluation + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - async def _upload_update_run( + async def upload_update_run( self, name: str, evaluation: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.Evaluation: ... + ) -> _models.Evaluation: + """Update the uploaded the result to an evaluation run. + + :param name: Name of the evaluation run to update. Required. + :type name: str + :param evaluation: Evaluation upload to update. Required. + :type evaluation: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: Evaluation. The Evaluation is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Evaluation + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - async def _upload_update_run( + async def upload_update_run( self, name: str, evaluation: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.Evaluation: ... + ) -> _models.Evaluation: + """Update the uploaded the result to an evaluation run. + + :param name: Name of the evaluation run to update. Required. + :type name: str + :param evaluation: Evaluation upload to update. Required. + :type evaluation: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: Evaluation. The Evaluation is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Evaluation + :raises ~azure.core.exceptions.HttpResponseError: + """ @distributed_trace_async @api_version_validation( method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "name", "content_type", "accept"]}, ) - async def _upload_update_run( - self, name: str, evaluation: Union[_models._models.EvaluationUpload, JSON, IO[bytes]], **kwargs: Any + async def upload_update_run( + self, name: str, evaluation: Union[_models.EvaluationUpload, JSON, IO[bytes]], **kwargs: Any ) -> _models.Evaluation: """Update the uploaded the result to an evaluation run. @@ -903,7 +1075,7 @@ async def _upload_update_run( :type name: str :param evaluation: Evaluation upload to update. Is one of the following types: EvaluationUpload, JSON, IO[bytes] Required. - :type evaluation: ~azure.ai.projects.onedp.models._models.EvaluationUpload or JSON or IO[bytes] + :type evaluation: ~azure.ai.projects.onedp.models.EvaluationUpload or JSON or IO[bytes] :return: Evaluation. The Evaluation is compatible with MutableMapping :rtype: ~azure.ai.projects.onedp.models.Evaluation :raises ~azure.core.exceptions.HttpResponseError: @@ -1317,13 +1489,21 @@ async def delete_version(self, name: str, version: str, **kwargs: Any) -> None: return cls(pipeline_response, None, {}) # type: ignore @overload - async def create( - self, name: str, body: _models.DatasetVersion, *, content_type: str = "application/json", **kwargs: Any + async def create_version( + self, + name: str, + version: str, + body: _models.DatasetVersion, + *, + content_type: str = "application/json", + **kwargs: Any ) -> _models.DatasetVersion: - """Create a new DatasetVersion. The version id will be generated by the service. + """Create a new or replace an existing DatasetVersion with the given version id. :param name: The name of the resource. Required. :type name: str + :param version: The specific version id of the DatasetVersion to create or replace. Required. + :type version: str :param body: The definition of the DatasetVersion to create. Required. :type body: ~azure.ai.projects.onedp.models.DatasetVersion :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. @@ -1335,13 +1515,15 @@ async def create( """ @overload - async def create( - self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + async def create_version( + self, name: str, version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any ) -> _models.DatasetVersion: - """Create a new DatasetVersion. The version id will be generated by the service. + """Create a new or replace an existing DatasetVersion with the given version id. :param name: The name of the resource. Required. :type name: str + :param version: The specific version id of the DatasetVersion to create or replace. Required. + :type version: str :param body: The definition of the DatasetVersion to create. Required. :type body: JSON :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. @@ -1353,13 +1535,15 @@ async def create( """ @overload - async def create( - self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + async def create_version( + self, name: str, version: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any ) -> _models.DatasetVersion: - """Create a new DatasetVersion. The version id will be generated by the service. + """Create a new or replace an existing DatasetVersion with the given version id. :param name: The name of the resource. Required. :type name: str + :param version: The specific version id of the DatasetVersion to create or replace. Required. + :type version: str :param body: The definition of the DatasetVersion to create. Required. :type body: IO[bytes] :keyword content_type: Body Parameter content-type. Content type parameter for binary body. @@ -1371,13 +1555,15 @@ async def create( """ @distributed_trace_async - async def create( - self, name: str, body: Union[_models.DatasetVersion, JSON, IO[bytes]], **kwargs: Any + async def create_version( + self, name: str, version: str, body: Union[_models.DatasetVersion, JSON, IO[bytes]], **kwargs: Any ) -> _models.DatasetVersion: - """Create a new DatasetVersion. The version id will be generated by the service. + """Create a new or replace an existing DatasetVersion with the given version id. :param name: The name of the resource. Required. :type name: str + :param version: The specific version id of the DatasetVersion to create or replace. Required. + :type version: str :param body: The definition of the DatasetVersion to create. Is one of the following types: DatasetVersion, JSON, IO[bytes] Required. :type body: ~azure.ai.projects.onedp.models.DatasetVersion or JSON or IO[bytes] @@ -1406,8 +1592,9 @@ async def create( else: _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore - _request = build_datasets_create_request( + _request = build_datasets_create_version_request( name=name, + version=version, content_type=content_type, api_version=self._config.api_version, content=_content, @@ -1426,7 +1613,7 @@ async def create( response = pipeline_response.http_response - if response.status_code not in [200]: + if response.status_code not in [200, 201]: if _stream: try: await response.read() # Load the body in memory and close the socket @@ -1435,231 +1622,79 @@ async def create( map_error(status_code=response.status_code, response=response, error_map=error_map) raise HttpResponseError(response=response) - response_headers = {} - response_headers["Repeatability-Result"] = self._deserialize( - "str", response.headers.get("Repeatability-Result") - ) - response_headers["x-ms-client-request-id"] = self._deserialize( - "str", response.headers.get("x-ms-client-request-id") - ) - if _stream: deserialized = response.iter_bytes() else: deserialized = _deserialize(_models.DatasetVersion, response.json()) if cls: - return cls(pipeline_response, deserialized, response_headers) # type: ignore + return cls(pipeline_response, deserialized, {}) # type: ignore return deserialized # type: ignore @overload - async def create_version( + async def start_pending_upload_version( self, name: str, version: str, - body: _models.DatasetVersion, + body: _models.PendingUploadRequest, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.DatasetVersion: - """Create a new or replace an existing DatasetVersion with the given version id. + ) -> _models.PendingUploadResponse: + """Start a new or get an existing pending upload of a dataset for a specific version. :param name: The name of the resource. Required. :type name: str - :param version: The specific version id of the DatasetVersion to create or replace. Required. + :param version: The specific version id of the DatasetVersion to operate on. Required. :type version: str - :param body: The definition of the DatasetVersion to create. Required. - :type body: ~azure.ai.projects.onedp.models.DatasetVersion + :param body: Parameters for the action. Required. + :type body: ~azure.ai.projects.onedp.models.PendingUploadRequest :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. Default value is "application/json". :paramtype content_type: str - :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.DatasetVersion + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse :raises ~azure.core.exceptions.HttpResponseError: """ @overload - async def create_version( + async def start_pending_upload_version( self, name: str, version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.DatasetVersion: - """Create a new or replace an existing DatasetVersion with the given version id. + ) -> _models.PendingUploadResponse: + """Start a new or get an existing pending upload of a dataset for a specific version. :param name: The name of the resource. Required. :type name: str - :param version: The specific version id of the DatasetVersion to create or replace. Required. + :param version: The specific version id of the DatasetVersion to operate on. Required. :type version: str - :param body: The definition of the DatasetVersion to create. Required. + :param body: Parameters for the action. Required. :type body: JSON :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. Default value is "application/json". :paramtype content_type: str - :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.DatasetVersion + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse :raises ~azure.core.exceptions.HttpResponseError: """ @overload - async def create_version( + async def start_pending_upload_version( self, name: str, version: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.DatasetVersion: - """Create a new or replace an existing DatasetVersion with the given version id. + ) -> _models.PendingUploadResponse: + """Start a new or get an existing pending upload of a dataset for a specific version. :param name: The name of the resource. Required. :type name: str - :param version: The specific version id of the DatasetVersion to create or replace. Required. + :param version: The specific version id of the DatasetVersion to operate on. Required. :type version: str - :param body: The definition of the DatasetVersion to create. Required. + :param body: Parameters for the action. Required. :type body: IO[bytes] :keyword content_type: Body Parameter content-type. Content type parameter for binary body. Default value is "application/json". :paramtype content_type: str - :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.DatasetVersion - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @distributed_trace_async - async def create_version( - self, name: str, version: str, body: Union[_models.DatasetVersion, JSON, IO[bytes]], **kwargs: Any - ) -> _models.DatasetVersion: - """Create a new or replace an existing DatasetVersion with the given version id. - - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the DatasetVersion to create or replace. Required. - :type version: str - :param body: The definition of the DatasetVersion to create. Is one of the following types: - DatasetVersion, JSON, IO[bytes] Required. - :type body: ~azure.ai.projects.onedp.models.DatasetVersion or JSON or IO[bytes] - :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.DatasetVersion - :raises ~azure.core.exceptions.HttpResponseError: - """ - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) - - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) - _params = kwargs.pop("params", {}) or {} - - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models.DatasetVersion] = kwargs.pop("cls", None) - - content_type = content_type or "application/json" - _content = None - if isinstance(body, (IOBase, bytes)): - _content = body - else: - _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore - - _request = build_datasets_create_version_request( - name=name, - version=version, - content_type=content_type, - api_version=self._config.api_version, - content=_content, - headers=_headers, - params=_params, - ) - path_format_arguments = { - "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - _stream = kwargs.pop("stream", False) - pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access - _request, stream=_stream, **kwargs - ) - - response = pipeline_response.http_response - - if response.status_code not in [200, 201]: - if _stream: - try: - await response.read() # Load the body in memory and close the socket - except (StreamConsumedError, StreamClosedError): - pass - map_error(status_code=response.status_code, response=response, error_map=error_map) - raise HttpResponseError(response=response) - - if _stream: - deserialized = response.iter_bytes() - else: - deserialized = _deserialize(_models.DatasetVersion, response.json()) - - if cls: - return cls(pipeline_response, deserialized, {}) # type: ignore - - return deserialized # type: ignore - - @overload - async def start_pending_upload_version( - self, - name: str, - version: str, - body: _models.PendingUploadRequest, - *, - content_type: str = "application/json", - **kwargs: Any - ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a dataset for a specific version. - - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the DatasetVersion to operate on. Required. - :type version: str - :param body: Parameters for the action. Required. - :type body: ~azure.ai.projects.onedp.models.PendingUploadRequest - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - async def start_pending_upload_version( - self, name: str, version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a dataset for a specific version. - - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the DatasetVersion to operate on. Required. - :type version: str - :param body: Parameters for the action. Required. - :type body: JSON - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - async def start_pending_upload_version( - self, name: str, version: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a dataset for a specific version. - - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the DatasetVersion to operate on. Required. - :type version: str - :param body: Parameters for the action. Required. - :type body: IO[bytes] - :keyword content_type: Body Parameter content-type. Content type parameter for binary body. - Default value is "application/json". - :paramtype content_type: str - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse :raises ~azure.core.exceptions.HttpResponseError: """ @@ -1667,7 +1702,7 @@ async def start_pending_upload_version( async def start_pending_upload_version( self, name: str, version: str, body: Union[_models.PendingUploadRequest, JSON, IO[bytes]], **kwargs: Any ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a dataset for a specific version. + """Start a new or get an existing pending upload of a dataset for a specific version. :param name: The name of the resource. Required. :type name: str @@ -1741,235 +1776,18 @@ async def start_pending_upload_version( return deserialized # type: ignore - @overload - async def start_pending_upload( - self, name: str, body: _models.PendingUploadRequest, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a dataset. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: Parameters for the action. Required. - :type body: ~azure.ai.projects.onedp.models.PendingUploadRequest - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - async def start_pending_upload( - self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a dataset. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: Parameters for the action. Required. - :type body: JSON - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - async def start_pending_upload( - self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a dataset. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: Parameters for the action. Required. - :type body: IO[bytes] - :keyword content_type: Body Parameter content-type. Content type parameter for binary body. - Default value is "application/json". - :paramtype content_type: str - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse - :raises ~azure.core.exceptions.HttpResponseError: - """ - @distributed_trace_async - async def start_pending_upload( - self, name: str, body: Union[_models.PendingUploadRequest, JSON, IO[bytes]], **kwargs: Any - ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a dataset. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: Parameters for the action. Is one of the following types: PendingUploadRequest, - JSON, IO[bytes] Required. - :type body: ~azure.ai.projects.onedp.models.PendingUploadRequest or JSON or IO[bytes] - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse - :raises ~azure.core.exceptions.HttpResponseError: - """ - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) - - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) - _params = kwargs.pop("params", {}) or {} - - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models.PendingUploadResponse] = kwargs.pop("cls", None) - - content_type = content_type or "application/json" - _content = None - if isinstance(body, (IOBase, bytes)): - _content = body - else: - _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore - - _request = build_datasets_start_pending_upload_request( - name=name, - content_type=content_type, - api_version=self._config.api_version, - content=_content, - headers=_headers, - params=_params, - ) - path_format_arguments = { - "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - _stream = kwargs.pop("stream", False) - pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access - _request, stream=_stream, **kwargs - ) - - response = pipeline_response.http_response - - if response.status_code not in [200]: - if _stream: - try: - await response.read() # Load the body in memory and close the socket - except (StreamConsumedError, StreamClosedError): - pass - map_error(status_code=response.status_code, response=response, error_map=error_map) - raise HttpResponseError(response=response) - - if _stream: - deserialized = response.iter_bytes() - else: - deserialized = _deserialize(_models.PendingUploadResponse, response.json()) - - if cls: - return cls(pipeline_response, deserialized, {}) # type: ignore - - return deserialized # type: ignore - - @overload - async def fetch_asset_credentials( - self, - name: str, - version: str, - asset_credential_request: _models.AssetCredentialRequest, - *, - content_type: str = "application/json", - **kwargs: Any - ) -> _models.AssetCredentialResponse: - """Enable downloading json. - - :param name: Name of the resource. Required. - :type name: str - :param version: Version of the resource. Required. - :type version: str - :param asset_credential_request: Input asset to fetch credentials for. Required. - :type asset_credential_request: ~azure.ai.projects.onedp.models.AssetCredentialRequest - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: AssetCredentialResponse. The AssetCredentialResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.AssetCredentialResponse - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - async def fetch_asset_credentials( - self, - name: str, - version: str, - asset_credential_request: JSON, - *, - content_type: str = "application/json", - **kwargs: Any - ) -> _models.AssetCredentialResponse: - """Enable downloading json. - - :param name: Name of the resource. Required. - :type name: str - :param version: Version of the resource. Required. - :type version: str - :param asset_credential_request: Input asset to fetch credentials for. Required. - :type asset_credential_request: JSON - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: AssetCredentialResponse. The AssetCredentialResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.AssetCredentialResponse - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - async def fetch_asset_credentials( - self, - name: str, - version: str, - asset_credential_request: IO[bytes], - *, - content_type: str = "application/json", - **kwargs: Any - ) -> _models.AssetCredentialResponse: - """Enable downloading json. - - :param name: Name of the resource. Required. - :type name: str - :param version: Version of the resource. Required. - :type version: str - :param asset_credential_request: Input asset to fetch credentials for. Required. - :type asset_credential_request: IO[bytes] - :keyword content_type: Body Parameter content-type. Content type parameter for binary body. - Default value is "application/json". - :paramtype content_type: str - :return: AssetCredentialResponse. The AssetCredentialResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.AssetCredentialResponse - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @distributed_trace_async - @api_version_validation( - method_added_on="2025-05-15-preview", - params_added_on={"2025-05-15-preview": ["api_version", "name", "version", "content_type", "accept"]}, - ) - async def fetch_asset_credentials( - self, - name: str, - version: str, - asset_credential_request: Union[_models.AssetCredentialRequest, JSON, IO[bytes]], - **kwargs: Any + async def get_credentials( + self, name: str, version: str, body: Any, **kwargs: Any ) -> _models.AssetCredentialResponse: - """Enable downloading json. + """Get download sas for dataset version. - :param name: Name of the resource. Required. + :param name: The name of the resource. Required. :type name: str - :param version: Version of the resource. Required. + :param version: The specific version id of the DatasetVersion to operate on. Required. :type version: str - :param asset_credential_request: Input asset to fetch credentials for. Is one of the following - types: AssetCredentialRequest, JSON, IO[bytes] Required. - :type asset_credential_request: ~azure.ai.projects.onedp.models.AssetCredentialRequest or JSON - or IO[bytes] + :param body: Parameters for the action. Required. + :type body: any :return: AssetCredentialResponse. The AssetCredentialResponse is compatible with MutableMapping :rtype: ~azure.ai.projects.onedp.models.AssetCredentialResponse :raises ~azure.core.exceptions.HttpResponseError: @@ -1985,17 +1803,12 @@ async def fetch_asset_credentials( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = kwargs.pop("params", {}) or {} - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + content_type: str = kwargs.pop("content_type", _headers.pop("Content-Type", "application/json")) cls: ClsType[_models.AssetCredentialResponse] = kwargs.pop("cls", None) - content_type = content_type or "application/json" - _content = None - if isinstance(asset_credential_request, (IOBase, bytes)): - _content = asset_credential_request - else: - _content = json.dumps(asset_credential_request, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore - _request = build_datasets_fetch_asset_credentials_request( + _request = build_datasets_get_credentials_request( name=name, version=version, content_type=content_type, @@ -2338,116 +2151,10 @@ async def delete_version(self, name: str, version: str, **kwargs: Any) -> None: :param name: The name of the resource. Required. :type name: str - :param version: The version of the Index to delete. Required. - :type version: str - :return: None - :rtype: None - :raises ~azure.core.exceptions.HttpResponseError: - """ - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) - - _headers = kwargs.pop("headers", {}) or {} - _params = kwargs.pop("params", {}) or {} - - cls: ClsType[None] = kwargs.pop("cls", None) - - _request = build_indexes_delete_version_request( - name=name, - version=version, - api_version=self._config.api_version, - headers=_headers, - params=_params, - ) - path_format_arguments = { - "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - _stream = False - pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access - _request, stream=_stream, **kwargs - ) - - response = pipeline_response.http_response - - if response.status_code not in [204]: - map_error(status_code=response.status_code, response=response, error_map=error_map) - raise HttpResponseError(response=response) - - if cls: - return cls(pipeline_response, None, {}) # type: ignore - - @overload - async def create( - self, name: str, body: _models.Index, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.Index: - """Create a new Index. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: The definition of the Index to create. Required. - :type body: ~azure.ai.projects.onedp.models.Index - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: Index. The Index is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.Index - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - async def create( - self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.Index: - """Create a new Index. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: The definition of the Index to create. Required. - :type body: JSON - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: Index. The Index is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.Index - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - async def create( - self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.Index: - """Create a new Index. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: The definition of the Index to create. Required. - :type body: IO[bytes] - :keyword content_type: Body Parameter content-type. Content type parameter for binary body. - Default value is "application/json". - :paramtype content_type: str - :return: Index. The Index is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.Index - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @distributed_trace_async - async def create(self, name: str, body: Union[_models.Index, JSON, IO[bytes]], **kwargs: Any) -> _models.Index: - """Create a new Index. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: The definition of the Index to create. Is one of the following types: Index, JSON, - IO[bytes] Required. - :type body: ~azure.ai.projects.onedp.models.Index or JSON or IO[bytes] - :return: Index. The Index is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.Index + :param version: The version of the Index to delete. Required. + :type version: str + :return: None + :rtype: None :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -2458,24 +2165,15 @@ async def create(self, name: str, body: Union[_models.Index, JSON, IO[bytes]], * } error_map.update(kwargs.pop("error_map", {}) or {}) - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models.Index] = kwargs.pop("cls", None) - - content_type = content_type or "application/json" - _content = None - if isinstance(body, (IOBase, bytes)): - _content = body - else: - _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + cls: ClsType[None] = kwargs.pop("cls", None) - _request = build_indexes_create_request( + _request = build_indexes_delete_version_request( name=name, - content_type=content_type, + version=version, api_version=self._config.api_version, - content=_content, headers=_headers, params=_params, ) @@ -2484,39 +2182,19 @@ async def create(self, name: str, body: Union[_models.Index, JSON, IO[bytes]], * } _request.url = self._client.format_url(_request.url, **path_format_arguments) - _stream = kwargs.pop("stream", False) + _stream = False pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access _request, stream=_stream, **kwargs ) response = pipeline_response.http_response - if response.status_code not in [200]: - if _stream: - try: - await response.read() # Load the body in memory and close the socket - except (StreamConsumedError, StreamClosedError): - pass + if response.status_code not in [204]: map_error(status_code=response.status_code, response=response, error_map=error_map) raise HttpResponseError(response=response) - response_headers = {} - response_headers["Repeatability-Result"] = self._deserialize( - "str", response.headers.get("Repeatability-Result") - ) - response_headers["x-ms-client-request-id"] = self._deserialize( - "str", response.headers.get("x-ms-client-request-id") - ) - - if _stream: - deserialized = response.iter_bytes() - else: - deserialized = _deserialize(_models.Index, response.json()) - if cls: - return cls(pipeline_response, deserialized, response_headers) # type: ignore - - return deserialized # type: ignore + return cls(pipeline_response, None, {}) # type: ignore @overload async def create_version( @@ -3030,24 +2708,59 @@ async def get_next(next_link=None): return AsyncItemPaged(get_next, extract_data) @overload - async def _create_run( + async def create_run( self, red_team: _models.RedTeam, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.RedTeam: ... + ) -> _models.RedTeam: + """Creates a redteam run. + + :param red_team: Redteam to be run. Required. + :type red_team: ~azure.ai.projects.onedp.models.RedTeam + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.RedTeam + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - async def _create_run( + async def create_run( self, red_team: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.RedTeam: ... + ) -> _models.RedTeam: + """Creates a redteam run. + + :param red_team: Redteam to be run. Required. + :type red_team: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.RedTeam + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - async def _create_run( + async def create_run( self, red_team: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.RedTeam: ... + ) -> _models.RedTeam: + """Creates a redteam run. + + :param red_team: Redteam to be run. Required. + :type red_team: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.RedTeam + :raises ~azure.core.exceptions.HttpResponseError: + """ @distributed_trace_async @api_version_validation( method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "content_type", "accept"]}, ) - async def _create_run(self, red_team: Union[_models.RedTeam, JSON, IO[bytes]], **kwargs: Any) -> _models.RedTeam: + async def create_run(self, red_team: Union[_models.RedTeam, JSON, IO[bytes]], **kwargs: Any) -> _models.RedTeam: """Creates a redteam run. :param red_team: Redteam to be run. Is one of the following types: RedTeam, JSON, IO[bytes] @@ -3117,31 +2830,66 @@ async def _create_run(self, red_team: Union[_models.RedTeam, JSON, IO[bytes]], * return deserialized # type: ignore @overload - async def _upload_run( - self, redteam: _models._models.RedTeamUpload, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.RedTeam: ... + async def upload_run( + self, redteam: _models.RedTeamUpload, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.RedTeam: + """Upload the result to a redteam run. + + :param redteam: Redteam to upload. Required. + :type redteam: ~azure.ai.projects.onedp.models.RedTeamUpload + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.RedTeam + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - async def _upload_run( + async def upload_run( self, redteam: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.RedTeam: ... + ) -> _models.RedTeam: + """Upload the result to a redteam run. + + :param redteam: Redteam to upload. Required. + :type redteam: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.RedTeam + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - async def _upload_run( + async def upload_run( self, redteam: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.RedTeam: ... + ) -> _models.RedTeam: + """Upload the result to a redteam run. + + :param redteam: Redteam to upload. Required. + :type redteam: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.RedTeam + :raises ~azure.core.exceptions.HttpResponseError: + """ @distributed_trace_async @api_version_validation( method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "content_type", "accept"]}, ) - async def _upload_run( - self, redteam: Union[_models._models.RedTeamUpload, JSON, IO[bytes]], **kwargs: Any + async def upload_run( + self, redteam: Union[_models.RedTeamUpload, JSON, IO[bytes]], **kwargs: Any ) -> _models.RedTeam: """Upload the result to a redteam run. :param redteam: Redteam to upload. Is one of the following types: RedTeamUpload, JSON, IO[bytes] Required. - :type redteam: ~azure.ai.projects.onedp.models._models.RedTeamUpload or JSON or IO[bytes] + :type redteam: ~azure.ai.projects.onedp.models.RedTeamUpload or JSON or IO[bytes] :return: RedTeam. The RedTeam is compatible with MutableMapping :rtype: ~azure.ai.projects.onedp.models.RedTeam :raises ~azure.core.exceptions.HttpResponseError: @@ -3206,30 +2954,66 @@ async def _upload_run( return deserialized # type: ignore @overload - async def _upload_update_run( - self, - name: str, - redteam: _models._models.RedTeamUpload, - *, - content_type: str = "application/json", - **kwargs: Any - ) -> _models.RedTeam: ... + async def upload_update_run( + self, name: str, redteam: _models.RedTeamUpload, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.RedTeam: + """Update the uploaded the result to an redteam run. + + :param name: Name of the redteam run to update. Required. + :type name: str + :param redteam: Redteam upload to update. Required. + :type redteam: ~azure.ai.projects.onedp.models.RedTeamUpload + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.RedTeam + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - async def _upload_update_run( + async def upload_update_run( self, name: str, redteam: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.RedTeam: ... + ) -> _models.RedTeam: + """Update the uploaded the result to an redteam run. + + :param name: Name of the redteam run to update. Required. + :type name: str + :param redteam: Redteam upload to update. Required. + :type redteam: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.RedTeam + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - async def _upload_update_run( + async def upload_update_run( self, name: str, redteam: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.RedTeam: ... + ) -> _models.RedTeam: + """Update the uploaded the result to an redteam run. + + :param name: Name of the redteam run to update. Required. + :type name: str + :param redteam: Redteam upload to update. Required. + :type redteam: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.RedTeam + :raises ~azure.core.exceptions.HttpResponseError: + """ @distributed_trace_async @api_version_validation( method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "name", "content_type", "accept"]}, ) - async def _upload_update_run( - self, name: str, redteam: Union[_models._models.RedTeamUpload, JSON, IO[bytes]], **kwargs: Any + async def upload_update_run( + self, name: str, redteam: Union[_models.RedTeamUpload, JSON, IO[bytes]], **kwargs: Any ) -> _models.RedTeam: """Update the uploaded the result to an redteam run. @@ -3237,7 +3021,7 @@ async def _upload_update_run( :type name: str :param redteam: Redteam upload to update. Is one of the following types: RedTeamUpload, JSON, IO[bytes] Required. - :type redteam: ~azure.ai.projects.onedp.models._models.RedTeamUpload or JSON or IO[bytes] + :type redteam: ~azure.ai.projects.onedp.models.RedTeamUpload or JSON or IO[bytes] :return: RedTeam. The RedTeam is compatible with MutableMapping :rtype: ~azure.ai.projects.onedp.models.RedTeam :raises ~azure.core.exceptions.HttpResponseError: @@ -3307,7 +3091,7 @@ async def _upload_update_run( method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "type", "accept"]}, ) - async def _get_jail_break_dataset_with_type(self, type: str, **kwargs: Any) -> List[str]: + async def get_jail_break_dataset_with_type(self, type: str, **kwargs: Any) -> List[str]: """Get the jailbreak dataset with type. :param type: Type of jailbreak dataset. Required. @@ -3371,14 +3155,14 @@ async def _get_jail_break_dataset_with_type(self, type: str, **kwargs: Any) -> L method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "risk_types", "lang", "strategy", "accept"]}, ) - async def _get_attack_objectives( + async def get_attack_objectives( self, *, risk_types: Optional[List[str]] = None, lang: Optional[str] = None, strategy: Optional[str] = None, **kwargs: Any - ) -> List[_models._models.AttackObjective]: + ) -> List[_models.AttackObjective]: """Get the attack objectives. :keyword risk_types: Risk types for the attack objectives dataset. Default value is None. @@ -3389,7 +3173,7 @@ async def _get_attack_objectives( :keyword strategy: The strategy. Default value is None. :paramtype strategy: str :return: list of AttackObjective - :rtype: list[~azure.ai.projects.onedp.models._models.AttackObjective] + :rtype: list[~azure.ai.projects.onedp.models.AttackObjective] :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -3403,7 +3187,7 @@ async def _get_attack_objectives( _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[List[_models._models.AttackObjective]] = kwargs.pop("cls", None) + cls: ClsType[List[_models.AttackObjective]] = kwargs.pop("cls", None) _request = build_red_teams_get_attack_objectives_request( risk_types=risk_types, @@ -3437,7 +3221,7 @@ async def _get_attack_objectives( if _stream: deserialized = response.iter_bytes() else: - deserialized = _deserialize(List[_models._models.AttackObjective], response.json()) + deserialized = _deserialize(List[_models.AttackObjective], response.json()) if cls: return cls(pipeline_response, deserialized, {}) # type: ignore @@ -3449,7 +3233,7 @@ async def _get_attack_objectives( method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "accept"]}, ) - async def _get_jail_break_dataset(self, **kwargs: Any) -> List[str]: + async def get_jail_break_dataset(self, **kwargs: Any) -> List[str]: """Get the jailbreak dataset. :return: list of str @@ -3574,7 +3358,7 @@ async def get_template_parameters_with_type(self, type: str, **kwargs: Any) -> s method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "accept"]}, ) - async def _get_template_parameters(self, **kwargs: Any) -> str: + async def get_template_parameters(self, **kwargs: Any) -> str: """Get template parameters. :return: str @@ -3695,33 +3479,68 @@ async def get_template_parameters_image(self, *, path: str, **kwargs: Any) -> st return deserialized # type: ignore @overload - async def _submit_simulation( - self, body: _models._models.SimulationDTO, *, content_type: str = "application/json", **kwargs: Any - ) -> _models._models.LongRunningResponse: ... + async def submit_simulation( + self, body: _models.SimulationDTO, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.LongRunningResponse: + """Submit a request for simulation. + + :param body: Properties of a Prompt Version. Required. + :type body: ~azure.ai.projects.onedp.models.SimulationDTO + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: LongRunningResponse. The LongRunningResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.LongRunningResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - async def _submit_simulation( + async def submit_simulation( self, body: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models._models.LongRunningResponse: ... + ) -> _models.LongRunningResponse: + """Submit a request for simulation. + + :param body: Properties of a Prompt Version. Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: LongRunningResponse. The LongRunningResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.LongRunningResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - async def _submit_simulation( + async def submit_simulation( self, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models._models.LongRunningResponse: ... + ) -> _models.LongRunningResponse: + """Submit a request for simulation. + + :param body: Properties of a Prompt Version. Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: LongRunningResponse. The LongRunningResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.LongRunningResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ @distributed_trace_async @api_version_validation( method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "content_type", "accept"]}, ) - async def _submit_simulation( - self, body: Union[_models._models.SimulationDTO, JSON, IO[bytes]], **kwargs: Any - ) -> _models._models.LongRunningResponse: + async def submit_simulation( + self, body: Union[_models.SimulationDTO, JSON, IO[bytes]], **kwargs: Any + ) -> _models.LongRunningResponse: """Submit a request for simulation. :param body: Properties of a Prompt Version. Is one of the following types: SimulationDTO, JSON, IO[bytes] Required. - :type body: ~azure.ai.projects.onedp.models._models.SimulationDTO or JSON or IO[bytes] + :type body: ~azure.ai.projects.onedp.models.SimulationDTO or JSON or IO[bytes] :return: LongRunningResponse. The LongRunningResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models._models.LongRunningResponse + :rtype: ~azure.ai.projects.onedp.models.LongRunningResponse :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -3736,7 +3555,7 @@ async def _submit_simulation( _params = kwargs.pop("params", {}) or {} content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models._models.LongRunningResponse] = kwargs.pop("cls", None) + cls: ClsType[_models.LongRunningResponse] = kwargs.pop("cls", None) content_type = content_type or "application/json" _content = None @@ -3776,9 +3595,7 @@ async def _submit_simulation( if _stream: deserialized = response.iter_bytes() else: - deserialized = _deserialize( - _models._models.LongRunningResponse, response.json() # pylint: disable=protected-access - ) + deserialized = _deserialize(_models.LongRunningResponse, response.json()) if cls: return cls(pipeline_response, deserialized, {}) # type: ignore @@ -3810,7 +3627,7 @@ def __init__(self, *args, **kwargs) -> None: "2025-05-15-preview": ["api_version", "name", "top", "skip", "tags", "list_view_type", "accept"] }, ) - def _list_versions( + def list_versions( self, name: str, *, @@ -3819,7 +3636,7 @@ def _list_versions( tags: Optional[str] = None, list_view_type: Optional[Union[str, _models.ListViewType]] = None, **kwargs: Any - ) -> AsyncIterable["_models._models.EvaluationResult"]: + ) -> AsyncIterable["_models.EvaluationResult"]: """List all versions of the given EvaluationResult. :param name: The name of the resource. Required. @@ -3838,13 +3655,13 @@ def _list_versions( :paramtype list_view_type: str or ~azure.ai.projects.onedp.models.ListViewType :return: An iterator like instance of EvaluationResult :rtype: - ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.onedp.models._models.EvaluationResult] + ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.onedp.models.EvaluationResult] :raises ~azure.core.exceptions.HttpResponseError: """ _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[List[_models._models.EvaluationResult]] = kwargs.pop("cls", None) + cls: ClsType[List[_models.EvaluationResult]] = kwargs.pop("cls", None) error_map: MutableMapping = { 401: ClientAuthenticationError, @@ -3898,7 +3715,7 @@ def prepare_request(next_link=None): async def extract_data(pipeline_response): deserialized = pipeline_response.http_response.json() - list_of_elem = _deserialize(List[_models._models.EvaluationResult], deserialized.get("value", [])) + list_of_elem = _deserialize(List[_models.EvaluationResult], deserialized.get("value", [])) if cls: list_of_elem = cls(list_of_elem) # type: ignore return deserialized.get("nextLink") or None, AsyncList(list_of_elem) @@ -3925,7 +3742,7 @@ async def get_next(next_link=None): method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "top", "skip", "tags", "list_view_type", "accept"]}, ) - def _list_latest( + def list_latest( self, *, top: Optional[int] = None, @@ -3933,7 +3750,7 @@ def _list_latest( tags: Optional[str] = None, list_view_type: Optional[Union[str, _models.ListViewType]] = None, **kwargs: Any - ) -> AsyncIterable["_models._models.EvaluationResult"]: + ) -> AsyncIterable["_models.EvaluationResult"]: """List the latest version of each EvaluationResult. :keyword top: Top count of results, top count cannot be greater than the page size. If topCount @@ -3950,13 +3767,13 @@ def _list_latest( :paramtype list_view_type: str or ~azure.ai.projects.onedp.models.ListViewType :return: An iterator like instance of EvaluationResult :rtype: - ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.onedp.models._models.EvaluationResult] + ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.onedp.models.EvaluationResult] :raises ~azure.core.exceptions.HttpResponseError: """ _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[List[_models._models.EvaluationResult]] = kwargs.pop("cls", None) + cls: ClsType[List[_models.EvaluationResult]] = kwargs.pop("cls", None) error_map: MutableMapping = { 401: ClientAuthenticationError, @@ -4009,7 +3826,7 @@ def prepare_request(next_link=None): async def extract_data(pipeline_response): deserialized = pipeline_response.http_response.json() - list_of_elem = _deserialize(List[_models._models.EvaluationResult], deserialized.get("value", [])) + list_of_elem = _deserialize(List[_models.EvaluationResult], deserialized.get("value", [])) if cls: list_of_elem = cls(list_of_elem) # type: ignore return deserialized.get("nextLink") or None, AsyncList(list_of_elem) @@ -4036,7 +3853,7 @@ async def get_next(next_link=None): method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "name", "version", "accept"]}, ) - async def _get_version(self, name: str, version: str, **kwargs: Any) -> _models._models.EvaluationResult: + async def get_version(self, name: str, version: str, **kwargs: Any) -> _models.EvaluationResult: """Get the specific version of the EvaluationResult. :param name: The name of the resource. Required. @@ -4044,7 +3861,7 @@ async def _get_version(self, name: str, version: str, **kwargs: Any) -> _models. :param version: The specific version id of the EvaluationResult to retrieve. Required. :type version: str :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models._models.EvaluationResult + :rtype: ~azure.ai.projects.onedp.models.EvaluationResult :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -4058,7 +3875,7 @@ async def _get_version(self, name: str, version: str, **kwargs: Any) -> _models. _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[_models._models.EvaluationResult] = kwargs.pop("cls", None) + cls: ClsType[_models.EvaluationResult] = kwargs.pop("cls", None) _request = build_evaluation_results_get_version_request( name=name, @@ -4072,134 +3889,46 @@ async def _get_version(self, name: str, version: str, **kwargs: Any) -> _models. } _request.url = self._client.format_url(_request.url, **path_format_arguments) - _stream = kwargs.pop("stream", False) - pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access - _request, stream=_stream, **kwargs - ) - - response = pipeline_response.http_response - - if response.status_code not in [200]: - if _stream: - try: - await response.read() # Load the body in memory and close the socket - except (StreamConsumedError, StreamClosedError): - pass - map_error(status_code=response.status_code, response=response, error_map=error_map) - raise HttpResponseError(response=response) - - if _stream: - deserialized = response.iter_bytes() - else: - deserialized = _deserialize( - _models._models.EvaluationResult, response.json() # pylint: disable=protected-access - ) - - if cls: - return cls(pipeline_response, deserialized, {}) # type: ignore - - return deserialized # type: ignore - - @distributed_trace_async - @api_version_validation( - method_added_on="2025-05-15-preview", - params_added_on={"2025-05-15-preview": ["api_version", "name", "version", "accept"]}, - ) - async def _delete_version(self, name: str, version: str, **kwargs: Any) -> None: - """Delete the specific version of the EvaluationResult. - - :param name: The name of the resource. Required. - :type name: str - :param version: The version of the EvaluationResult to delete. Required. - :type version: str - :return: None - :rtype: None - :raises ~azure.core.exceptions.HttpResponseError: - """ - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) - - _headers = kwargs.pop("headers", {}) or {} - _params = kwargs.pop("params", {}) or {} - - cls: ClsType[None] = kwargs.pop("cls", None) - - _request = build_evaluation_results_delete_version_request( - name=name, - version=version, - api_version=self._config.api_version, - headers=_headers, - params=_params, - ) - path_format_arguments = { - "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - _stream = False + _stream = kwargs.pop("stream", False) pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access _request, stream=_stream, **kwargs ) response = pipeline_response.http_response - if response.status_code not in [204]: + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass map_error(status_code=response.status_code, response=response, error_map=error_map) raise HttpResponseError(response=response) + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.EvaluationResult, response.json()) + if cls: - return cls(pipeline_response, None, {}) # type: ignore + return cls(pipeline_response, deserialized, {}) # type: ignore - @overload - async def _create( - self, - name: str, - body: _models._models.EvaluationResult, - *, - content_type: str = "application/json", - **kwargs: Any - ) -> _models._models.EvaluationResult: ... - @overload - async def _create( - self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models._models.EvaluationResult: ... - @overload - async def _create( - self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models._models.EvaluationResult: ... + return deserialized # type: ignore @distributed_trace_async @api_version_validation( method_added_on="2025-05-15-preview", - params_added_on={ - "2025-05-15-preview": [ - "api_version", - "name", - "repeatability_request_id", - "repeatability_first_sent", - "client_request_id", - "content_type", - "accept", - ] - }, + params_added_on={"2025-05-15-preview": ["api_version", "name", "version", "accept"]}, ) - async def _create( - self, name: str, body: Union[_models._models.EvaluationResult, JSON, IO[bytes]], **kwargs: Any - ) -> _models._models.EvaluationResult: - """Create a new EvaluationResult. The version id will be generated by the service. + async def delete_version(self, name: str, version: str, **kwargs: Any) -> None: + """Delete the specific version of the EvaluationResult. :param name: The name of the resource. Required. :type name: str - :param body: The definition of the EvaluationResult to create. Is one of the following types: - EvaluationResult, JSON, IO[bytes] Required. - :type body: ~azure.ai.projects.onedp.models._models.EvaluationResult or JSON or IO[bytes] - :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models._models.EvaluationResult + :param version: The version of the EvaluationResult to delete. Required. + :type version: str + :return: None + :rtype: None :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -4210,24 +3939,15 @@ async def _create( } error_map.update(kwargs.pop("error_map", {}) or {}) - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models._models.EvaluationResult] = kwargs.pop("cls", None) - - content_type = content_type or "application/json" - _content = None - if isinstance(body, (IOBase, bytes)): - _content = body - else: - _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + cls: ClsType[None] = kwargs.pop("cls", None) - _request = build_evaluation_results_create_request( + _request = build_evaluation_results_delete_version_request( name=name, - content_type=content_type, + version=version, api_version=self._config.api_version, - content=_content, headers=_headers, params=_params, ) @@ -4236,69 +3956,94 @@ async def _create( } _request.url = self._client.format_url(_request.url, **path_format_arguments) - _stream = kwargs.pop("stream", False) + _stream = False pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access _request, stream=_stream, **kwargs ) response = pipeline_response.http_response - if response.status_code not in [200]: - if _stream: - try: - await response.read() # Load the body in memory and close the socket - except (StreamConsumedError, StreamClosedError): - pass + if response.status_code not in [204]: map_error(status_code=response.status_code, response=response, error_map=error_map) raise HttpResponseError(response=response) - response_headers = {} - response_headers["Repeatability-Result"] = self._deserialize( - "str", response.headers.get("Repeatability-Result") - ) - response_headers["x-ms-client-request-id"] = self._deserialize( - "str", response.headers.get("x-ms-client-request-id") - ) - - if _stream: - deserialized = response.iter_bytes() - else: - deserialized = _deserialize( - _models._models.EvaluationResult, response.json() # pylint: disable=protected-access - ) - if cls: - return cls(pipeline_response, deserialized, response_headers) # type: ignore - - return deserialized # type: ignore + return cls(pipeline_response, None, {}) # type: ignore @overload - async def _create_version( + async def create_version( self, name: str, version: str, - body: _models._models.EvaluationResult, + body: _models.EvaluationResult, *, content_type: str = "application/json", **kwargs: Any - ) -> _models._models.EvaluationResult: ... + ) -> _models.EvaluationResult: + """Create a new or replace an existing EvaluationResult with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the EvaluationResult to create or replace. Required. + :type version: str + :param body: The definition of the EvaluationResult to create. Required. + :type body: ~azure.ai.projects.onedp.models.EvaluationResult + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.EvaluationResult + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - async def _create_version( + async def create_version( self, name: str, version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models._models.EvaluationResult: ... + ) -> _models.EvaluationResult: + """Create a new or replace an existing EvaluationResult with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the EvaluationResult to create or replace. Required. + :type version: str + :param body: The definition of the EvaluationResult to create. Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.EvaluationResult + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - async def _create_version( + async def create_version( self, name: str, version: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models._models.EvaluationResult: ... + ) -> _models.EvaluationResult: + """Create a new or replace an existing EvaluationResult with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the EvaluationResult to create or replace. Required. + :type version: str + :param body: The definition of the EvaluationResult to create. Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.EvaluationResult + :raises ~azure.core.exceptions.HttpResponseError: + """ @distributed_trace_async @api_version_validation( method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "name", "version", "content_type", "accept"]}, ) - async def _create_version( - self, name: str, version: str, body: Union[_models._models.EvaluationResult, JSON, IO[bytes]], **kwargs: Any - ) -> _models._models.EvaluationResult: + async def create_version( + self, name: str, version: str, body: Union[_models.EvaluationResult, JSON, IO[bytes]], **kwargs: Any + ) -> _models.EvaluationResult: """Create a new or replace an existing EvaluationResult with the given version id. :param name: The name of the resource. Required. @@ -4307,9 +4052,9 @@ async def _create_version( :type version: str :param body: The definition of the EvaluationResult to create. Is one of the following types: EvaluationResult, JSON, IO[bytes] Required. - :type body: ~azure.ai.projects.onedp.models._models.EvaluationResult or JSON or IO[bytes] + :type body: ~azure.ai.projects.onedp.models.EvaluationResult or JSON or IO[bytes] :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models._models.EvaluationResult + :rtype: ~azure.ai.projects.onedp.models.EvaluationResult :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -4324,7 +4069,7 @@ async def _create_version( _params = kwargs.pop("params", {}) or {} content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models._models.EvaluationResult] = kwargs.pop("cls", None) + cls: ClsType[_models.EvaluationResult] = kwargs.pop("cls", None) content_type = content_type or "application/json" _content = None @@ -4366,9 +4111,7 @@ async def _create_version( if _stream: deserialized = response.iter_bytes() else: - deserialized = _deserialize( - _models._models.EvaluationResult, response.json() # pylint: disable=protected-access - ) + deserialized = _deserialize(_models.EvaluationResult, response.json()) if cls: return cls(pipeline_response, deserialized, {}) # type: ignore @@ -4376,7 +4119,7 @@ async def _create_version( return deserialized # type: ignore @overload - async def _start_pending_upload( + async def start_pending_upload( self, name: str, version: str, @@ -4384,22 +4127,69 @@ async def _start_pending_upload( *, content_type: str = "application/json", **kwargs: Any - ) -> _models.PendingUploadResponse: ... + ) -> _models.PendingUploadResponse: + """Create or start a pending upload of a evaluation results for a specific version. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the EvaluationResult to operate on. Required. + :type version: str + :param body: Parameters for the action. Required. + :type body: ~azure.ai.projects.onedp.models.PendingUploadRequest + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - async def _start_pending_upload( + async def start_pending_upload( self, name: str, version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.PendingUploadResponse: ... + ) -> _models.PendingUploadResponse: + """Create or start a pending upload of a evaluation results for a specific version. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the EvaluationResult to operate on. Required. + :type version: str + :param body: Parameters for the action. Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - async def _start_pending_upload( + async def start_pending_upload( self, name: str, version: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.PendingUploadResponse: ... + ) -> _models.PendingUploadResponse: + """Create or start a pending upload of a evaluation results for a specific version. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the EvaluationResult to operate on. Required. + :type version: str + :param body: Parameters for the action. Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ @distributed_trace_async @api_version_validation( method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "name", "version", "content_type", "accept"]}, ) - async def _start_pending_upload( + async def start_pending_upload( self, name: str, version: str, body: Union[_models.PendingUploadRequest, JSON, IO[bytes]], **kwargs: Any ) -> _models.PendingUploadResponse: """Create or start a pending upload of a evaluation results for a specific version. @@ -4477,58 +4267,88 @@ async def _start_pending_upload( return deserialized # type: ignore @overload - async def _fetch_asset_credentials( + async def fetch_asset_credentials( self, name: str, version: str, - asset_credential_request: _models.AssetCredentialRequest, + body: _models.AssetCredentialRequest, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.AssetCredentialResponse: ... + ) -> _models.AssetCredentialResponse: + """Enable downloading json. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the EvaluationResult to operate on. Required. + :type version: str + :param body: Parameters for the action. Required. + :type body: ~azure.ai.projects.onedp.models.AssetCredentialRequest + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: AssetCredentialResponse. The AssetCredentialResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.AssetCredentialResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - async def _fetch_asset_credentials( - self, - name: str, - version: str, - asset_credential_request: JSON, - *, - content_type: str = "application/json", - **kwargs: Any - ) -> _models.AssetCredentialResponse: ... + async def fetch_asset_credentials( + self, name: str, version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.AssetCredentialResponse: + """Enable downloading json. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the EvaluationResult to operate on. Required. + :type version: str + :param body: Parameters for the action. Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: AssetCredentialResponse. The AssetCredentialResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.AssetCredentialResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - async def _fetch_asset_credentials( - self, - name: str, - version: str, - asset_credential_request: IO[bytes], - *, - content_type: str = "application/json", - **kwargs: Any - ) -> _models.AssetCredentialResponse: ... + async def fetch_asset_credentials( + self, name: str, version: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.AssetCredentialResponse: + """Enable downloading json. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the EvaluationResult to operate on. Required. + :type version: str + :param body: Parameters for the action. Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: AssetCredentialResponse. The AssetCredentialResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.AssetCredentialResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ @distributed_trace_async @api_version_validation( method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "name", "version", "content_type", "accept"]}, ) - async def _fetch_asset_credentials( - self, - name: str, - version: str, - asset_credential_request: Union[_models.AssetCredentialRequest, JSON, IO[bytes]], - **kwargs: Any + async def fetch_asset_credentials( + self, name: str, version: str, body: Union[_models.AssetCredentialRequest, JSON, IO[bytes]], **kwargs: Any ) -> _models.AssetCredentialResponse: """Enable downloading json. - :param name: Name of the resource. Required. + :param name: The name of the resource. Required. :type name: str - :param version: Version of the resource. Required. + :param version: The specific version id of the EvaluationResult to operate on. Required. :type version: str - :param asset_credential_request: Input asset to fetch credentials for. Is one of the following - types: AssetCredentialRequest, JSON, IO[bytes] Required. - :type asset_credential_request: ~azure.ai.projects.onedp.models.AssetCredentialRequest or JSON - or IO[bytes] + :param body: Parameters for the action. Is one of the following types: AssetCredentialRequest, + JSON, IO[bytes] Required. + :type body: ~azure.ai.projects.onedp.models.AssetCredentialRequest or JSON or IO[bytes] :return: AssetCredentialResponse. The AssetCredentialResponse is compatible with MutableMapping :rtype: ~azure.ai.projects.onedp.models.AssetCredentialResponse :raises ~azure.core.exceptions.HttpResponseError: @@ -4549,10 +4369,10 @@ async def _fetch_asset_credentials( content_type = content_type or "application/json" _content = None - if isinstance(asset_credential_request, (IOBase, bytes)): - _content = asset_credential_request + if isinstance(body, (IOBase, bytes)): + _content = body else: - _content = json.dumps(asset_credential_request, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore _request = build_evaluation_results_fetch_asset_credentials_request( name=name, diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__init__.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__init__.py index 08b478d508d5..3a4e6a93ff56 100644 --- a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__init__.py +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__init__.py @@ -14,83 +14,129 @@ from ._models import ( # type: ignore + AOAIModelConfig, + AnnotationDTO, + ApiKeyCredentials, AssetCredentialRequest, AssetCredentialResponse, + AttackObjective, AzureAISearchIndex, + BaseCredentials, BlobReferenceForConsumption, Connection, + Content, CosmosDBIndex, + CustomCredential, + CustomizationParameters, DatasetVersion, Deployment, EmbeddingConfiguration, + EntraIDCredentials, Evaluation, + EvaluationResult, + EvaluationTarget, + EvaluationUpload, EvaluatorConfiguration, FileDatasetVersion, FolderDatasetVersion, Index, InputData, InputDataset, + LongRunningResponse, + MAASModelConfig, ManagedAzureAISearchIndex, + Message, + Metadata, ModelDeployment, + NoAuthenticationCredentials, PendingUploadRequest, PendingUploadResponse, RedTeam, + RedTeamUpload, + SASCredentials, SasCredential, + SimulationDTO, Sku, SystemData, + TargetHarm, + TargetModelConfig, ) from ._enums import ( # type: ignore AttackStrategy, - AuthenticationType, ConnectionType, + CredentialType, DatasetType, DeploymentType, IndexType, ListViewType, PendingUploadType, - RepeatabilityResult, + ResultType, RiskCategory, + SimulationType, ) from ._patch import __all__ as _patch_all from ._patch import * from ._patch import patch_sdk as _patch_sdk __all__ = [ + "AOAIModelConfig", + "AnnotationDTO", + "ApiKeyCredentials", "AssetCredentialRequest", "AssetCredentialResponse", + "AttackObjective", "AzureAISearchIndex", + "BaseCredentials", "BlobReferenceForConsumption", "Connection", + "Content", "CosmosDBIndex", + "CustomCredential", + "CustomizationParameters", "DatasetVersion", "Deployment", "EmbeddingConfiguration", + "EntraIDCredentials", "Evaluation", + "EvaluationResult", + "EvaluationTarget", + "EvaluationUpload", "EvaluatorConfiguration", "FileDatasetVersion", "FolderDatasetVersion", "Index", "InputData", "InputDataset", + "LongRunningResponse", + "MAASModelConfig", "ManagedAzureAISearchIndex", + "Message", + "Metadata", "ModelDeployment", + "NoAuthenticationCredentials", "PendingUploadRequest", "PendingUploadResponse", "RedTeam", + "RedTeamUpload", + "SASCredentials", "SasCredential", + "SimulationDTO", "Sku", "SystemData", + "TargetHarm", + "TargetModelConfig", "AttackStrategy", - "AuthenticationType", "ConnectionType", + "CredentialType", "DatasetType", "DeploymentType", "IndexType", "ListViewType", "PendingUploadType", - "RepeatabilityResult", + "ResultType", "RiskCategory", + "SimulationType", ] __all__.extend([p for p in _patch_all if p not in __all__]) # pyright: ignore _patch_sdk() diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__pycache__/__init__.cpython-312.pyc b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__pycache__/__init__.cpython-312.pyc index 02ed908982e9611896b3da2cb8e1124200a59e67..285c631c2e5f2e4c116dc25398a9d17314db2a6d 100644 GIT binary patch delta 387 zcmbQq`;~|HG%qg~0}!N@{7g@r$ScWcGEu#jJ69@7ijg6ODTOs>;(EmhFq18ZDOV** z70hPNVOq-sX0ZcB)uPlH8PXY2I2JKRsidl81%eDj1*xho4E+qrOzA)z%gMk{%TU9R zsxsMtQJztKasZ>Hk@zh!$KvAD66d1Sl+?VE%*33a)WXu#;*wk97~;hR`FX{ule-vu zCu=h8R^$y%EJkR%#T=YndW$Q#vbZEQ*CnweQIlh`5OdSybESJs0lM=RTYPF>X>RdkYZhI;TU_x4i6zMy@rgM(MQW4%SXVI`O#aC#=OV$# z^qm0*@ewRx!U<9WBtC!UQg87DWfo^UgCz5dDksllmSj|%yn}f*Z;>j{kwt1i!cS9sau`bw?=80Y)V$K% z;vyNK;NhVo7pFd}2;ck;Y^#)>X+yKw(B8E^Y=AAD9^#8NZ4! zFe*M|7P!MA`JGLik?A`FF2aZhBnu-xf>>Xr7#OwgFo@n|(Eh}t#Ld*e{=sdsIh!%J O4X2YN$00TrAPE3;`g899 diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__pycache__/_enums.cpython-312.pyc b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__pycache__/_enums.cpython-312.pyc index 7feae6408d2fd0b4873f4dcd99cbcb8119c1fdfa..3ba0fa5fea480a307e75eafbbefc677ee6b131ee 100644 GIT binary patch delta 351 zcmX@8)UC>QnwOW00SMAcex^%EOyrYb%-N_O$f&@?;LeaD)xwY>oywBRn996{bu}wU z9Rov@K&6bP?B*KA628eI>|&E2bEwzz1!v}#<|LM6=I4b}7Nk}QAovO;Kmom5>@KNk ziKRIuw|JdPi%arz15%5M^YapK33?k@z$f0|euG8nhNwz|-whVc8&bL#Sj2Cz=s~oCboprt zPX5dv$yheoLqL|R0Vu)<#KpHK=L?*W{>mW0X!%8rgHeA%@C=m;T8`fsfNZd408RH{ A1ONa4 delta 76 zcmeBHJ*dQYnwOW00SNw>eo0pmo5&}@7_d=2kddWQN>h6C48{^ZWb2rya}$pHlb_v;eS diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__pycache__/_models.cpython-312.pyc b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__pycache__/_models.cpython-312.pyc index e418074be334d96c5f8e66481ef3491750c619bd..204c79cd505169733a970e763af36e0acb85217a 100644 GIT binary patch literal 83167 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 t# delta 12584 zcmbU{33OaXk-z8GT$<5nG&4F!m!*+x$#-n|(rHWBmV>O2wGvC2=zkm8I?SJO96K?i zT;w7|a$`n70!nxbYZ9_11DJ&c?DxWMcaOap{+Axto_au?{bP&8D8TRib+ZS}=Y{cXSN5b@5W<2eh-^?8Vm;#< zOS_pMszmjmamdtTqOxYtG-U2E4_SIFP}hpOLF-UBj}am9oy z0$gztS3?SphSyOKYj5mU?JeDHVz<(^{5M%PMGDo#-LEig0THw>F8ZCfqu}txw{7 zgu4ZB8wfY4F3s8qwT1+RvG({T-{#+=+4xJkUq+r>by&-tZU?_?-Bfc%Ef+w8T!^3u zz!@f&!9Ou=Am~3RQDaOsAj+kD-7V#Ll}J{Nz=uRSSqdJNhxy1~iutHb=henE0cr4n z>_LjTv;i&P_>}FFh1QN?QM$LTuWw*@AlTQp1@Kq(07iuw8y~elx3vx`XH;@M{3EXg z5KsZ|dgYafSOwt3JP|tpcNK{q5ac!dV9u>wE1+^l1(P^>M3RZ;j7AZ-5nAL10I{sT zzWzafAkfzrz*X(_dPlF{MJKmAigjy%&gbFl9Ce}_LhLXG%_v@GN0^#Qq0`cb6Zzi-`=*Su9kLrE1>3^4#le;6i&UJ$FDWz zgvek{xe3KIBWOX;iXdeaoFK`UZ^II4l6!c0;=>!@`9tgGUzRb_5*& z(u`%6cOn)+mk>GCT*2~a!ib2Onob;*rM;40?*Ax%sDKCy9Y<^?mH?E@T?tmtb%XYQN?QcT|3I_Q>Kis@jI~7{RnyiBvh0%pRe8L zdKMZI=Cdxve8BAdGK!vWzVP@~)?7?u*^KQOtpnVluVHH=0kZmfTKAJQQB1pEaq0(g&)bX-*S%)ZF34^?VRDBf=GxRcpB76?pfaCzZjA{L*nx~zX z+rOu$Y)5L%7}B=?AhHf4!0kQHaRhMblOITP1%JMy!1W&B184~F;CV|~OTg^Zf@@o_ zmg26UV_i2$UFZg~TK4SSy=QMIG`U*3e7nP`NG1`h2tZqlJ0|B`hnrdnp zP+-D!9@E@CGBS8wB{q;27w?CTVTTB8Eb`FM`FPMi##x>xa`(s~RRs-o-bPMyOvql# zXFgV5p4_;J6B07b3$gXG+jSTelyLCIrEE%IcFH$x8{iHdpKBY(P1q)75wcP#&Yw0M z9{)bT>6_&TkO;v(#(x<2q2e$fh>Qh$RJ!=#Xy%^H5It8MEB7T8>QgJ8@CoGpB!B?M z^)z31`B;VPX_#BW*O`~1R$z99fq8+iThx*V?$8&IyAcORaq|Yzhh{)ao)$XJWzpJ` zA46&cCvmFhpzt2XA3d)+{<4=gI5zgfU-D;j4dV$v{)sbq&uMcjE&{-!q3@V z*(n^-#_6p{Z?_?}n0-JM$J$OGVV;mZAtR2p8Tz$!W)*1aIufDV2=4(KpX%7v+_pWNm$w%y|&JWAIB|97;4 z5U-v(;0%AEgz5M%pON_TlU9m7YC23sMb#55Q@AcPDAjtu&bqhQ$! zq%m_G(>IK$YDDSa8W=npP_BDM7z&((f&)_EL~$RtKUl;cdDvB}V0>)MnEwo9z@d%V7i=WY9*7pEweCkJ3lnu3zHHj2}31m$C_g+4 zm&xC)YR8s&w+wk4kqDkg#ry^UZP@}iGB$AUm!16mPvnMI)w4pr^Uy&3}G&156mCOC^Gx+lvg1C!OC?TzLxpP`O& z1f%s`n*%7Wss){OMuoI_{JDmXQZfq8WsZlzP>8>)z3Nl9uH*+F-_G}Qhsgwf!hrix z%Hsc2Q_c+GOJ(e&$tD>jyW$YS`^#D7j+_*on5%dKl^|)rFFC<4<-GtJ!yjzdq&(4; zq7&T*i7NbNIV%apD{&Sl^pz#%FC>n)=TUn>svSC2&*{{a)@k7l=-faDGjmG@WopX2 z#Uh18@`QI*Fb^~F=bk8Wg6mQgBbt*XE5GoBBYeJsX+miVB5wu`Do&mp4CK}lxFRSa zM_Rw4S1dl@7E96B#V49Cc`&C2bcM?Jh(;rpKded7h!v3esw@P60(6fF2bj3*VRKLZ zW5T_xr)aO>tKv;hI#d@lk&isdSRT19az_nbO0Ia(Tk&JR+h9?uACcq$WLfy{f46!y z@qqWY6KBVCuzZ`^%oL7-a#Ju#1qd0MrKHwi37(CwKMHh*T+o{f< z`;Kd6q6soRimU+;=1nl7w@k6o0D*}&Z_C{PmqmG?KL8_A3iF4OXch zBmUt2$gWSWQ-zXux)V7GC*CCmjt&O#LK-v4RPMt`#j;2p*mumROb|yEGZQ+lq?ko% zxku4iypgojA;zpqV?v2BOKV6`grbL-H8EX988K5_Pt>P5(MY}ODRj=wa8v12t|~s0{6*w?4#AfY{4Ij7AUJ~nmzN^A5=-P-$*a~vH5r0T z7=pH^haj^Of^I@MzhKMNCnD0+)5WeP$UY__Qt?tE5->ZvfcfSk5^#t1A$KEA99^fc zIOA!XA`(rMqK^^DQ?cpBn$-YtOiSxBP0I;;g#@_@rKPlP!s;pn7^1JA9Fs8zMc^9v z-@tER9u&4pAZ#@=VOs~Aws>A!cH694wM{p=bId(aIjNqi+&Jak7|m~p+BaPlR9ao{ zjE-sDzw*|cHNDn;><#a|qaPYGOgP3ZuWRm|);QlRUomYdc&++&kW!%=-95HpqGfyw zaYDG$dfu$4OSV_)MmxvaC-#o-PPXTV|Gl1h!z=4qX-&=AX-nQ~5A%Uh_cno@&9Et({-z-%a%=-lq+%f-2y9w zJsrkTX|iR?w`HngOSE`v)VXa&k1Y^{i*PhESy(d)ZttXe{N#)YYi7YyI_dbVWyXRv zYoeBoH5^~DcLvweS{rWp> z-kFc4LK_bEkg^j<1@pE@JGRb0)V+*I1gib2$fv(n6wevF%x4-rk*SyLx;e@Ix4u!C zPbr<_$Tr^(X3qE%>Gu}WXGrs0_?Fl9RaC==k$kbL2QKF~GpRn2-&@-a;^yS{?0|?F zZtLpk+upIOEpvJg#H#*Lh3UONeJh^c%gtz$R2D&p!$#Ti1q3?~kWZxPlP4sbq>Qx+ zNj|`VeHUo-GQvkyk@0gmOxY9P6(V2#cDJ?$k5+OrhR0KGne7vuE?bwn8)=omlz}v$ z1(|dsN<^Q~_seX*Kpn5f-WF>a;Bx-C5bSXinr{NMRNv-;RJZnc4&MoDPW2 z{AeZr7+Vmi-c|A6yz+G=fA(WcR`N5!mHhpmc|4hDcUe3}N zf7Qjdc`E+etNAwXl2r^`&Z>AjfT0ey5Z@{>pbgZ^dZyO zStWvM1b8f7=tG`;v&yy$wYVf7^6Z<{xz|xWzTJbnhU^fJQL>PXkWY2)tvX9Dm2dHHxzR)qh0jduOKMW032 zCcFeG**82($IOI`U%Tke!Y!A};L&#FydSuaBGck`OV!^8)XlBYN3?*xcUy#BncNBS4U^d zY-dsVcOl(kg9dOp{~?pf7L}p|?zZ#D-I(apm-+dH4nH(@QYI;#3_%KhN8rDmU0%N! zZ+00wLU39gX}(q(SMFsYa_E1~YK+O#&k5dG)uw+7iQg9Zy1!I7{(xmvVJEEnKVhYo zXLMnIRG8w_M7q$0{mc91w%_8!m*m2L%X#Idl?~jX_vR`)^Es51P17J1liEq+G;J~f zttB1KG#9~D1nDars?gJdfNfWff!DAJ!7J)W=zklT@=k+@e)voNobl4tm(t#8in-_i zCQskTthd-CJ7oIc-3477yvNv5$w<)-X-gfXE%h(J!3uvpIg(kjz{^Vxf9Z2>x0t(t zz=7``r`NMeb*^MT-OCD3w==sIUqkG?@$>G}&oDQAYXLpE<2g*X=%N4ePrt{?Lyklb zseGsCM4>o7dR9prFX3D$JT(Wx6^Nb#Ibva2rqUz1#Ud#m=nCSQN~F<<#c7#Jk62O* zp8F7yKj*TY=gw-_Q!4Mgr<|A}(C;6nD5Gqt@LgGKjrv4hUpS;@&hX1wY;}=5 z0eXp9<$=KA7JpDWI3nXiO|FtU46BW7?Z#NH|HzTSfqr^}>I?Ks!+v>SM0tbw3~54_#Xj#IG)ZI$?`z zF!?oLE4cbZsB@=69nkix1g@_x+`b;l*Za6EqsT50nfVB=%;&mi!;I4Qp|nOE1A25{ zQN~zD8$NY3q+Op>RZKlF93*{(WGxD!Y#gaBgjKYn67f=+Bp-o?H|1^ZG?o_O9u!Ug z6{!)t4=yCo3mcdYoL;TkaHTc;eKTt;Yu+_&DSEADALO=Lm~M2>SoZ`a+qO)3w?y+X zB^CBsSaoZ0_1TY{ZGWS93*^7L$I8b7W7UuMzOLCaqta-dSBydv+X-2_xTL0ZNt>p; zo1*!fqs}eiLl*XExZcWE8=Iyonxe(cQBOEPF z9_QXJX1B8ylq&YZRATyoKR_S9RA5cLw`s5P#mYvg()XQmZTMqe)?MR(

LU3*srD zp;yRwo(aDL-#n`hYr^JIR-qheEY~+Ld_kR_LnW!?z{yWjPwm)K2Y|Fs0%aTWA=r;g z{dQy_MhBclY{@y2o}1{ zBS#0Nt#TQR4E`4a-vcZ+a< zur_w-ELpb_OMCq)Vhvq0v2a`!v(EurI*AF1xgup?V!FQf?)jVPKF^0fl;|)@v#_iz5w6ARjw0uP0Sr|W28Gz921eAx z7DYM)I}_V?jd6D(%qfQL-hPJ@h*oSy`d;4Dq0JC2f=@u~8* z1|rEhWwbErn~ID?()V5I62gNaBScmR874H3HQyrSbsofP$9wue?Z$yhJK6|4F2ZzH zZ!@dbt8K_9BKhzh8S`DCkH3JbBI%BT1z6U1W)GLmd$azs)|nkFZ{3|8E?f8Kk45wP z?a#lq;Z!uVETAx2N=k1OWZ@}E=_{dUv8}GuP%sBYb>FW@hY*^C>Z=e_BN6J40MgDT zqlgcL9;r0bOq89qwX6{maGqqviKm1V8;iyZ<&_;3!R}spS`Wl+W$2lvy9zE%2;uLF u3DF-Hz}64YzOpUoUziuqu7Dz!br5x+xZTjc} zBSShv6mu$5DvKmgK9x0v*#=0bu(U8lu~o8avQ2DiWAVu>F4=sJNrI7WB|{M#1H)ud zrpEePoCS#`$r489Z30UvfpBlk59=@j*q{^R#I7znU`J! za!e5mkhsNMTvBw4KR!M&FE76&u_QA;uQ)y)Y!Ju>h!I5`Ae9_8x%nxjIjMF None: super().__init__(*args, type="AOAI", **kwargs) +class BaseCredentials(_model_base.Model): + """A base class for connection credentials. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + EntraIDCredentials, ApiKeyCredentials, CustomCredential, NoAuthenticationCredentials, + SASCredentials + + :ivar auth_type: The type of credential used by the connection. Required. Known values are: + "ApiKey", "AAD", "SAS", "CustomKeys", and "None". + :vartype auth_type: str or ~azure.ai.projects.onedp.models.CredentialType + """ + + __mapping__: Dict[str, _model_base.Model] = {} + auth_type: str = rest_discriminator(name="authType", visibility=["read"]) + """The type of credential used by the connection. Required. Known values are: \"ApiKey\", \"AAD\", + \"SAS\", \"CustomKeys\", and \"None\".""" + + @overload + def __init__( + self, + *, + auth_type: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class ApiKeyCredentials(BaseCredentials, discriminator="ApiKey"): + """API Key Credential definition. + + :ivar auth_type: The credentail type. Required. API Key credential + :vartype auth_type: str or ~azure.ai.projects.onedp.models.API_KEY + :ivar api_key: API Key. + :vartype api_key: str + """ + + auth_type: Literal[CredentialType.API_KEY] = rest_discriminator(name="authType", visibility=["read"]) # type: ignore + """The credentail type. Required. API Key credential""" + api_key: Optional[str] = rest_field(name="apiKey", visibility=["read"]) + """API Key.""" + + @overload + def __init__( + self, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, auth_type=CredentialType.API_KEY, **kwargs) + + class AssetCredentialRequest(_model_base.Model): """Asset Credential Request. @@ -209,17 +274,17 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: class AssetCredentialResponse(_model_base.Model): - """Asset Credential Response. + """Represents a reference to a blob for consumption. - :ivar blob_reference_for_consumption: Blob Reference for Consumption. Required. + :ivar blob_reference_for_consumption: Credential info to access the storage account. Required. :vartype blob_reference_for_consumption: ~azure.ai.projects.onedp.models.BlobReferenceForConsumption """ blob_reference_for_consumption: "_models.BlobReferenceForConsumption" = rest_field( - name="BlobReferenceForConsumption", visibility=["read", "create", "update", "delete", "query"] + name="blobReferenceForConsumption", visibility=["read", "create", "update", "delete", "query"] ) - """Blob Reference for Consumption. Required.""" + """Credential info to access the storage account. Required.""" @overload def __init__( @@ -245,18 +310,18 @@ class AttackObjective(_model_base.Model): :ivar id: The unique identifier. Required. :vartype id: str :ivar metadata: The metadata. - :vartype metadata: ~azure.ai.projects.onedp.models._models.Metadata + :vartype metadata: ~azure.ai.projects.onedp.models.Metadata :ivar source: List of sources. Required. :vartype source: list[str] :ivar modality: The modality. Required. :vartype modality: str :ivar messages: The messages. Required. - :vartype messages: list[~azure.ai.projects.onedp.models._models.Message] + :vartype messages: list[~azure.ai.projects.onedp.models.Message] """ id: str = rest_field(name="Id", visibility=["read", "create", "update", "delete", "query"]) """The unique identifier. Required.""" - metadata: Optional["_models._models.Metadata"] = rest_field( + metadata: Optional["_models.Metadata"] = rest_field( name="Metadata", visibility=["read", "create", "update", "delete", "query"] ) """The metadata.""" @@ -264,7 +329,7 @@ class AttackObjective(_model_base.Model): """List of sources. Required.""" modality: str = rest_field(name="Modality", visibility=["read", "create", "update", "delete", "query"]) """The modality. Required.""" - messages: List["_models._models.Message"] = rest_field( + messages: List["_models.Message"] = rest_field( name="Messages", visibility=["read", "create", "update", "delete", "query"] ) """The messages. Required.""" @@ -276,8 +341,8 @@ def __init__( id: str, # pylint: disable=redefined-builtin source: List[str], modality: str, - messages: List["_models._models.Message"], - metadata: Optional["_models._models.Metadata"] = None, + messages: List["_models.Message"], + metadata: Optional["_models.Metadata"] = None, ) -> None: ... @overload @@ -448,35 +513,59 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: class Connection(_model_base.Model): - """Response from the listSecrets operation. + """Response from the list and get connections operations. + :ivar auth_type: Discriminator property for Connection. Required. + :vartype auth_type: str :ivar name: The name of the resource. Required. :vartype name: str :ivar type: Category of the connection. Required. Known values are: "AzureOpenAI", "AzureBlob", - "CognitiveSearch", "CosmosDB", "ApiKey", "AppInsights", and "CustomKeys". + "AzureStorageAccount", "CognitiveSearch", "CosmosDB", "ApiKey", "AppConfig", "AppInsights", and + "CustomKeys". :vartype type: str or ~azure.ai.projects.onedp.models.ConnectionType :ivar target: The connection URL to be used for this service. Required. :vartype target: str - :ivar auth_type: The authentication type used by the connection. Required. Known values are: - "ApiKey", "AAD", "SAS", "CustomKeys", and "None". - :vartype auth_type: str or ~azure.ai.projects.onedp.models.AuthenticationType + :ivar is_default: Whether the connection is tagged as the default connection of its type. + Required. + :vartype is_default: bool + :ivar credentials: The credentials used by the connection. Required. + :vartype credentials: ~azure.ai.projects.onedp.models.BaseCredentials :ivar metadata: Metadata of the connection. Required. :vartype metadata: dict[str, str] """ + auth_type: str = rest_discriminator(name="authType") + """Discriminator property for Connection. Required.""" name: str = rest_field(visibility=["read"]) """The name of the resource. Required.""" type: Union[str, "_models.ConnectionType"] = rest_field(visibility=["read"]) """Category of the connection. Required. Known values are: \"AzureOpenAI\", \"AzureBlob\", - \"CognitiveSearch\", \"CosmosDB\", \"ApiKey\", \"AppInsights\", and \"CustomKeys\".""" + \"AzureStorageAccount\", \"CognitiveSearch\", \"CosmosDB\", \"ApiKey\", \"AppConfig\", + \"AppInsights\", and \"CustomKeys\".""" target: str = rest_field(visibility=["read"]) """The connection URL to be used for this service. Required.""" - auth_type: Union[str, "_models.AuthenticationType"] = rest_field(name="authType", visibility=["read"]) - """The authentication type used by the connection. Required. Known values are: \"ApiKey\", - \"AAD\", \"SAS\", \"CustomKeys\", and \"None\".""" + is_default: bool = rest_field(name="isDefault", visibility=["read"]) + """Whether the connection is tagged as the default connection of its type. Required.""" + credentials: "_models.BaseCredentials" = rest_field(visibility=["read"]) + """The credentials used by the connection. Required.""" metadata: Dict[str, str] = rest_field(visibility=["read"]) """Metadata of the connection. Required.""" + @overload + def __init__( + self, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + class Content(_model_base.Model): """Message content. @@ -570,6 +659,32 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, type=IndexType.COSMOS_DB, **kwargs) +class CustomCredential(BaseCredentials, discriminator="CustomKeys"): + """Custom credential defintion. + + :ivar auth_type: The credential type. Required. Custom credential + :vartype auth_type: str or ~azure.ai.projects.onedp.models.CUSTOM + """ + + auth_type: Literal[CredentialType.CUSTOM] = rest_discriminator(name="authType", visibility=["read"]) # type: ignore + """The credential type. Required. Custom credential""" + + @overload + def __init__( + self, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, auth_type=CredentialType.CUSTOM, **kwargs) + + class CustomizationParameters(_model_base.Model): """Customization Parameters. @@ -753,6 +868,32 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) +class EntraIDCredentials(BaseCredentials, discriminator="AAD"): + """Entra ID credential definition. + + :ivar auth_type: The credential type. Required. Entra ID credential (formerly known as AAD) + :vartype auth_type: str or ~azure.ai.projects.onedp.models.ENTRA_ID + """ + + auth_type: Literal[CredentialType.ENTRA_ID] = rest_discriminator(name="authType", visibility=["read"]) # type: ignore + """The credential type. Required. Entra ID credential (formerly known as AAD)""" + + @overload + def __init__( + self, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, auth_type=CredentialType.ENTRA_ID, **kwargs) + + class Evaluation(_model_base.Model): """Evaluation Definition. @@ -761,7 +902,7 @@ class Evaluation(_model_base.Model): :ivar data: Data for evaluation. Required. :vartype data: ~azure.ai.projects.onedp.models.InputData :ivar target: Evaluation target specifying the model config and parameters. - :vartype target: ~azure.ai.projects.onedp.models._models.EvaluationTarget + :vartype target: ~azure.ai.projects.onedp.models.EvaluationTarget :ivar display_name: Display Name for evaluation. It helps to find the evaluation easily in AI Foundry. It does not need to be unique. :vartype display_name: str @@ -791,7 +932,7 @@ class Evaluation(_model_base.Model): """Identifier of the evaluation. Required.""" data: "_models.InputData" = rest_field(visibility=["read", "create", "update", "delete", "query"]) """Data for evaluation. Required.""" - target: Optional["_models._models.EvaluationTarget"] = rest_field(visibility=["read", "create"]) + target: Optional["_models.EvaluationTarget"] = rest_field(visibility=["read", "create"]) """Evaluation target specifying the model config and parameters.""" display_name: Optional[str] = rest_field( name="displayName", visibility=["read", "create", "update", "delete", "query"] @@ -827,7 +968,7 @@ def __init__( *, data: "_models.InputData", evaluators: Dict[str, "_models.EvaluatorConfiguration"], - target: Optional["_models._models.EvaluationTarget"] = None, + target: Optional["_models.EvaluationTarget"] = None, display_name: Optional[str] = None, description: Optional[str] = None, tags: Optional[Dict[str, str]] = None, @@ -867,7 +1008,7 @@ class EvaluationResult(_model_base.Model): :vartype tags: dict[str, str] """ - result_type: Optional[Union[str, "_models._enums.ResultType"]] = rest_field( + result_type: Optional[Union[str, "_models.ResultType"]] = rest_field( name="ResultType", visibility=["read", "create", "update", "delete", "query"] ) """Type of Evaluation result. Known values are: \"Benchmark\", \"Evaluation\", \"Redteam\", and @@ -891,7 +1032,7 @@ class EvaluationResult(_model_base.Model): def __init__( self, *, - result_type: Optional[Union[str, "_models._enums.ResultType"]] = None, + result_type: Optional[Union[str, "_models.ResultType"]] = None, blob_uri: Optional[str] = None, stage: Optional[str] = None, description: Optional[str] = None, @@ -915,14 +1056,14 @@ class EvaluationTarget(_model_base.Model): :ivar system_message: System message related to the evaluation target. Required. :vartype system_message: str :ivar model_config: Model configuration for the evaluation. Required. - :vartype model_config: ~azure.ai.projects.onedp.models._models.TargetModelConfig + :vartype model_config: ~azure.ai.projects.onedp.models.TargetModelConfig :ivar model_params: A dictionary of parameters for the model. :vartype model_params: dict[str, any] """ system_message: str = rest_field(name="systemMessage", visibility=["read", "create", "update", "delete", "query"]) """System message related to the evaluation target. Required.""" - model_config: "_models._models.TargetModelConfig" = rest_field( + model_config: "_models.TargetModelConfig" = rest_field( name="modelConfig", visibility=["read", "create", "update", "delete", "query"] ) """Model configuration for the evaluation. Required.""" @@ -936,7 +1077,7 @@ def __init__( self, *, system_message: str, - model_config: "_models._models.TargetModelConfig", + model_config: "_models.TargetModelConfig", model_params: Optional[Dict[str, Any]] = None, ) -> None: ... @@ -960,7 +1101,7 @@ class EvaluationUpload(_model_base.Model): :ivar data: Data for evaluation. :vartype data: ~azure.ai.projects.onedp.models.InputData :ivar target: Evaluation target specifying the model config and parameters. - :vartype target: ~azure.ai.projects.onedp.models._models.EvaluationTarget + :vartype target: ~azure.ai.projects.onedp.models.EvaluationTarget :ivar display_name: Display Name for evaluation. It helps to find the evaluation easily in AI Foundry. It does not need to be unique. :vartype display_name: str @@ -988,7 +1129,7 @@ class EvaluationUpload(_model_base.Model): """Identifier of the evaluation. Required.""" data: Optional["_models.InputData"] = rest_field(visibility=["read", "create", "update", "delete", "query"]) """Data for evaluation.""" - target: Optional["_models._models.EvaluationTarget"] = rest_field(visibility=["read", "create"]) + target: Optional["_models.EvaluationTarget"] = rest_field(visibility=["read", "create"]) """Evaluation target specifying the model config and parameters.""" display_name: Optional[str] = rest_field( name="displayName", visibility=["read", "create", "update", "delete", "query"] @@ -1020,7 +1161,7 @@ def __init__( self, *, data: Optional["_models.InputData"] = None, - target: Optional["_models._models.EvaluationTarget"] = None, + target: Optional["_models.EvaluationTarget"] = None, display_name: Optional[str] = None, description: Optional[str] = None, status: Optional[str] = None, @@ -1411,12 +1552,12 @@ class Metadata(_model_base.Model): """Metadata. :ivar target_harms: List of target harms. Required. - :vartype target_harms: list[~azure.ai.projects.onedp.models._models.TargetHarm] + :vartype target_harms: list[~azure.ai.projects.onedp.models.TargetHarm] :ivar language: The language. Required. :vartype language: str """ - target_harms: List["_models._models.TargetHarm"] = rest_field( + target_harms: List["_models.TargetHarm"] = rest_field( name="TargetHarms", visibility=["read", "create", "update", "delete", "query"] ) """List of target harms. Required.""" @@ -1427,7 +1568,7 @@ class Metadata(_model_base.Model): def __init__( self, *, - target_harms: List["_models._models.TargetHarm"], + target_harms: List["_models.TargetHarm"], language: str, ) -> None: ... @@ -1494,6 +1635,32 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, type=DeploymentType.MODEL_DEPLOYMENT, **kwargs) +class NoAuthenticationCredentials(BaseCredentials, discriminator="None"): + """Credentials that do not require authentication. + + :ivar auth_type: The credential type. Required. No credential + :vartype auth_type: str or ~azure.ai.projects.onedp.models.NONE + """ + + auth_type: Literal[CredentialType.NONE] = rest_discriminator(name="authType", visibility=["read"]) # type: ignore + """The credential type. Required. No credential""" + + @overload + def __init__( + self, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, auth_type=CredentialType.NONE, **kwargs) + + class PendingUploadRequest(_model_base.Model): """Represents a request for a pending upload. @@ -1813,6 +1980,36 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: self.type: Literal["SAS"] = "SAS" +class SASCredentials(BaseCredentials, discriminator="SAS"): + """Shared Access Signature (SAS) credential definition. + + :ivar auth_type: The credential type. Required. Shared Access Signature (SAS) credential + :vartype auth_type: str or ~azure.ai.projects.onedp.models.SAS + :ivar sas_token: SAS token. + :vartype sas_token: str + """ + + auth_type: Literal[CredentialType.SAS] = rest_discriminator(name="authType", visibility=["read"]) # type: ignore + """The credential type. Required. Shared Access Signature (SAS) credential""" + sas_token: Optional[str] = rest_field(name="sasToken", visibility=["read"]) + """SAS token.""" + + @overload + def __init__( + self, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, auth_type=CredentialType.SAS, **kwargs) + + class SimulationDTO(_model_base.Model): """Customization Parameters. @@ -1823,8 +2020,7 @@ class SimulationDTO(_model_base.Model): :ivar template_parameters: Template parameters. :vartype template_parameters: dict[str, str] :ivar customization_parameters: Customization parameters. - :vartype customization_parameters: - ~azure.ai.projects.onedp.models._models.CustomizationParameters + :vartype customization_parameters: ~azure.ai.projects.onedp.models.CustomizationParameters :ivar json: Json. :vartype json: str :ivar url: Url. @@ -1856,7 +2052,7 @@ class SimulationDTO(_model_base.Model): name="TemplateParameters", visibility=["read", "create", "update", "delete", "query"] ) """Template parameters.""" - customization_parameters: Optional["_models._models.CustomizationParameters"] = rest_field( + customization_parameters: Optional["_models.CustomizationParameters"] = rest_field( name="CustomizationParameters", visibility=["read", "create", "update", "delete", "query"] ) """Customization parameters.""" @@ -1868,7 +2064,7 @@ class SimulationDTO(_model_base.Model): name="TemplateKey", visibility=["read", "create", "update", "delete", "query"] ) """Template key.""" - simulation_type: Optional[Union[str, "_models._enums.SimulationType"]] = rest_field( + simulation_type: Optional[Union[str, "_models.SimulationType"]] = rest_field( name="SimulationType", visibility=["read", "create", "update", "delete", "query"] ) """Type of Simulation. Known values are: \"Default\", \"CustomPersona\", and @@ -1897,11 +2093,11 @@ def __init__( headers: Optional[Dict[str, str]] = None, params: Optional[Dict[str, str]] = None, template_parameters: Optional[Dict[str, str]] = None, - customization_parameters: Optional["_models._models.CustomizationParameters"] = None, + customization_parameters: Optional["_models.CustomizationParameters"] = None, json: Optional[str] = None, url: Optional[str] = None, template_key: Optional[str] = None, - simulation_type: Optional[Union[str, "_models._enums.SimulationType"]] = None, + simulation_type: Optional[Union[str, "_models.SimulationType"]] = None, is_microsoft_tenant: Optional[bool] = None, subscription_id: Optional[str] = None, resource_group_name: Optional[str] = None, diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/operations/__pycache__/__init__.cpython-312.pyc b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/operations/__pycache__/__init__.cpython-312.pyc index 4209b56949240923babb9be2df60a1897cb07314..0833a0b342d809ccc4c874031b639e02327b6ee6 100644 GIT binary patch delta 44 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 literal 0 HcmV?d00001 diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/operations/__pycache__/_patch.cpython-312.pyc b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/operations/__pycache__/_patch.cpython-312.pyc index 1b4710fd2ba95ccc2d13b7e4d57ebfc9b99bb3e6..694dbdc54bdb800a851f8076fc102ca29f5fd131 100644 GIT binary patch delta 20 acmbOcJR_Lb delta 20 acmbOcJR_L HttpRequest: return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) +def build_connections_get_with_credentials_request( # pylint: disable=name-too-long + name: str, **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/connections/{name}/withCredentials" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + def build_connections_list_request( *, connection_type: Optional[Union[str, _models.ConnectionType]] = None, + default_connection: Optional[bool] = None, top: Optional[int] = None, skip: Optional[int] = None, maxpagesize: Optional[int] = None, @@ -94,6 +119,8 @@ def build_connections_list_request( _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") if connection_type is not None: _params["connectionType"] = _SERIALIZER.query("connection_type", connection_type, "str") + if default_connection is not None: + _params["defaultConnection"] = _SERIALIZER.query("default_connection", default_connection, "bool") if top is not None: _params["top"] = _SERIALIZER.query("top", top, "int") if skip is not None: @@ -406,39 +433,6 @@ def build_datasets_delete_version_request(name: str, version: str, **kwargs: Any return HttpRequest(method="DELETE", url=_url, params=_params, headers=_headers, **kwargs) -def build_datasets_create_request(name: str, **kwargs: Any) -> HttpRequest: - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) - _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) - accept = _headers.pop("Accept", "application/json") - - # Construct URL - _url = "/datasets/{name}/versions" - path_format_arguments = { - "name": _SERIALIZER.url("name", name, "str"), - } - - _url: str = _url.format(**path_format_arguments) # type: ignore - - # Construct parameters - _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") - - # Construct headers - if "Repeatability-Request-ID" not in _headers: - _headers["Repeatability-Request-ID"] = str(uuid.uuid4()) - if "Repeatability-First-Sent" not in _headers: - _headers["Repeatability-First-Sent"] = _SERIALIZER.serialize_data( - datetime.datetime.now(datetime.timezone.utc), "rfc-1123" - ) - if content_type is not None: - _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") - _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") - - return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) - - def build_datasets_create_version_request(name: str, version: str, **kwargs: Any) -> HttpRequest: _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) @@ -497,42 +491,11 @@ def build_datasets_start_pending_upload_version_request( # pylint: disable=name return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) -def build_datasets_start_pending_upload_request( # pylint: disable=name-too-long - name: str, **kwargs: Any -) -> HttpRequest: - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) - _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) - accept = _headers.pop("Accept", "application/json") - - # Construct URL - _url = "/datasets/{name}/startPendingUpload" - path_format_arguments = { - "name": _SERIALIZER.url("name", name, "str"), - } - - _url: str = _url.format(**path_format_arguments) # type: ignore - - # Construct parameters - _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") - - # Construct headers - if content_type is not None: - _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") - _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") - - return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) - - -def build_datasets_fetch_asset_credentials_request( # pylint: disable=name-too-long - name: str, version: str, **kwargs: Any -) -> HttpRequest: +def build_datasets_get_credentials_request(name: str, version: str, **kwargs: Any) -> HttpRequest: _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + content_type: str = kwargs.pop("content_type") api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) accept = _headers.pop("Accept", "application/json") @@ -549,8 +512,7 @@ def build_datasets_fetch_asset_credentials_request( # pylint: disable=name-too- _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") # Construct headers - if content_type is not None: - _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) @@ -680,39 +642,6 @@ def build_indexes_delete_version_request(name: str, version: str, **kwargs: Any) return HttpRequest(method="DELETE", url=_url, params=_params, headers=_headers, **kwargs) -def build_indexes_create_request(name: str, **kwargs: Any) -> HttpRequest: - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) - _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) - accept = _headers.pop("Accept", "application/json") - - # Construct URL - _url = "/indexes/{name}/versions" - path_format_arguments = { - "name": _SERIALIZER.url("name", name, "str"), - } - - _url: str = _url.format(**path_format_arguments) # type: ignore - - # Construct parameters - _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") - - # Construct headers - if "Repeatability-Request-ID" not in _headers: - _headers["Repeatability-Request-ID"] = str(uuid.uuid4()) - if "Repeatability-First-Sent" not in _headers: - _headers["Repeatability-First-Sent"] = _SERIALIZER.serialize_data( - datetime.datetime.now(datetime.timezone.utc), "rfc-1123" - ) - if content_type is not None: - _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") - _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") - - return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) - - def build_indexes_create_version_request(name: str, version: str, **kwargs: Any) -> HttpRequest: _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) @@ -1101,7 +1030,7 @@ def build_evaluation_results_list_versions_request( # pylint: disable=name-too- accept = _headers.pop("Accept", "application/json") # Construct URL - _url = "/evaluationResult/{name}/versions" + _url = "/evaluationResults/{name}/versions" path_format_arguments = { "name": _SERIALIZER.url("name", name, "str"), } @@ -1140,7 +1069,7 @@ def build_evaluation_results_list_latest_request( # pylint: disable=name-too-lo accept = _headers.pop("Accept", "application/json") # Construct URL - _url = "/evaluationResult" + _url = "/evaluationResults" # Construct parameters _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") @@ -1169,7 +1098,7 @@ def build_evaluation_results_get_version_request( # pylint: disable=name-too-lo accept = _headers.pop("Accept", "application/json") # Construct URL - _url = "/evaluationResult/{name}/versions/{version}" + _url = "/evaluationResults/{name}/versions/{version}" path_format_arguments = { "name": _SERIALIZER.url("name", name, "str"), "version": _SERIALIZER.url("version", version, "str"), @@ -1196,7 +1125,7 @@ def build_evaluation_results_delete_version_request( # pylint: disable=name-too accept = _headers.pop("Accept", "application/json") # Construct URL - _url = "/evaluationResult/{name}/versions/{version}" + _url = "/evaluationResults/{name}/versions/{version}" path_format_arguments = { "name": _SERIALIZER.url("name", name, "str"), "version": _SERIALIZER.url("version", version, "str"), @@ -1213,39 +1142,6 @@ def build_evaluation_results_delete_version_request( # pylint: disable=name-too return HttpRequest(method="DELETE", url=_url, params=_params, headers=_headers, **kwargs) -def build_evaluation_results_create_request(name: str, **kwargs: Any) -> HttpRequest: - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) - _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) - accept = _headers.pop("Accept", "application/json") - - # Construct URL - _url = "/evaluationResult/{name}/versions" - path_format_arguments = { - "name": _SERIALIZER.url("name", name, "str"), - } - - _url: str = _url.format(**path_format_arguments) # type: ignore - - # Construct parameters - _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") - - # Construct headers - if "Repeatability-Request-ID" not in _headers: - _headers["Repeatability-Request-ID"] = str(uuid.uuid4()) - if "Repeatability-First-Sent" not in _headers: - _headers["Repeatability-First-Sent"] = _SERIALIZER.serialize_data( - datetime.datetime.now(datetime.timezone.utc), "rfc-1123" - ) - if content_type is not None: - _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") - _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") - - return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) - - def build_evaluation_results_create_version_request( # pylint: disable=name-too-long name: str, version: str, **kwargs: Any ) -> HttpRequest: @@ -1257,7 +1153,7 @@ def build_evaluation_results_create_version_request( # pylint: disable=name-too accept = _headers.pop("Accept", "application/json") # Construct URL - _url = "/evaluationResult/{name}/versions/{version}" + _url = "/evaluationResults/{name}/versions/{version}" path_format_arguments = { "name": _SERIALIZER.url("name", name, "str"), "version": _SERIALIZER.url("version", version, "str"), @@ -1287,7 +1183,7 @@ def build_evaluation_results_start_pending_upload_request( # pylint: disable=na accept = _headers.pop("Accept", "application/json") # Construct URL - _url = "/evaluationResult/{name}/versions/{version}/startPendingUpload" + _url = "/evaluationResults/{name}/versions/{version}/startPendingUpload" path_format_arguments = { "name": _SERIALIZER.url("name", name, "str"), "version": _SERIALIZER.url("version", version, "str"), @@ -1317,7 +1213,7 @@ def build_evaluation_results_fetch_asset_credentials_request( # pylint: disable accept = _headers.pop("Accept", "application/json") # Construct URL - _url = "/evaluationResult/{name}/versions/{version}/credentials" + _url = "/evaluationResults/{name}/versions/{version}/fetchAssetCredentials" path_format_arguments = { "name": _SERIALIZER.url("name", name, "str"), "version": _SERIALIZER.url("version", version, "str"), @@ -1377,7 +1273,7 @@ def __init__(self, *args, **kwargs): @distributed_trace def get(self, name: str, **kwargs: Any) -> _models.Connection: - """Get a connection by name. + """Get a connection by name, without populating connection credentials. :param name: The name of the resource. Required. :type name: str @@ -1440,21 +1336,90 @@ def get(self, name: str, **kwargs: Any) -> _models.Connection: return deserialized # type: ignore + @distributed_trace + def get_with_credentials(self, name: str, **kwargs: Any) -> _models.Connection: + """Get a connection by name, with its connection credentials. + + :param name: The name of the resource. Required. + :type name: str + :return: Connection. The Connection is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Connection + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.Connection] = kwargs.pop("cls", None) + + _request = build_connections_get_with_credentials_request( + name=name, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + response_headers = {} + response_headers["x-ms-client-request-id"] = self._deserialize( + "str", response.headers.get("x-ms-client-request-id") + ) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.Connection, response.json()) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + @distributed_trace def list( self, *, connection_type: Optional[Union[str, _models.ConnectionType]] = None, + default_connection: Optional[bool] = None, top: Optional[int] = None, skip: Optional[int] = None, **kwargs: Any ) -> Iterable["_models.Connection"]: - """List all connections in the project. + """List all connections in the project, without populating connection credentials. - :keyword connection_type: Specific type of connection to return in list. Known values are: - "AzureOpenAI", "AzureBlob", "CognitiveSearch", "CosmosDB", "ApiKey", "AppInsights", and - "CustomKeys". Default value is None. + :keyword connection_type: List connections of this specific type. Known values are: + "AzureOpenAI", "AzureBlob", "AzureStorageAccount", "CognitiveSearch", "CosmosDB", "ApiKey", + "AppConfig", "AppInsights", and "CustomKeys". Default value is None. :paramtype connection_type: str or ~azure.ai.projects.onedp.models.ConnectionType + :keyword default_connection: List connections that are default connections. Default value is + None. + :paramtype default_connection: bool :keyword top: The number of result items to return. Default value is None. :paramtype top: int :keyword skip: The number of result items to skip. Default value is None. @@ -1482,6 +1447,7 @@ def prepare_request(next_link=None): _request = build_connections_list_request( connection_type=connection_type, + default_connection=default_connection, top=top, skip=skip, maxpagesize=maxpagesize, @@ -1877,7 +1843,7 @@ def create_run(self, evaluation: Union[_models.Evaluation, JSON, IO[bytes]], **k method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "accept"]}, ) - def _check_annotation(self, **kwargs: Any) -> List[str]: + def check_annotation(self, **kwargs: Any) -> List[str]: """Check annotation supported by the service. :return: list of str @@ -1934,32 +1900,62 @@ def _check_annotation(self, **kwargs: Any) -> List[str]: return deserialized # type: ignore @overload - def _submit_annotation( - self, annotation_dto: _models._models.AnnotationDTO, *, content_type: str = "application/json", **kwargs: Any - ) -> str: ... + def submit_annotation( + self, annotation_dto: _models.AnnotationDTO, *, content_type: str = "application/json", **kwargs: Any + ) -> str: + """Submit the annotation. + + :param annotation_dto: Annotation data inputList of supported annotation. Required. + :type annotation_dto: ~azure.ai.projects.onedp.models.AnnotationDTO + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: str + :rtype: str + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - def _submit_annotation( - self, annotation_dto: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> str: ... + def submit_annotation(self, annotation_dto: JSON, *, content_type: str = "application/json", **kwargs: Any) -> str: + """Submit the annotation. + + :param annotation_dto: Annotation data inputList of supported annotation. Required. + :type annotation_dto: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: str + :rtype: str + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - def _submit_annotation( + def submit_annotation( self, annotation_dto: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> str: ... + ) -> str: + """Submit the annotation. + + :param annotation_dto: Annotation data inputList of supported annotation. Required. + :type annotation_dto: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: str + :rtype: str + :raises ~azure.core.exceptions.HttpResponseError: + """ @distributed_trace @api_version_validation( method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "content_type", "accept"]}, ) - def _submit_annotation( - self, annotation_dto: Union[_models._models.AnnotationDTO, JSON, IO[bytes]], **kwargs: Any - ) -> str: + def submit_annotation(self, annotation_dto: Union[_models.AnnotationDTO, JSON, IO[bytes]], **kwargs: Any) -> str: """Submit the annotation. :param annotation_dto: Annotation data inputList of supported annotation. Is one of the following types: AnnotationDTO, JSON, IO[bytes] Required. - :type annotation_dto: ~azure.ai.projects.onedp.models._models.AnnotationDTO or JSON or - IO[bytes] + :type annotation_dto: ~azure.ai.projects.onedp.models.AnnotationDTO or JSON or IO[bytes] :return: str :rtype: str :raises ~azure.core.exceptions.HttpResponseError: @@ -2024,36 +2020,71 @@ def _submit_annotation( return deserialized # type: ignore @overload - def _upload_run( - self, evaluation: _models._models.EvaluationUpload, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.Evaluation: ... + def upload_run( + self, evaluation: _models.EvaluationUpload, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Evaluation: + """Upload the result to an evaluation run. + + :param evaluation: Evaluation to upload. Required. + :type evaluation: ~azure.ai.projects.onedp.models.EvaluationUpload + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: Evaluation. The Evaluation is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Evaluation + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - def _upload_run( + def upload_run( self, evaluation: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.Evaluation: ... - @overload - def _upload_run( - self, evaluation: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.Evaluation: ... - - @distributed_trace - @api_version_validation( - method_added_on="2025-05-15-preview", - params_added_on={"2025-05-15-preview": ["api_version", "content_type", "accept"]}, - ) - def _upload_run( - self, evaluation: Union[_models._models.EvaluationUpload, JSON, IO[bytes]], **kwargs: Any ) -> _models.Evaluation: """Upload the result to an evaluation run. - :param evaluation: Evaluation to upload. Is one of the following types: EvaluationUpload, JSON, - IO[bytes] Required. - :type evaluation: ~azure.ai.projects.onedp.models._models.EvaluationUpload or JSON or IO[bytes] + :param evaluation: Evaluation to upload. Required. + :type evaluation: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str :return: Evaluation. The Evaluation is compatible with MutableMapping :rtype: ~azure.ai.projects.onedp.models.Evaluation :raises ~azure.core.exceptions.HttpResponseError: """ - error_map: MutableMapping = { + + @overload + def upload_run( + self, evaluation: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Evaluation: + """Upload the result to an evaluation run. + + :param evaluation: Evaluation to upload. Required. + :type evaluation: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: Evaluation. The Evaluation is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Evaluation + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "content_type", "accept"]}, + ) + def upload_run( + self, evaluation: Union[_models.EvaluationUpload, JSON, IO[bytes]], **kwargs: Any + ) -> _models.Evaluation: + """Upload the result to an evaluation run. + + :param evaluation: Evaluation to upload. Is one of the following types: EvaluationUpload, JSON, + IO[bytes] Required. + :type evaluation: ~azure.ai.projects.onedp.models.EvaluationUpload or JSON or IO[bytes] + :return: Evaluation. The Evaluation is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Evaluation + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError, @@ -2113,30 +2144,66 @@ def _upload_run( return deserialized # type: ignore @overload - def _upload_update_run( - self, - name: str, - evaluation: _models._models.EvaluationUpload, - *, - content_type: str = "application/json", - **kwargs: Any - ) -> _models.Evaluation: ... + def upload_update_run( + self, name: str, evaluation: _models.EvaluationUpload, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Evaluation: + """Update the uploaded the result to an evaluation run. + + :param name: Name of the evaluation run to update. Required. + :type name: str + :param evaluation: Evaluation upload to update. Required. + :type evaluation: ~azure.ai.projects.onedp.models.EvaluationUpload + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: Evaluation. The Evaluation is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Evaluation + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - def _upload_update_run( + def upload_update_run( self, name: str, evaluation: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.Evaluation: ... + ) -> _models.Evaluation: + """Update the uploaded the result to an evaluation run. + + :param name: Name of the evaluation run to update. Required. + :type name: str + :param evaluation: Evaluation upload to update. Required. + :type evaluation: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: Evaluation. The Evaluation is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Evaluation + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - def _upload_update_run( + def upload_update_run( self, name: str, evaluation: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.Evaluation: ... + ) -> _models.Evaluation: + """Update the uploaded the result to an evaluation run. + + :param name: Name of the evaluation run to update. Required. + :type name: str + :param evaluation: Evaluation upload to update. Required. + :type evaluation: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: Evaluation. The Evaluation is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Evaluation + :raises ~azure.core.exceptions.HttpResponseError: + """ @distributed_trace @api_version_validation( method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "name", "content_type", "accept"]}, ) - def _upload_update_run( - self, name: str, evaluation: Union[_models._models.EvaluationUpload, JSON, IO[bytes]], **kwargs: Any + def upload_update_run( + self, name: str, evaluation: Union[_models.EvaluationUpload, JSON, IO[bytes]], **kwargs: Any ) -> _models.Evaluation: """Update the uploaded the result to an evaluation run. @@ -2144,7 +2211,7 @@ def _upload_update_run( :type name: str :param evaluation: Evaluation upload to update. Is one of the following types: EvaluationUpload, JSON, IO[bytes] Required. - :type evaluation: ~azure.ai.projects.onedp.models._models.EvaluationUpload or JSON or IO[bytes] + :type evaluation: ~azure.ai.projects.onedp.models.EvaluationUpload or JSON or IO[bytes] :return: Evaluation. The Evaluation is compatible with MutableMapping :rtype: ~azure.ai.projects.onedp.models.Evaluation :raises ~azure.core.exceptions.HttpResponseError: @@ -2559,143 +2626,6 @@ def delete_version( # pylint: disable=inconsistent-return-statements if cls: return cls(pipeline_response, None, {}) # type: ignore - @overload - def create( - self, name: str, body: _models.DatasetVersion, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.DatasetVersion: - """Create a new DatasetVersion. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: The definition of the DatasetVersion to create. Required. - :type body: ~azure.ai.projects.onedp.models.DatasetVersion - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.DatasetVersion - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - def create( - self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.DatasetVersion: - """Create a new DatasetVersion. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: The definition of the DatasetVersion to create. Required. - :type body: JSON - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.DatasetVersion - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - def create( - self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.DatasetVersion: - """Create a new DatasetVersion. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: The definition of the DatasetVersion to create. Required. - :type body: IO[bytes] - :keyword content_type: Body Parameter content-type. Content type parameter for binary body. - Default value is "application/json". - :paramtype content_type: str - :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.DatasetVersion - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @distributed_trace - def create( - self, name: str, body: Union[_models.DatasetVersion, JSON, IO[bytes]], **kwargs: Any - ) -> _models.DatasetVersion: - """Create a new DatasetVersion. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: The definition of the DatasetVersion to create. Is one of the following types: - DatasetVersion, JSON, IO[bytes] Required. - :type body: ~azure.ai.projects.onedp.models.DatasetVersion or JSON or IO[bytes] - :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.DatasetVersion - :raises ~azure.core.exceptions.HttpResponseError: - """ - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) - - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) - _params = kwargs.pop("params", {}) or {} - - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models.DatasetVersion] = kwargs.pop("cls", None) - - content_type = content_type or "application/json" - _content = None - if isinstance(body, (IOBase, bytes)): - _content = body - else: - _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore - - _request = build_datasets_create_request( - name=name, - content_type=content_type, - api_version=self._config.api_version, - content=_content, - headers=_headers, - params=_params, - ) - path_format_arguments = { - "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - _stream = kwargs.pop("stream", False) - pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access - _request, stream=_stream, **kwargs - ) - - response = pipeline_response.http_response - - if response.status_code not in [200]: - if _stream: - try: - response.read() # Load the body in memory and close the socket - except (StreamConsumedError, StreamClosedError): - pass - map_error(status_code=response.status_code, response=response, error_map=error_map) - raise HttpResponseError(response=response) - - response_headers = {} - response_headers["Repeatability-Result"] = self._deserialize( - "str", response.headers.get("Repeatability-Result") - ) - response_headers["x-ms-client-request-id"] = self._deserialize( - "str", response.headers.get("x-ms-client-request-id") - ) - - if _stream: - deserialized = response.iter_bytes() - else: - deserialized = _deserialize(_models.DatasetVersion, response.json()) - - if cls: - return cls(pipeline_response, deserialized, response_headers) # type: ignore - - return deserialized # type: ignore - @overload def create_version( self, @@ -2850,7 +2780,7 @@ def start_pending_upload_version( content_type: str = "application/json", **kwargs: Any ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a dataset for a specific version. + """Start a new or get an existing pending upload of a dataset for a specific version. :param name: The name of the resource. Required. :type name: str @@ -2870,7 +2800,7 @@ def start_pending_upload_version( def start_pending_upload_version( self, name: str, version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a dataset for a specific version. + """Start a new or get an existing pending upload of a dataset for a specific version. :param name: The name of the resource. Required. :type name: str @@ -2890,7 +2820,7 @@ def start_pending_upload_version( def start_pending_upload_version( self, name: str, version: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a dataset for a specific version. + """Start a new or get an existing pending upload of a dataset for a specific version. :param name: The name of the resource. Required. :type name: str @@ -2910,7 +2840,7 @@ def start_pending_upload_version( def start_pending_upload_version( self, name: str, version: str, body: Union[_models.PendingUploadRequest, JSON, IO[bytes]], **kwargs: Any ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a dataset for a specific version. + """Start a new or get an existing pending upload of a dataset for a specific version. :param name: The name of the resource. Required. :type name: str @@ -2984,261 +2914,37 @@ def start_pending_upload_version( return deserialized # type: ignore - @overload - def start_pending_upload( - self, name: str, body: _models.PendingUploadRequest, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a dataset. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: Parameters for the action. Required. - :type body: ~azure.ai.projects.onedp.models.PendingUploadRequest - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - def start_pending_upload( - self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a dataset. The version id will be generated by the service. + @distributed_trace + def get_credentials(self, name: str, version: str, body: Any, **kwargs: Any) -> _models.AssetCredentialResponse: + """Get download sas for dataset version. :param name: The name of the resource. Required. :type name: str + :param version: The specific version id of the DatasetVersion to operate on. Required. + :type version: str :param body: Parameters for the action. Required. - :type body: JSON - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse + :type body: any + :return: AssetCredentialResponse. The AssetCredentialResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.AssetCredentialResponse :raises ~azure.core.exceptions.HttpResponseError: """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) - @overload - def start_pending_upload( - self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a dataset. The version id will be generated by the service. + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} - :param name: The name of the resource. Required. - :type name: str - :param body: Parameters for the action. Required. - :type body: IO[bytes] - :keyword content_type: Body Parameter content-type. Content type parameter for binary body. - Default value is "application/json". - :paramtype content_type: str - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse - :raises ~azure.core.exceptions.HttpResponseError: - """ + content_type: str = kwargs.pop("content_type", _headers.pop("Content-Type", "application/json")) + cls: ClsType[_models.AssetCredentialResponse] = kwargs.pop("cls", None) - @distributed_trace - def start_pending_upload( - self, name: str, body: Union[_models.PendingUploadRequest, JSON, IO[bytes]], **kwargs: Any - ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a dataset. The version id will be generated by the service. + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore - :param name: The name of the resource. Required. - :type name: str - :param body: Parameters for the action. Is one of the following types: PendingUploadRequest, - JSON, IO[bytes] Required. - :type body: ~azure.ai.projects.onedp.models.PendingUploadRequest or JSON or IO[bytes] - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse - :raises ~azure.core.exceptions.HttpResponseError: - """ - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) - - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) - _params = kwargs.pop("params", {}) or {} - - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models.PendingUploadResponse] = kwargs.pop("cls", None) - - content_type = content_type or "application/json" - _content = None - if isinstance(body, (IOBase, bytes)): - _content = body - else: - _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore - - _request = build_datasets_start_pending_upload_request( - name=name, - content_type=content_type, - api_version=self._config.api_version, - content=_content, - headers=_headers, - params=_params, - ) - path_format_arguments = { - "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - _stream = kwargs.pop("stream", False) - pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access - _request, stream=_stream, **kwargs - ) - - response = pipeline_response.http_response - - if response.status_code not in [200]: - if _stream: - try: - response.read() # Load the body in memory and close the socket - except (StreamConsumedError, StreamClosedError): - pass - map_error(status_code=response.status_code, response=response, error_map=error_map) - raise HttpResponseError(response=response) - - if _stream: - deserialized = response.iter_bytes() - else: - deserialized = _deserialize(_models.PendingUploadResponse, response.json()) - - if cls: - return cls(pipeline_response, deserialized, {}) # type: ignore - - return deserialized # type: ignore - - @overload - def fetch_asset_credentials( - self, - name: str, - version: str, - asset_credential_request: _models.AssetCredentialRequest, - *, - content_type: str = "application/json", - **kwargs: Any - ) -> _models.AssetCredentialResponse: - """Enable downloading json. - - :param name: Name of the resource. Required. - :type name: str - :param version: Version of the resource. Required. - :type version: str - :param asset_credential_request: Input asset to fetch credentials for. Required. - :type asset_credential_request: ~azure.ai.projects.onedp.models.AssetCredentialRequest - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: AssetCredentialResponse. The AssetCredentialResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.AssetCredentialResponse - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - def fetch_asset_credentials( - self, - name: str, - version: str, - asset_credential_request: JSON, - *, - content_type: str = "application/json", - **kwargs: Any - ) -> _models.AssetCredentialResponse: - """Enable downloading json. - - :param name: Name of the resource. Required. - :type name: str - :param version: Version of the resource. Required. - :type version: str - :param asset_credential_request: Input asset to fetch credentials for. Required. - :type asset_credential_request: JSON - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: AssetCredentialResponse. The AssetCredentialResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.AssetCredentialResponse - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - def fetch_asset_credentials( - self, - name: str, - version: str, - asset_credential_request: IO[bytes], - *, - content_type: str = "application/json", - **kwargs: Any - ) -> _models.AssetCredentialResponse: - """Enable downloading json. - - :param name: Name of the resource. Required. - :type name: str - :param version: Version of the resource. Required. - :type version: str - :param asset_credential_request: Input asset to fetch credentials for. Required. - :type asset_credential_request: IO[bytes] - :keyword content_type: Body Parameter content-type. Content type parameter for binary body. - Default value is "application/json". - :paramtype content_type: str - :return: AssetCredentialResponse. The AssetCredentialResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.AssetCredentialResponse - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @distributed_trace - @api_version_validation( - method_added_on="2025-05-15-preview", - params_added_on={"2025-05-15-preview": ["api_version", "name", "version", "content_type", "accept"]}, - ) - def fetch_asset_credentials( - self, - name: str, - version: str, - asset_credential_request: Union[_models.AssetCredentialRequest, JSON, IO[bytes]], - **kwargs: Any - ) -> _models.AssetCredentialResponse: - """Enable downloading json. - - :param name: Name of the resource. Required. - :type name: str - :param version: Version of the resource. Required. - :type version: str - :param asset_credential_request: Input asset to fetch credentials for. Is one of the following - types: AssetCredentialRequest, JSON, IO[bytes] Required. - :type asset_credential_request: ~azure.ai.projects.onedp.models.AssetCredentialRequest or JSON - or IO[bytes] - :return: AssetCredentialResponse. The AssetCredentialResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.AssetCredentialResponse - :raises ~azure.core.exceptions.HttpResponseError: - """ - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) - - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) - _params = kwargs.pop("params", {}) or {} - - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models.AssetCredentialResponse] = kwargs.pop("cls", None) - - content_type = content_type or "application/json" - _content = None - if isinstance(asset_credential_request, (IOBase, bytes)): - _content = asset_credential_request - else: - _content = json.dumps(asset_credential_request, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore - - _request = build_datasets_fetch_asset_credentials_request( + _request = build_datasets_get_credentials_request( name=name, version=version, content_type=content_type, @@ -3629,13 +3335,15 @@ def delete_version( # pylint: disable=inconsistent-return-statements return cls(pipeline_response, None, {}) # type: ignore @overload - def create( - self, name: str, body: _models.Index, *, content_type: str = "application/json", **kwargs: Any + def create_version( + self, name: str, version: str, body: _models.Index, *, content_type: str = "application/json", **kwargs: Any ) -> _models.Index: - """Create a new Index. The version id will be generated by the service. + """Create a new or replace an existing Index with the given version id. :param name: The name of the resource. Required. :type name: str + :param version: The specific version id of the Index to create or replace. Required. + :type version: str :param body: The definition of the Index to create. Required. :type body: ~azure.ai.projects.onedp.models.Index :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. @@ -3647,11 +3355,15 @@ def create( """ @overload - def create(self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any) -> _models.Index: - """Create a new Index. The version id will be generated by the service. + def create_version( + self, name: str, version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Index: + """Create a new or replace an existing Index with the given version id. :param name: The name of the resource. Required. :type name: str + :param version: The specific version id of the Index to create or replace. Required. + :type version: str :param body: The definition of the Index to create. Required. :type body: JSON :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. @@ -3663,13 +3375,15 @@ def create(self, name: str, body: JSON, *, content_type: str = "application/json """ @overload - def create( - self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + def create_version( + self, name: str, version: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any ) -> _models.Index: - """Create a new Index. The version id will be generated by the service. + """Create a new or replace an existing Index with the given version id. :param name: The name of the resource. Required. :type name: str + :param version: The specific version id of the Index to create or replace. Required. + :type version: str :param body: The definition of the Index to create. Required. :type body: IO[bytes] :keyword content_type: Body Parameter content-type. Content type parameter for binary body. @@ -3681,11 +3395,15 @@ def create( """ @distributed_trace - def create(self, name: str, body: Union[_models.Index, JSON, IO[bytes]], **kwargs: Any) -> _models.Index: - """Create a new Index. The version id will be generated by the service. + def create_version( + self, name: str, version: str, body: Union[_models.Index, JSON, IO[bytes]], **kwargs: Any + ) -> _models.Index: + """Create a new or replace an existing Index with the given version id. :param name: The name of the resource. Required. :type name: str + :param version: The specific version id of the Index to create or replace. Required. + :type version: str :param body: The definition of the Index to create. Is one of the following types: Index, JSON, IO[bytes] Required. :type body: ~azure.ai.projects.onedp.models.Index or JSON or IO[bytes] @@ -3714,8 +3432,9 @@ def create(self, name: str, body: Union[_models.Index, JSON, IO[bytes]], **kwarg else: _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore - _request = build_indexes_create_request( + _request = build_indexes_create_version_request( name=name, + version=version, content_type=content_type, api_version=self._config.api_version, content=_content, @@ -3734,7 +3453,7 @@ def create(self, name: str, body: Union[_models.Index, JSON, IO[bytes]], **kwarg response = pipeline_response.http_response - if response.status_code not in [200]: + if response.status_code not in [200, 201]: if _stream: try: response.read() # Load the body in memory and close the socket @@ -3743,188 +3462,42 @@ def create(self, name: str, body: Union[_models.Index, JSON, IO[bytes]], **kwarg map_error(status_code=response.status_code, response=response, error_map=error_map) raise HttpResponseError(response=response) - response_headers = {} - response_headers["Repeatability-Result"] = self._deserialize( - "str", response.headers.get("Repeatability-Result") - ) - response_headers["x-ms-client-request-id"] = self._deserialize( - "str", response.headers.get("x-ms-client-request-id") - ) - if _stream: deserialized = response.iter_bytes() else: deserialized = _deserialize(_models.Index, response.json()) if cls: - return cls(pipeline_response, deserialized, response_headers) # type: ignore + return cls(pipeline_response, deserialized, {}) # type: ignore return deserialized # type: ignore - @overload - def create_version( - self, name: str, version: str, body: _models.Index, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.Index: - """Create a new or replace an existing Index with the given version id. - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the Index to create or replace. Required. - :type version: str - :param body: The definition of the Index to create. Required. - :type body: ~azure.ai.projects.onedp.models.Index - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: Index. The Index is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.Index - :raises ~azure.core.exceptions.HttpResponseError: - """ +class DeploymentsOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. - @overload - def create_version( - self, name: str, version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.Index: - """Create a new or replace an existing Index with the given version id. + Instead, you should access the following operations through + :class:`~azure.ai.projects.onedp.AIProjectClient`'s + :attr:`deployments` attribute. + """ - :param name: The name of the resource. Required. + def __init__(self, *args, **kwargs): + input_args = list(args) + self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + + @distributed_trace + def get(self, name: str, **kwargs: Any) -> _models.Deployment: + """Get a deployed model. + + :param name: Name of the deployment. Required. :type name: str - :param version: The specific version id of the Index to create or replace. Required. - :type version: str - :param body: The definition of the Index to create. Required. - :type body: JSON - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: Index. The Index is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.Index - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - def create_version( - self, name: str, version: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.Index: - """Create a new or replace an existing Index with the given version id. - - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the Index to create or replace. Required. - :type version: str - :param body: The definition of the Index to create. Required. - :type body: IO[bytes] - :keyword content_type: Body Parameter content-type. Content type parameter for binary body. - Default value is "application/json". - :paramtype content_type: str - :return: Index. The Index is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.Index - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @distributed_trace - def create_version( - self, name: str, version: str, body: Union[_models.Index, JSON, IO[bytes]], **kwargs: Any - ) -> _models.Index: - """Create a new or replace an existing Index with the given version id. - - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the Index to create or replace. Required. - :type version: str - :param body: The definition of the Index to create. Is one of the following types: Index, JSON, - IO[bytes] Required. - :type body: ~azure.ai.projects.onedp.models.Index or JSON or IO[bytes] - :return: Index. The Index is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.Index - :raises ~azure.core.exceptions.HttpResponseError: - """ - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) - - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) - _params = kwargs.pop("params", {}) or {} - - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models.Index] = kwargs.pop("cls", None) - - content_type = content_type or "application/json" - _content = None - if isinstance(body, (IOBase, bytes)): - _content = body - else: - _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore - - _request = build_indexes_create_version_request( - name=name, - version=version, - content_type=content_type, - api_version=self._config.api_version, - content=_content, - headers=_headers, - params=_params, - ) - path_format_arguments = { - "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - _stream = kwargs.pop("stream", False) - pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access - _request, stream=_stream, **kwargs - ) - - response = pipeline_response.http_response - - if response.status_code not in [200, 201]: - if _stream: - try: - response.read() # Load the body in memory and close the socket - except (StreamConsumedError, StreamClosedError): - pass - map_error(status_code=response.status_code, response=response, error_map=error_map) - raise HttpResponseError(response=response) - - if _stream: - deserialized = response.iter_bytes() - else: - deserialized = _deserialize(_models.Index, response.json()) - - if cls: - return cls(pipeline_response, deserialized, {}) # type: ignore - - return deserialized # type: ignore - - -class DeploymentsOperations: - """ - .. warning:: - **DO NOT** instantiate this class directly. - - Instead, you should access the following operations through - :class:`~azure.ai.projects.onedp.AIProjectClient`'s - :attr:`deployments` attribute. - """ - - def __init__(self, *args, **kwargs): - input_args = list(args) - self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") - self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") - self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") - self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") - - @distributed_trace - def get(self, name: str, **kwargs: Any) -> _models.Deployment: - """Get a deployed model. - - :param name: Name of the deployment. Required. - :type name: str - :return: Deployment. The Deployment is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.Deployment + :return: Deployment. The Deployment is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Deployment :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -4273,24 +3846,57 @@ def get_next(next_link=None): return ItemPaged(get_next, extract_data) @overload - def _create_run( + def create_run( self, red_team: _models.RedTeam, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.RedTeam: ... + ) -> _models.RedTeam: + """Creates a redteam run. + + :param red_team: Redteam to be run. Required. + :type red_team: ~azure.ai.projects.onedp.models.RedTeam + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.RedTeam + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - def _create_run( - self, red_team: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.RedTeam: ... + def create_run(self, red_team: JSON, *, content_type: str = "application/json", **kwargs: Any) -> _models.RedTeam: + """Creates a redteam run. + + :param red_team: Redteam to be run. Required. + :type red_team: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.RedTeam + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - def _create_run( + def create_run( self, red_team: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.RedTeam: ... + ) -> _models.RedTeam: + """Creates a redteam run. + + :param red_team: Redteam to be run. Required. + :type red_team: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.RedTeam + :raises ~azure.core.exceptions.HttpResponseError: + """ @distributed_trace @api_version_validation( method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "content_type", "accept"]}, ) - def _create_run(self, red_team: Union[_models.RedTeam, JSON, IO[bytes]], **kwargs: Any) -> _models.RedTeam: + def create_run(self, red_team: Union[_models.RedTeam, JSON, IO[bytes]], **kwargs: Any) -> _models.RedTeam: """Creates a redteam run. :param red_team: Redteam to be run. Is one of the following types: RedTeam, JSON, IO[bytes] @@ -4360,31 +3966,62 @@ def _create_run(self, red_team: Union[_models.RedTeam, JSON, IO[bytes]], **kwarg return deserialized # type: ignore @overload - def _upload_run( - self, redteam: _models._models.RedTeamUpload, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.RedTeam: ... + def upload_run( + self, redteam: _models.RedTeamUpload, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.RedTeam: + """Upload the result to a redteam run. + + :param redteam: Redteam to upload. Required. + :type redteam: ~azure.ai.projects.onedp.models.RedTeamUpload + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.RedTeam + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - def _upload_run( - self, redteam: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.RedTeam: ... + def upload_run(self, redteam: JSON, *, content_type: str = "application/json", **kwargs: Any) -> _models.RedTeam: + """Upload the result to a redteam run. + + :param redteam: Redteam to upload. Required. + :type redteam: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.RedTeam + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - def _upload_run( + def upload_run( self, redteam: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.RedTeam: ... + ) -> _models.RedTeam: + """Upload the result to a redteam run. + + :param redteam: Redteam to upload. Required. + :type redteam: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.RedTeam + :raises ~azure.core.exceptions.HttpResponseError: + """ @distributed_trace @api_version_validation( method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "content_type", "accept"]}, ) - def _upload_run( - self, redteam: Union[_models._models.RedTeamUpload, JSON, IO[bytes]], **kwargs: Any - ) -> _models.RedTeam: + def upload_run(self, redteam: Union[_models.RedTeamUpload, JSON, IO[bytes]], **kwargs: Any) -> _models.RedTeam: """Upload the result to a redteam run. :param redteam: Redteam to upload. Is one of the following types: RedTeamUpload, JSON, IO[bytes] Required. - :type redteam: ~azure.ai.projects.onedp.models._models.RedTeamUpload or JSON or IO[bytes] + :type redteam: ~azure.ai.projects.onedp.models.RedTeamUpload or JSON or IO[bytes] :return: RedTeam. The RedTeam is compatible with MutableMapping :rtype: ~azure.ai.projects.onedp.models.RedTeam :raises ~azure.core.exceptions.HttpResponseError: @@ -4449,30 +4086,66 @@ def _upload_run( return deserialized # type: ignore @overload - def _upload_update_run( - self, - name: str, - redteam: _models._models.RedTeamUpload, - *, - content_type: str = "application/json", - **kwargs: Any - ) -> _models.RedTeam: ... + def upload_update_run( + self, name: str, redteam: _models.RedTeamUpload, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.RedTeam: + """Update the uploaded the result to an redteam run. + + :param name: Name of the redteam run to update. Required. + :type name: str + :param redteam: Redteam upload to update. Required. + :type redteam: ~azure.ai.projects.onedp.models.RedTeamUpload + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.RedTeam + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - def _upload_update_run( + def upload_update_run( self, name: str, redteam: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.RedTeam: ... + ) -> _models.RedTeam: + """Update the uploaded the result to an redteam run. + + :param name: Name of the redteam run to update. Required. + :type name: str + :param redteam: Redteam upload to update. Required. + :type redteam: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.RedTeam + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - def _upload_update_run( + def upload_update_run( self, name: str, redteam: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.RedTeam: ... + ) -> _models.RedTeam: + """Update the uploaded the result to an redteam run. + + :param name: Name of the redteam run to update. Required. + :type name: str + :param redteam: Redteam upload to update. Required. + :type redteam: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: RedTeam. The RedTeam is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.RedTeam + :raises ~azure.core.exceptions.HttpResponseError: + """ @distributed_trace @api_version_validation( method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "name", "content_type", "accept"]}, ) - def _upload_update_run( - self, name: str, redteam: Union[_models._models.RedTeamUpload, JSON, IO[bytes]], **kwargs: Any + def upload_update_run( + self, name: str, redteam: Union[_models.RedTeamUpload, JSON, IO[bytes]], **kwargs: Any ) -> _models.RedTeam: """Update the uploaded the result to an redteam run. @@ -4480,7 +4153,7 @@ def _upload_update_run( :type name: str :param redteam: Redteam upload to update. Is one of the following types: RedTeamUpload, JSON, IO[bytes] Required. - :type redteam: ~azure.ai.projects.onedp.models._models.RedTeamUpload or JSON or IO[bytes] + :type redteam: ~azure.ai.projects.onedp.models.RedTeamUpload or JSON or IO[bytes] :return: RedTeam. The RedTeam is compatible with MutableMapping :rtype: ~azure.ai.projects.onedp.models.RedTeam :raises ~azure.core.exceptions.HttpResponseError: @@ -4550,7 +4223,7 @@ def _upload_update_run( method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "type", "accept"]}, ) - def _get_jail_break_dataset_with_type(self, type: str, **kwargs: Any) -> List[str]: + def get_jail_break_dataset_with_type(self, type: str, **kwargs: Any) -> List[str]: """Get the jailbreak dataset with type. :param type: Type of jailbreak dataset. Required. @@ -4614,14 +4287,14 @@ def _get_jail_break_dataset_with_type(self, type: str, **kwargs: Any) -> List[st method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "risk_types", "lang", "strategy", "accept"]}, ) - def _get_attack_objectives( + def get_attack_objectives( self, *, risk_types: Optional[List[str]] = None, lang: Optional[str] = None, strategy: Optional[str] = None, **kwargs: Any - ) -> List[_models._models.AttackObjective]: + ) -> List[_models.AttackObjective]: """Get the attack objectives. :keyword risk_types: Risk types for the attack objectives dataset. Default value is None. @@ -4632,7 +4305,7 @@ def _get_attack_objectives( :keyword strategy: The strategy. Default value is None. :paramtype strategy: str :return: list of AttackObjective - :rtype: list[~azure.ai.projects.onedp.models._models.AttackObjective] + :rtype: list[~azure.ai.projects.onedp.models.AttackObjective] :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -4646,7 +4319,7 @@ def _get_attack_objectives( _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[List[_models._models.AttackObjective]] = kwargs.pop("cls", None) + cls: ClsType[List[_models.AttackObjective]] = kwargs.pop("cls", None) _request = build_red_teams_get_attack_objectives_request( risk_types=risk_types, @@ -4680,7 +4353,7 @@ def _get_attack_objectives( if _stream: deserialized = response.iter_bytes() else: - deserialized = _deserialize(List[_models._models.AttackObjective], response.json()) + deserialized = _deserialize(List[_models.AttackObjective], response.json()) if cls: return cls(pipeline_response, deserialized, {}) # type: ignore @@ -4692,7 +4365,7 @@ def _get_attack_objectives( method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "accept"]}, ) - def _get_jail_break_dataset(self, **kwargs: Any) -> List[str]: + def get_jail_break_dataset(self, **kwargs: Any) -> List[str]: """Get the jailbreak dataset. :return: list of str @@ -4817,7 +4490,7 @@ def get_template_parameters_with_type(self, type: str, **kwargs: Any) -> str: method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "accept"]}, ) - def _get_template_parameters(self, **kwargs: Any) -> str: + def get_template_parameters(self, **kwargs: Any) -> str: """Get template parameters. :return: str @@ -4938,48 +4611,83 @@ def get_template_parameters_image(self, *, path: str, **kwargs: Any) -> str: return deserialized # type: ignore @overload - def _submit_simulation( - self, body: _models._models.SimulationDTO, *, content_type: str = "application/json", **kwargs: Any - ) -> _models._models.LongRunningResponse: ... - @overload - def _submit_simulation( - self, body: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models._models.LongRunningResponse: ... - @overload - def _submit_simulation( - self, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models._models.LongRunningResponse: ... - - @distributed_trace - @api_version_validation( - method_added_on="2025-05-15-preview", - params_added_on={"2025-05-15-preview": ["api_version", "content_type", "accept"]}, - ) - def _submit_simulation( - self, body: Union[_models._models.SimulationDTO, JSON, IO[bytes]], **kwargs: Any - ) -> _models._models.LongRunningResponse: + def submit_simulation( + self, body: _models.SimulationDTO, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.LongRunningResponse: """Submit a request for simulation. - :param body: Properties of a Prompt Version. Is one of the following types: SimulationDTO, - JSON, IO[bytes] Required. - :type body: ~azure.ai.projects.onedp.models._models.SimulationDTO or JSON or IO[bytes] + :param body: Properties of a Prompt Version. Required. + :type body: ~azure.ai.projects.onedp.models.SimulationDTO + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str :return: LongRunningResponse. The LongRunningResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models._models.LongRunningResponse + :rtype: ~azure.ai.projects.onedp.models.LongRunningResponse :raises ~azure.core.exceptions.HttpResponseError: """ - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) + + @overload + def submit_simulation( + self, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.LongRunningResponse: + """Submit a request for simulation. + + :param body: Properties of a Prompt Version. Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: LongRunningResponse. The LongRunningResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.LongRunningResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def submit_simulation( + self, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.LongRunningResponse: + """Submit a request for simulation. + + :param body: Properties of a Prompt Version. Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: LongRunningResponse. The LongRunningResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.LongRunningResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace + @api_version_validation( + method_added_on="2025-05-15-preview", + params_added_on={"2025-05-15-preview": ["api_version", "content_type", "accept"]}, + ) + def submit_simulation( + self, body: Union[_models.SimulationDTO, JSON, IO[bytes]], **kwargs: Any + ) -> _models.LongRunningResponse: + """Submit a request for simulation. + + :param body: Properties of a Prompt Version. Is one of the following types: SimulationDTO, + JSON, IO[bytes] Required. + :type body: ~azure.ai.projects.onedp.models.SimulationDTO or JSON or IO[bytes] + :return: LongRunningResponse. The LongRunningResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.LongRunningResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = kwargs.pop("params", {}) or {} content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models._models.LongRunningResponse] = kwargs.pop("cls", None) + cls: ClsType[_models.LongRunningResponse] = kwargs.pop("cls", None) content_type = content_type or "application/json" _content = None @@ -5019,9 +4727,7 @@ def _submit_simulation( if _stream: deserialized = response.iter_bytes() else: - deserialized = _deserialize( - _models._models.LongRunningResponse, response.json() # pylint: disable=protected-access - ) + deserialized = _deserialize(_models.LongRunningResponse, response.json()) if cls: return cls(pipeline_response, deserialized, {}) # type: ignore @@ -5053,7 +4759,7 @@ def __init__(self, *args, **kwargs): "2025-05-15-preview": ["api_version", "name", "top", "skip", "tags", "list_view_type", "accept"] }, ) - def _list_versions( + def list_versions( self, name: str, *, @@ -5062,7 +4768,7 @@ def _list_versions( tags: Optional[str] = None, list_view_type: Optional[Union[str, _models.ListViewType]] = None, **kwargs: Any - ) -> Iterable["_models._models.EvaluationResult"]: + ) -> Iterable["_models.EvaluationResult"]: """List all versions of the given EvaluationResult. :param name: The name of the resource. Required. @@ -5080,13 +4786,13 @@ def _list_versions( "ActiveOnly", "ArchivedOnly", and "All". Default value is None. :paramtype list_view_type: str or ~azure.ai.projects.onedp.models.ListViewType :return: An iterator like instance of EvaluationResult - :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.onedp.models._models.EvaluationResult] + :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.onedp.models.EvaluationResult] :raises ~azure.core.exceptions.HttpResponseError: """ _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[List[_models._models.EvaluationResult]] = kwargs.pop("cls", None) + cls: ClsType[List[_models.EvaluationResult]] = kwargs.pop("cls", None) error_map: MutableMapping = { 401: ClientAuthenticationError, @@ -5140,7 +4846,7 @@ def prepare_request(next_link=None): def extract_data(pipeline_response): deserialized = pipeline_response.http_response.json() - list_of_elem = _deserialize(List[_models._models.EvaluationResult], deserialized.get("value", [])) + list_of_elem = _deserialize(List[_models.EvaluationResult], deserialized.get("value", [])) if cls: list_of_elem = cls(list_of_elem) # type: ignore return deserialized.get("nextLink") or None, iter(list_of_elem) @@ -5167,7 +4873,7 @@ def get_next(next_link=None): method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "top", "skip", "tags", "list_view_type", "accept"]}, ) - def _list_latest( + def list_latest( self, *, top: Optional[int] = None, @@ -5175,7 +4881,7 @@ def _list_latest( tags: Optional[str] = None, list_view_type: Optional[Union[str, _models.ListViewType]] = None, **kwargs: Any - ) -> Iterable["_models._models.EvaluationResult"]: + ) -> Iterable["_models.EvaluationResult"]: """List the latest version of each EvaluationResult. :keyword top: Top count of results, top count cannot be greater than the page size. If topCount @@ -5191,13 +4897,13 @@ def _list_latest( "ActiveOnly", "ArchivedOnly", and "All". Default value is None. :paramtype list_view_type: str or ~azure.ai.projects.onedp.models.ListViewType :return: An iterator like instance of EvaluationResult - :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.onedp.models._models.EvaluationResult] + :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.onedp.models.EvaluationResult] :raises ~azure.core.exceptions.HttpResponseError: """ _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[List[_models._models.EvaluationResult]] = kwargs.pop("cls", None) + cls: ClsType[List[_models.EvaluationResult]] = kwargs.pop("cls", None) error_map: MutableMapping = { 401: ClientAuthenticationError, @@ -5250,7 +4956,7 @@ def prepare_request(next_link=None): def extract_data(pipeline_response): deserialized = pipeline_response.http_response.json() - list_of_elem = _deserialize(List[_models._models.EvaluationResult], deserialized.get("value", [])) + list_of_elem = _deserialize(List[_models.EvaluationResult], deserialized.get("value", [])) if cls: list_of_elem = cls(list_of_elem) # type: ignore return deserialized.get("nextLink") or None, iter(list_of_elem) @@ -5277,7 +4983,7 @@ def get_next(next_link=None): method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "name", "version", "accept"]}, ) - def _get_version(self, name: str, version: str, **kwargs: Any) -> _models._models.EvaluationResult: + def get_version(self, name: str, version: str, **kwargs: Any) -> _models.EvaluationResult: """Get the specific version of the EvaluationResult. :param name: The name of the resource. Required. @@ -5285,7 +4991,7 @@ def _get_version(self, name: str, version: str, **kwargs: Any) -> _models._model :param version: The specific version id of the EvaluationResult to retrieve. Required. :type version: str :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models._models.EvaluationResult + :rtype: ~azure.ai.projects.onedp.models.EvaluationResult :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -5299,7 +5005,7 @@ def _get_version(self, name: str, version: str, **kwargs: Any) -> _models._model _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[_models._models.EvaluationResult] = kwargs.pop("cls", None) + cls: ClsType[_models.EvaluationResult] = kwargs.pop("cls", None) _request = build_evaluation_results_get_version_request( name=name, @@ -5332,9 +5038,7 @@ def _get_version(self, name: str, version: str, **kwargs: Any) -> _models._model if _stream: deserialized = response.iter_bytes() else: - deserialized = _deserialize( - _models._models.EvaluationResult, response.json() # pylint: disable=protected-access - ) + deserialized = _deserialize(_models.EvaluationResult, response.json()) if cls: return cls(pipeline_response, deserialized, {}) # type: ignore @@ -5346,7 +5050,7 @@ def _get_version(self, name: str, version: str, **kwargs: Any) -> _models._model method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "name", "version", "accept"]}, ) - def _delete_version( # pylint: disable=inconsistent-return-statements + def delete_version( # pylint: disable=inconsistent-return-statements self, name: str, version: str, **kwargs: Any ) -> None: """Delete the specific version of the EvaluationResult. @@ -5399,149 +5103,79 @@ def _delete_version( # pylint: disable=inconsistent-return-statements return cls(pipeline_response, None, {}) # type: ignore @overload - def _create( + def create_version( self, name: str, - body: _models._models.EvaluationResult, + version: str, + body: _models.EvaluationResult, *, content_type: str = "application/json", **kwargs: Any - ) -> _models._models.EvaluationResult: ... - @overload - def _create( - self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models._models.EvaluationResult: ... - @overload - def _create( - self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models._models.EvaluationResult: ... - - @distributed_trace - @api_version_validation( - method_added_on="2025-05-15-preview", - params_added_on={ - "2025-05-15-preview": [ - "api_version", - "name", - "repeatability_request_id", - "repeatability_first_sent", - "client_request_id", - "content_type", - "accept", - ] - }, - ) - def _create( - self, name: str, body: Union[_models._models.EvaluationResult, JSON, IO[bytes]], **kwargs: Any - ) -> _models._models.EvaluationResult: - """Create a new EvaluationResult. The version id will be generated by the service. + ) -> _models.EvaluationResult: + """Create a new or replace an existing EvaluationResult with the given version id. :param name: The name of the resource. Required. :type name: str - :param body: The definition of the EvaluationResult to create. Is one of the following types: - EvaluationResult, JSON, IO[bytes] Required. - :type body: ~azure.ai.projects.onedp.models._models.EvaluationResult or JSON or IO[bytes] + :param version: The specific version id of the EvaluationResult to create or replace. Required. + :type version: str + :param body: The definition of the EvaluationResult to create. Required. + :type body: ~azure.ai.projects.onedp.models.EvaluationResult + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models._models.EvaluationResult + :rtype: ~azure.ai.projects.onedp.models.EvaluationResult :raises ~azure.core.exceptions.HttpResponseError: """ - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) - - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) - _params = kwargs.pop("params", {}) or {} - - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models._models.EvaluationResult] = kwargs.pop("cls", None) - - content_type = content_type or "application/json" - _content = None - if isinstance(body, (IOBase, bytes)): - _content = body - else: - _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore - - _request = build_evaluation_results_create_request( - name=name, - content_type=content_type, - api_version=self._config.api_version, - content=_content, - headers=_headers, - params=_params, - ) - path_format_arguments = { - "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - _stream = kwargs.pop("stream", False) - pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access - _request, stream=_stream, **kwargs - ) - - response = pipeline_response.http_response - - if response.status_code not in [200]: - if _stream: - try: - response.read() # Load the body in memory and close the socket - except (StreamConsumedError, StreamClosedError): - pass - map_error(status_code=response.status_code, response=response, error_map=error_map) - raise HttpResponseError(response=response) - - response_headers = {} - response_headers["Repeatability-Result"] = self._deserialize( - "str", response.headers.get("Repeatability-Result") - ) - response_headers["x-ms-client-request-id"] = self._deserialize( - "str", response.headers.get("x-ms-client-request-id") - ) - - if _stream: - deserialized = response.iter_bytes() - else: - deserialized = _deserialize( - _models._models.EvaluationResult, response.json() # pylint: disable=protected-access - ) - - if cls: - return cls(pipeline_response, deserialized, response_headers) # type: ignore - return deserialized # type: ignore - - @overload - def _create_version( - self, - name: str, - version: str, - body: _models._models.EvaluationResult, - *, - content_type: str = "application/json", - **kwargs: Any - ) -> _models._models.EvaluationResult: ... @overload - def _create_version( + def create_version( self, name: str, version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models._models.EvaluationResult: ... + ) -> _models.EvaluationResult: + """Create a new or replace an existing EvaluationResult with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the EvaluationResult to create or replace. Required. + :type version: str + :param body: The definition of the EvaluationResult to create. Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.EvaluationResult + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - def _create_version( + def create_version( self, name: str, version: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models._models.EvaluationResult: ... + ) -> _models.EvaluationResult: + """Create a new or replace an existing EvaluationResult with the given version id. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the EvaluationResult to create or replace. Required. + :type version: str + :param body: The definition of the EvaluationResult to create. Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.EvaluationResult + :raises ~azure.core.exceptions.HttpResponseError: + """ @distributed_trace @api_version_validation( method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "name", "version", "content_type", "accept"]}, ) - def _create_version( - self, name: str, version: str, body: Union[_models._models.EvaluationResult, JSON, IO[bytes]], **kwargs: Any - ) -> _models._models.EvaluationResult: + def create_version( + self, name: str, version: str, body: Union[_models.EvaluationResult, JSON, IO[bytes]], **kwargs: Any + ) -> _models.EvaluationResult: """Create a new or replace an existing EvaluationResult with the given version id. :param name: The name of the resource. Required. @@ -5550,9 +5184,9 @@ def _create_version( :type version: str :param body: The definition of the EvaluationResult to create. Is one of the following types: EvaluationResult, JSON, IO[bytes] Required. - :type body: ~azure.ai.projects.onedp.models._models.EvaluationResult or JSON or IO[bytes] + :type body: ~azure.ai.projects.onedp.models.EvaluationResult or JSON or IO[bytes] :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models._models.EvaluationResult + :rtype: ~azure.ai.projects.onedp.models.EvaluationResult :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -5567,7 +5201,7 @@ def _create_version( _params = kwargs.pop("params", {}) or {} content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models._models.EvaluationResult] = kwargs.pop("cls", None) + cls: ClsType[_models.EvaluationResult] = kwargs.pop("cls", None) content_type = content_type or "application/json" _content = None @@ -5609,9 +5243,7 @@ def _create_version( if _stream: deserialized = response.iter_bytes() else: - deserialized = _deserialize( - _models._models.EvaluationResult, response.json() # pylint: disable=protected-access - ) + deserialized = _deserialize(_models.EvaluationResult, response.json()) if cls: return cls(pipeline_response, deserialized, {}) # type: ignore @@ -5619,7 +5251,7 @@ def _create_version( return deserialized # type: ignore @overload - def _start_pending_upload( + def start_pending_upload( self, name: str, version: str, @@ -5627,22 +5259,69 @@ def _start_pending_upload( *, content_type: str = "application/json", **kwargs: Any - ) -> _models.PendingUploadResponse: ... + ) -> _models.PendingUploadResponse: + """Create or start a pending upload of a evaluation results for a specific version. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the EvaluationResult to operate on. Required. + :type version: str + :param body: Parameters for the action. Required. + :type body: ~azure.ai.projects.onedp.models.PendingUploadRequest + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - def _start_pending_upload( + def start_pending_upload( self, name: str, version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.PendingUploadResponse: ... + ) -> _models.PendingUploadResponse: + """Create or start a pending upload of a evaluation results for a specific version. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the EvaluationResult to operate on. Required. + :type version: str + :param body: Parameters for the action. Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - def _start_pending_upload( + def start_pending_upload( self, name: str, version: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.PendingUploadResponse: ... + ) -> _models.PendingUploadResponse: + """Create or start a pending upload of a evaluation results for a specific version. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the EvaluationResult to operate on. Required. + :type version: str + :param body: Parameters for the action. Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ @distributed_trace @api_version_validation( method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "name", "version", "content_type", "accept"]}, ) - def _start_pending_upload( + def start_pending_upload( self, name: str, version: str, body: Union[_models.PendingUploadRequest, JSON, IO[bytes]], **kwargs: Any ) -> _models.PendingUploadResponse: """Create or start a pending upload of a evaluation results for a specific version. @@ -5720,58 +5399,88 @@ def _start_pending_upload( return deserialized # type: ignore @overload - def _fetch_asset_credentials( + def fetch_asset_credentials( self, name: str, version: str, - asset_credential_request: _models.AssetCredentialRequest, + body: _models.AssetCredentialRequest, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.AssetCredentialResponse: ... + ) -> _models.AssetCredentialResponse: + """Enable downloading json. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the EvaluationResult to operate on. Required. + :type version: str + :param body: Parameters for the action. Required. + :type body: ~azure.ai.projects.onedp.models.AssetCredentialRequest + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: AssetCredentialResponse. The AssetCredentialResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.AssetCredentialResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - def _fetch_asset_credentials( - self, - name: str, - version: str, - asset_credential_request: JSON, - *, - content_type: str = "application/json", - **kwargs: Any - ) -> _models.AssetCredentialResponse: ... + def fetch_asset_credentials( + self, name: str, version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.AssetCredentialResponse: + """Enable downloading json. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the EvaluationResult to operate on. Required. + :type version: str + :param body: Parameters for the action. Required. + :type body: JSON + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: AssetCredentialResponse. The AssetCredentialResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.AssetCredentialResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ + @overload - def _fetch_asset_credentials( - self, - name: str, - version: str, - asset_credential_request: IO[bytes], - *, - content_type: str = "application/json", - **kwargs: Any - ) -> _models.AssetCredentialResponse: ... + def fetch_asset_credentials( + self, name: str, version: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + ) -> _models.AssetCredentialResponse: + """Enable downloading json. + + :param name: The name of the resource. Required. + :type name: str + :param version: The specific version id of the EvaluationResult to operate on. Required. + :type version: str + :param body: Parameters for the action. Required. + :type body: IO[bytes] + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: AssetCredentialResponse. The AssetCredentialResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.AssetCredentialResponse + :raises ~azure.core.exceptions.HttpResponseError: + """ @distributed_trace @api_version_validation( method_added_on="2025-05-15-preview", params_added_on={"2025-05-15-preview": ["api_version", "name", "version", "content_type", "accept"]}, ) - def _fetch_asset_credentials( - self, - name: str, - version: str, - asset_credential_request: Union[_models.AssetCredentialRequest, JSON, IO[bytes]], - **kwargs: Any + def fetch_asset_credentials( + self, name: str, version: str, body: Union[_models.AssetCredentialRequest, JSON, IO[bytes]], **kwargs: Any ) -> _models.AssetCredentialResponse: """Enable downloading json. - :param name: Name of the resource. Required. + :param name: The name of the resource. Required. :type name: str - :param version: Version of the resource. Required. + :param version: The specific version id of the EvaluationResult to operate on. Required. :type version: str - :param asset_credential_request: Input asset to fetch credentials for. Is one of the following - types: AssetCredentialRequest, JSON, IO[bytes] Required. - :type asset_credential_request: ~azure.ai.projects.onedp.models.AssetCredentialRequest or JSON - or IO[bytes] + :param body: Parameters for the action. Is one of the following types: AssetCredentialRequest, + JSON, IO[bytes] Required. + :type body: ~azure.ai.projects.onedp.models.AssetCredentialRequest or JSON or IO[bytes] :return: AssetCredentialResponse. The AssetCredentialResponse is compatible with MutableMapping :rtype: ~azure.ai.projects.onedp.models.AssetCredentialResponse :raises ~azure.core.exceptions.HttpResponseError: @@ -5792,10 +5501,10 @@ def _fetch_asset_credentials( content_type = content_type or "application/json" _content = None - if isinstance(asset_credential_request, (IOBase, bytes)): - _content = asset_credential_request + if isinstance(body, (IOBase, bytes)): + _content = body else: - _content = json.dumps(asset_credential_request, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore _request = build_evaluation_results_fetch_asset_credentials_request( name=name, From 2df73ca3ee002fd4302b8572c841b61600e5b6e2 Mon Sep 17 00:00:00 2001 From: Ankit Singhal <30610298+singankit@users.noreply.github.com> Date: Mon, 14 Apr 2025 12:58:26 -0700 Subject: [PATCH 3/7] Delete sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__pycache__ directory --- .../onedp/__pycache__/__init__.cpython-312.pyc | Bin 787 -> 0 bytes .../onedp/__pycache__/_client.cpython-312.pyc | Bin 8630 -> 0 bytes .../__pycache__/_configuration.cpython-312.pyc | Bin 5150 -> 0 bytes .../__pycache__/_model_base.cpython-312.pyc | Bin 61510 -> 0 bytes .../onedp/__pycache__/_patch.cpython-312.pyc | Bin 805 -> 0 bytes .../__pycache__/_serialization.cpython-312.pyc | Bin 88988 -> 0 bytes .../__pycache__/_validation.cpython-312.pyc | Bin 2124 -> 0 bytes .../onedp/__pycache__/_version.cpython-312.pyc | Bin 240 -> 0 bytes 8 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__pycache__/__init__.cpython-312.pyc delete mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__pycache__/_client.cpython-312.pyc delete mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__pycache__/_configuration.cpython-312.pyc delete mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__pycache__/_model_base.cpython-312.pyc delete mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__pycache__/_patch.cpython-312.pyc delete mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__pycache__/_serialization.cpython-312.pyc delete mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__pycache__/_validation.cpython-312.pyc delete mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__pycache__/_version.cpython-312.pyc diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__pycache__/__init__.cpython-312.pyc b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 49ed044dbce1ef3a9d9ea1715971e47bc9065cae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 787 zcmYLFOKTHR6h3EWGMP!*w56#al7(0-DMsA5FqJ}xL8DMheL#niOUPW)X(uzoo#`W` zg(`@ff{%@M;a(_$f1ztvJ{B@qv51TALbV{$g=dn6UYIlA`Of*yckcbr-=6|HN0(mM%(kmATq#ZWpp;Ut=>p;DJ>B=xwe zI#N?J^iK6elO#56^bxBy(9pOxf2L=B^5^(+gYfBj5rnUwzq|LNK zm37$0t_DE@-nV@`0HLLy1D+ZMkw9pGq0hqRSRAJ?P^wM~Z=Tn~vSV{MBr18oGIOVTdn$&E)f|U0g1TP|>vJry z7KBRrseC3?pm}8`ayh!OaH=h(YzOsfmw4G0$RnK;l4-N>Z0J?SRiTP zp(hG{E1dIOlTx#0AJ=Mj!S7x^D0nWn{GQS_d%W4@8M9qGWbC5finOau&suc&q!^(s z;!T283T+t?53_)0_vFEE%IRM)x(m4{I^AOMG4YI8gio6MK+)()YJL4BGGkAZEV~4L`ma+hvaq gGB7w1lqwSLTW>@fx$IOqZ&?z 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 diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__pycache__/_model_base.cpython-312.pyc b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__pycache__/_model_base.cpython-312.pyc deleted file mode 100644 index c619fb32b7e38f6e862f1c1696ed50f717284ec4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61510 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

0EqE1pbHM4G-wHwK>Vga=JD<-pVr{6vj zb~FXeO)#hkeL)B-&6pim9G4tXn>*Om3&JNQ_W`F(u|UAenK_$+2yr9!_B8IQYqjoA zHLH`cFL}-pAw0idq*4Cm_K5Ifv=aOfXJXUI1`69Vgu4h8-lQmT76py*M0QRrPZfA9 zho2(d9RlDM5rAd}KoVSm?Lk}_vib{y&T8kr=@N}pwj)pZkv8u8WXmJ*o^Be9yvC~& z-@NXI8CC@KYABr7NL*f6-%}4&RRL!yj9xQuS}>K2cFA?+#FAKAGtxjE+KYPv#Rqk1_aIz%<;aNx3hC+~+MV-)(jl(}=IQzgzz5 zfbB)6*NLxbu!@*QejfT2u#%V#i;U^8OsJYSD^p(L6+j@ijGiZbRe{+lje6b*ZPdfY zp}s8x_w;15wH#Mpm_?l@hFLl1>LSK0=Q@3zCp&TR>qT})plAxYAHzDPqbX8PvxCwK zbUlpl9yzqAD)EHBz&Dx8N)!)q2{9+2A_#}XsSGXEhRMREyZivTpTT^pm%OG zuNa^0(cBWeQlmLVEYgxK6j%YxtFbMk+i^X0%A}TDwrw(LU%B^C8Yi#ObTXEN7pcl8 zVAe=mZq90lfc8rSj|{inbjr+-oM4y#DjlW-Ry=5C1xxZH=`!NLHYiF5h#ef z5Y^oL3`?$`XqtfB*UHJdkYi2Iyhg+V&?)jmBZ>a*?}S6509|sB;u*FoqFa#2h^J>3 zHI+!R4=vN~AIzazx`?gnI*&VtdcC+;gsziCL)qwg5%K3;>~#hoam`^u0|n&5n6tm7 z_7N^cBI6E`#Tc|MnMnsLs6L!7;^!F=2i>+KT}aG0=}7`iGSc&XOEGb|HqqY zn-{Y4q_L1v*(OQAxv%FvD2kWpoO{+od&eYi-K|h>!Re6&&}E0V?Coi8O%~i*-eYAc(t6-PPVHW5eYEp#O-gSGa_mr zN>4r=>`Jvhg3?_@;t_lc7Qt|Y55gQ2T@`n>p#ygcN7wM)MRrwuI>R%(Tv*D^r0D2o z-s~7F87+aKrILvf)uvR~J9Xv#!FLBE{@qf+9?9Ga9Y4fm?cRRdlty8#M1p3FLWHbJ zprY52&Bd+B-9w8vE4|;Wz;sSC8Mm7B>N#n zPFv#3aI?JNq!Ku!gEDG@N@i5pacJA7QccnDl(aZYj!ZS7#Hl7~HE8c4lCvi5i-deB zFW3<3n?8Q;9F(eK))ylB7g+zq4eAM<=kdmp8Hd&?*3Nt3NiS|D8YJyhJbEEH|M#UG zoump4&K>I)Au&HY2y>66EMGF){q*5OiF4cu3yz2BER*_NwF<69)lR6WCPWkQzx>2^ z;y8HeipRZEN4?2RE=q)`FN4N|0=~-nffZ96A6E;N$UJe{8+sZRYW}zhhhlnBbjI$v z03R4S;A#`ZLtMCY5%CZJLkl#eCZJ3)5yzNgVaSfwa97$G&}U@45!FCj%w@k!)J<{(0aYRK6{o+1 z!?tJ-`mOL>LuSxQr~?87G%pzfLG5cW%}648i?%uxOz4GxfSRmA$Vo-(IY z)idF(B=ZM|pCw~kYc%Pw1?92yWs#cV1$|%Ekm)SH;#*n|3~&3gJ`$_HECzDbQ?4t- zON|CgpN_@LToc&CNRBHAJ$0EN_AhDTL9iWo0GQKPfnRdG!SGgWg?2KfrS3|J5TPNP z9ILvNKJa%wUm+DCEtTJ0Ar4wTSq}i-XRfQ({$giJ+x1+zTAOrth4<6iG~=ky(odEI zVsL;gJ~{3nGVWu>5LELBD824nReEVu|By9P`=xRMko*n2sR=hzDWtT$SL#2!`=@#^ ztFRN+^td6wsZFMl%tb7sLz!c?G!0){+US7ZY)Xq;)$oPRw{2OfM69!)mg)J<6~eW$e#!gx72em{B>8@yBUNAY;ihE2^*M()8nwwb z_!dO&Jm{p?p);KD*}lQ~U7aFv6dAD=H-c_BefCuqsHz#k?W)|oiDIOHt8^-9w}nDK zBWF9DxRpV+KgCjro7hd~0Eh@i2C``M!eDvp#mndWO34PcMkti37S@^Q3f$kOQXKtf z>=)wS;fzkgHWPuCCxO&|jH;!fx}T+6;ajBv55fnh&2>5uyZT|(`6fjceW%2Aw zz^}j3&)9$o+fPhWfKfg0Wsos7SePA~w;buuJqfJynCy~i2*27!y zL8EaO1rVhq{*ub`D{>BybA`efTFf`d_bQyYgCVvvE*&$AmImeZXB6ooUR+V7k!r`P zxRq$GeOLsrtF>{0E8zOAp*fE?cqC*DXGJ}0M=aQ2*@`08vN>Np6wPkf$L+x@p;snf zyY<>^RkKvp9CdC_hQAthRww-PHqSO3kQxrmHasOYJQZs= z8ZAC8H5>&9O*f%PKj`jHg3uf#5Sr8TZqJQ<tV+S(m+e^o9i3q8XS+8d%3Tcwh%)0?D{ zoiq7T$$`LrRye{V5ABcD?z_iFYde1KBxB&NQnk>rs^;n4k(Mqpomchj&z&cgeSqus zDf@ZOSpuut32TgGS#tk@sH5Yj{7n6KZNVdv(hXB`#taW%ydUL zAByH5mJ2JG_38D~MGWa8Kf3K`wD6dmx0)H2K08(Pe#yHfGwx`8do*t!a?7?OH>U*~ zVY3CBWveIRX`VhMd0L{DT@n2*!ZYW5X8>dlSa|0_ejo?m-bYqvr$hgd*ADk@1b3%f zg=_(=FYGO3=D*_YrTY?fy-QGMNK^Zz!~kjQU8Z>28uTUcw6%ufCF#K>rogz=Nv)L9 zVA?4{A7~Y;RzS^@rV7Yb&}7=lwFU}aM5Uxu`?OU^bS{4vsw9d1T;i?N9z}a=NS6|$ zQObUO=dxu5QnY`fnU5_CFQcI9^vfpVe@;$`>YDN|bW4*w82L2cs`K){Q7FyJ%XkvM zrf_n8pXSp^#K(MU;a1gr;w>G~j|rnfAP*w2P~V5;;k|eE-`)?a2kUm;+bi{bJ#w^r z_UH-e=!wX)J+Y%-i(C+)ZoJAk+@&gyul{b|+j|2i0YD%Nt7ZkCB>3JQ3h$28wP28z zw8w;f;L2fw))ziDbC%pd{dc@`0*t0c@~gw;Q;wLh3*WW+T*sAen|4J@nnw`qm92$% ziS4GBNZ6>EX*ex*!Xdd-9}gW${wg-NeLCjTFVPIjLNxYEk{XC>NZTrF-GdG>b{-es zLo2n%4X0s>x1VX{Vew~O!SwNlkrc!%)Z%G!IFa=RIX|HGU5BS&aGQjYz1OZ1!wSB( zYlE^QPn~ec=&bB;k@1jM-fA2^tX4Ap8__BmLQ*7+67xax<)tc?i3h|e;zV^Z3bRCC zT6{`z*^gLWY)8P{rF0g?J!+%=GO2E*_!5j!wuG!Aszdx&ayGz0^X(+7^*a7kC)8}mRX@#5{iSTLodVx|0gE%oWnIXI64?y6Uv&X4jr4Q4R4YP zYom_3h)_3Y%^qtSZ3^_h1;CfYu+h36sZ#yfu%Rr{IV_o5GC2ndKop@u(_n@%}e-G77uNXEt=?#Dk=$EXRYBh17GS$s&y9M%EGop^8 zY?-=VGor4^d!dnxRu%u6fIb>- zr@c4ZWgb|qpPIWf9TEO9jK#Su7hE3+MieFfksvSVtwez8)=grg=233`2OgKFNQ1b_;33qU&EjD#d4cvHRD-=pXVX*$@)`_h#p&TWO2!*UZZ(a%T z-x`!RY#gzvg-u$`iGkepz_8N;+g1>wd8_6fMG>J0xO!uaqgZyx*7)jXrtJ9r+%~yI?07`S-AG@c?v02UN7YF_ze=!OLQQZSO@mkU;b^*suYnxfr*k zo-q~rcy217_T{rL_n$v|pJ^VsJkxQQeeTAnCeRLXm>lAT zsAAbY6pd8PT8bn~QE-3MQZa1$mF2*&Y2NG_^NxCl zjj|zkxcmC^*PajTjT#DuvlL?^UlDvp;cy9WTBOT@$m{vskdav~(@CX(HpKmmZjmkv zb_ZV&YMgAj)iSk7TC-)5!~LUjJ@0vJFXNj6&pzgGQ95|eQ84nt*tyYjk%F&B?PrIr zva2YN!vy1yWHkLxAU9A#yhs# zwy9&&)l<(&)vXGLuzQGri&AFcH-xX;8M-|*-8Qpzx=X4%q;Lp}9C>Duu1cYq-_HXe z^3cSgaBjFSTp)QjDI5h(>lfKo$v5)^A-Oz8xf-GTQNE7%Ke8G5b&qm%d^OJK@s;Fw zAnZ3}N9=24y%4b!C0#QPv&#DHh+{Q#%VoXgddIbnajUGiUhlfr74i5LmpMNx!ntYl zULiZy$$3q(y;OG9ELe?e@StQN$G~q0{4I|;3RL#% zd464>@kY~llfuCpDqp0_g5cw`fmT^JQ3pi$Lf{nDUUV2A5fVccRQ#b{P!CFuIZ;u z)D`~6`8aWRl8@MmA46aYpK{)y<;>fbt6r$wod1LU(&DSPgLzSCuH%TRp^z|80 z_2#?HGgm$y{BTfeK1!dW5$YrU^$Vu+Jl}$oxHl~07DY!l>4i`X6oSe@tAlixY?4r+ zuvehuVzjY->Lz6V(CNu@x6Xx5PBp&Y^lnq6Vuu8TI77>#nZ5tK&d0A?QVBKQ)Vdkt z$CeK*k&PWv*+D7ikU|mXtuERuEgIk_rdfHlT)j?SQ?+2t=9?*%n(-P%2Y(`>Vt^lI z%+5`9iiv`RCB-&VkY!0MN|2ygZP!m+JF%Eeca=-BbEjqJPRq{y#q8W)%+CGA?A%MT zb1S754E$u3;MekiA9*B7X2RX)g**9Y_yvw!r9BHuK+qHhE;+Ps&^B_pU*5Lkkt>Hc z&SN0fjn)O%NEV-BKmgJ~i&7B#8YN4OVxnMJR#bJ1jFZ+|)^Mv-xVwD;1kPv^=>mEU&aKpm!GB0)Lbb!eA*~r*LGPt}|H7=&BTQzBTgh zHhI&Q1@qH9znhm$+1CfJ4JtZzH=kFiU^zlK3XF~{885-dUv#So%TeX~HSgAhd!*Gn zBp1wSsj&nu&&$4;qogn>c{V6&vS@O&(aCEk17$S80bcy##EapwJ2kg!B;V#p&SnXU zTUIrVD_M5FNGk{YtQ5GWH`>~XwV_^h8VFsK3L7QM7R5wy@Z}0@z?WKKn~&;q}Mn zK7L%06C%l+NGgMj=D|FmWJ%^B1kgLcIPA#q5Kq~AL*`MvGm6$Pk1FeQuGYYoP=MhM zBokT!OToZoIDD+LOkXfv8Fp4Fv9gXE#}?W!c){~B13P1>bETb4r+mdHxt;R0m8)r4 zyHpobS$Z_Y?i`{kIQ-(dk7(0-qO5EBNy4)%Nrd4Sn7_wcn48ar1uWtCOM5;1@|5NV;#DzHpq0i&Lwkg8}?|5G2|$nkq( zA}@ef`#U~bwjd`*1rQ@eiYP_v01KWL!J&$obhw)V9?^n1O#eILx)IGI(fw35v_!#qC>2Dg8bSY47KN&^w=Q@4xC_ S-ntZT4?dFpO%%~Vi}45S5cKK* diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__pycache__/_serialization.cpython-312.pyc b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__pycache__/_serialization.cpython-312.pyc deleted file mode 100644 index 53db87f4556a78f97972ecd558701c0ae94ede98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88988 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 bfOiqUa~0}NW0TWBDDMMQn|F1gh63PkB#a!k diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__pycache__/_version.cpython-312.pyc b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/__pycache__/_version.cpython-312.pyc deleted file mode 100644 index 01a88b7309bb1334cda4f1e2bf38d12caa94d4f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 240 zcmX@j%ge<81bek&P1gB1TNakh#HElw>ej!DeRF3!wLj|oaG$OrPON{dnm Date: Mon, 14 Apr 2025 12:59:05 -0700 Subject: [PATCH 4/7] Delete sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__pycache__ directory --- .../models/__pycache__/__init__.cpython-312.pyc | Bin 1653 -> 0 bytes .../models/__pycache__/_enums.cpython-312.pyc | Bin 4747 -> 0 bytes .../models/__pycache__/_models.cpython-312.pyc | Bin 83167 -> 0 bytes .../models/__pycache__/_patch.cpython-312.pyc | Bin 1223 -> 0 bytes 4 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__pycache__/__init__.cpython-312.pyc delete mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__pycache__/_enums.cpython-312.pyc delete mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__pycache__/_models.cpython-312.pyc delete mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__pycache__/_patch.cpython-312.pyc diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__pycache__/__init__.cpython-312.pyc b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 285c631c2e5f2e4c116dc25398a9d17314db2a6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1653 zcmc(e%WoV-5Qn?>{eF2LUcVpfSR1q`ha6yoknFV$792z?o%1gwY=77-Q^Q5F?3 z787w67YUXSNtP5TmJ(@}78#ZiS(X(!mJ@lF7X?-jMOG9gRuU6zLX=rqR9Hn+Syj|n zO-!;$QD=2A#ioKYqQa@;f-rl(%Xrfcge#4($H>|xKzRw+Q z_V||NbYQ6`Y*)8TKLw7-dx4$pSW;MWV|}hN=$*HptB+SQRA9C&O^X-hZwiEo#;EJNeYiD+~vB)M(co{MvS=1&uZ z`StUvsrI?{4@u|GTN*cxDK1~+ChENmIjGvWkd+hBQ5mzlsywQ?AKpFm{M7D1x?G@) zW&#TBxd(VDy&&031DpG~qgn=jdX&y^@<>bILsD=#fth(#m+lpvUk|+EUnB*gi5+fp zICoDsba$}BrDwSCMB<8~8it~PnY2~6cc4h^usQF<-~~C@piTk-50yCB$xa%PL1Ym* zL>^H<6cHuF1fq zds#v!byf3FLjGO2Qwu!o*CAW5wY6_KEqmY|SY{X8uBwmbRJ~<8)>Y_K*|JQo+2fsh zcO35y_5N@Gwj%{jE&s;?Lp2{Yd>uY?6ka zkbl9i!Nl1lE&)77;O5i!N#!T<%%jLcI`mHb;W{NW@j>q0+@1FK`SzXmN9q^FuU5Zn oKK}{*to?1i{R27oBT2oVdHN_!3g;xg#;>1Cu2&M@gd)H{0JX5pF#rGn diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__pycache__/_enums.cpython-312.pyc b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__pycache__/_enums.cpython-312.pyc deleted file mode 100644 index 3ba0fa5fea480a307e75eafbbefc677ee6b131ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4747 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 t# diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__pycache__/_patch.cpython-312.pyc b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/models/__pycache__/_patch.cpython-312.pyc deleted file mode 100644 index d947d51908db63a2e5ff087306222d7669db85c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1223 zcmbVLPj4JG6t`z)|EeLWXcD3xFc)AWZT5=SK0*2w5FdpL5|`CToH!wIsMvCV6VJ2RC~(Bmym^28{NDTd=N~sVx&+tA{WX3T z67s7z)~k7`ET5oqL5_(eF_BaT8O?(@pk5ENFpuJhl7KuQGCC)+0SyR#h*r6AQ#Qsl zZb1Z%J#;}^Ht*nHw$4f1nYMeK*|+yf>vW#ZfQ>9UKoAUYgcW~ zmB@kfs>^wr;w^T^?x$l4{~H~;p8h(W3_{3)wvqa_?P(}el|ey zlGK16^|~HTsT1T_1o%FT2eE3pX@UJ34`vlwXI7WB>&;DsUm>iki8-$i{%_s(ofUQO zn)flszc2dyp^p9>xqd(h(?)*Y_-!>bx_d0z2^;?3 Date: Mon, 14 Apr 2025 12:59:16 -0700 Subject: [PATCH 5/7] Delete sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/operations/__pycache__ directory --- .../__pycache__/__init__.cpython-312.pyc | Bin 1008 -> 0 bytes .../__pycache__/_operations.cpython-312.pyc | Bin 242149 -> 0 bytes .../__pycache__/_patch.cpython-312.pyc | Bin 10648 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/operations/__pycache__/__init__.cpython-312.pyc delete mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/operations/__pycache__/_operations.cpython-312.pyc delete mode 100644 sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/operations/__pycache__/_patch.cpython-312.pyc diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/operations/__pycache__/__init__.cpython-312.pyc b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/operations/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 0833a0b342d809ccc4c874031b639e02327b6ee6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1008 zcma))y>HV%6u{p(j$_Am(pE&GVk!$tODcp|ND&An6;w#23T41DvaI-;x^-;p?34zz z0tUoViH`-kG9gt+{0p6#_*jVA0ih1vsv?Fm@y=-o>BPx?{=HAXyLTUTJqx(p_^45n z0Df?#w=&1@Qzihf!2ySO&?E*SKnY7bf|K%u_W}VV(MvT&Lrgf0oHo)4OURNTC7eOd z7@34+WZA&Nn5!TwhLUg=IcsDSR*_XhO<41Ure^2~_y4M+HD}}rG{DKdC5A?|rLkW7 z{V&z4@Eqzw1K;}!z&fk})mBJEHsm#UDQu`Bde&hJ_sJIl0cd`!tDx4-*KwCT;sF$g z_PM=CI{N&*xoN9%bGmYCX7u>c$N?MyhsfM>HO+Gd$xvbd?So3so9=LAy!)6VW3z>daHSIT(JX|H~SU zTHcAIjAhxLXIa>_654Tn(TbeqqRjB70OQw#$z0%(0^|3Hsa$AW=qP53!yPGZhpyjX zDbzcXl~n1dR`B;k{P3R|7*a;Iuc!tsqgS9gb|;|h2M`VW%F)CS!CM& za)gbTH5vw}J!~=Bl_g9qEd;C-w&TUXH&Hch_tiJp2HB_D W(P0XPrXoIy?X$}DYx4Ga5#=8Zf)dC8 diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/operations/__pycache__/_operations.cpython-312.pyc b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/operations/__pycache__/_operations.cpython-312.pyc deleted file mode 100644 index 4b480543af7a525048fe75db49cccab8f5017c00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 242149 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 diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/operations/__pycache__/_patch.cpython-312.pyc b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_common/onedp/operations/__pycache__/_patch.cpython-312.pyc deleted file mode 100644 index 694dbdc54bdb800a851f8076fc102ca29f5fd131..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10648 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 From 575e36722c1139c5322a33547130cd0c027700d3 Mon Sep 17 00:00:00 2001 From: Ankit Singhal <30610298+singankit@users.noreply.github.com> Date: Mon, 14 Apr 2025 15:35:22 -0700 Subject: [PATCH 6/7] Update cspell.json --- .vscode/cspell.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.vscode/cspell.json b/.vscode/cspell.json index 404795164d2e..da8fcc73b0b2 100644 --- a/.vscode/cspell.json +++ b/.vscode/cspell.json @@ -1411,6 +1411,8 @@ "Inadherent", "nbformat", "nbconvert", + "onedep", + "azureai", ] }, { From e4b405d6e8f141633a9b64e63be556ce92d38cd0 Mon Sep 17 00:00:00 2001 From: Ankit Singhal <30610298+singankit@users.noreply.github.com> Date: Mon, 14 Apr 2025 16:45:57 -0700 Subject: [PATCH 7/7] Update cspell.json --- .vscode/cspell.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode/cspell.json b/.vscode/cspell.json index da8fcc73b0b2..6831cc1fe400 100644 --- a/.vscode/cspell.json +++ b/.vscode/cspell.json @@ -1411,7 +1411,7 @@ "Inadherent", "nbformat", "nbconvert", - "onedep", + "onedp", "azureai", ] },