diff --git a/.fern/metadata.json b/.fern/metadata.json index ab43faf5..6b0f1b2e 100644 --- a/.fern/metadata.json +++ b/.fern/metadata.json @@ -1,7 +1,7 @@ { - "cliVersion": "3.54.1", + "cliVersion": "4.71.5", "generatorName": "fernapi/fern-python-sdk", - "generatorVersion": "4.54.2", + "generatorVersion": "4.54.3", "generatorConfig": { "package_name": "truefoundry_sdk", "pydantic_config": { @@ -22,5 +22,6 @@ "numpydoc": ">=1.7.0,<2.0.0" } }, + "originGitCommit": "457642c2a485b1c6e24d08e227bc40f36ccedd57", "sdkVersion": "0.0.0" } \ No newline at end of file diff --git a/poetry.lock b/poetry.lock index b0fdabce..0fb0f8c2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -114,124 +114,140 @@ files = [ [[package]] name = "charset-normalizer" -version = "3.4.5" +version = "3.4.7" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" files = [ - {file = "charset_normalizer-3.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4167a621a9a1a986c73777dbc15d4b5eac8ac5c10393374109a343d4013ec765"}, - {file = "charset_normalizer-3.4.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3f64c6bf8f32f9133b668c7f7a7cbdbc453412bc95ecdbd157f3b1e377a92990"}, - {file = "charset_normalizer-3.4.5-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:568e3c34b58422075a1b49575a6abc616d9751b4d61b23f712e12ebb78fe47b2"}, - {file = "charset_normalizer-3.4.5-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:036c079aa08a6a592b82487f97c60b439428320ed1b2ea0b3912e99d30c77765"}, - {file = "charset_normalizer-3.4.5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:340810d34ef83af92148e96e3e44cb2d3f910d2bf95e5618a5c467d9f102231d"}, - {file = "charset_normalizer-3.4.5-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:cd2d0f0ec9aa977a27731a3209ebbcacebebaf41f902bd453a928bfd281cf7f8"}, - {file = "charset_normalizer-3.4.5-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0b362bcd27819f9c07cbf23db4e0e8cd4b44c5ecd900c2ff907b2b92274a7412"}, - {file = "charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:77be992288f720306ab4108fe5c74797de327f3248368dfc7e1a916d6ed9e5a2"}, - {file = "charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:8b78d8a609a4b82c273257ee9d631ded7fac0d875bdcdccc109f3ee8328cfcb1"}, - {file = "charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ba20bdf69bd127f66d0174d6f2a93e69045e0b4036dc1ca78e091bcc765830c4"}, - {file = "charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:76a9d0de4d0eab387822e7b35d8f89367dd237c72e82ab42b9f7bf5e15ada00f"}, - {file = "charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8fff79bf5978c693c9b1a4d71e4a94fddfb5fe744eb062a318e15f4a2f63a550"}, - {file = "charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c7e84e0c0005e3bdc1a9211cd4e62c78ba80bc37b2365ef4410cd2007a9047f2"}, - {file = "charset_normalizer-3.4.5-cp310-cp310-win32.whl", hash = "sha256:58ad8270cfa5d4bef1bc85bd387217e14ff154d6630e976c6f56f9a040757475"}, - {file = "charset_normalizer-3.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:02a9d1b01c1e12c27883b0c9349e0bcd9ae92e727ff1a277207e1a262b1cbf05"}, - {file = "charset_normalizer-3.4.5-cp310-cp310-win_arm64.whl", hash = "sha256:039215608ac7b358c4da0191d10fc76868567fbf276d54c14721bdedeb6de064"}, - {file = "charset_normalizer-3.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:610f72c0ee565dfb8ae1241b666119582fdbfe7c0975c175be719f940e110694"}, - {file = "charset_normalizer-3.4.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60d68e820af339df4ae8358c7a2e7596badeb61e544438e489035f9fbf3246a5"}, - {file = "charset_normalizer-3.4.5-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:10b473fc8dca1c3ad8559985794815f06ca3fc71942c969129070f2c3cdf7281"}, - {file = "charset_normalizer-3.4.5-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d4eb8ac7469b2a5d64b5b8c04f84d8bf3ad340f4514b98523805cbf46e3b3923"}, - {file = "charset_normalizer-3.4.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bcb3227c3d9aaf73eaaab1db7ccd80a8995c509ee9941e2aae060ca6e4e5d81"}, - {file = "charset_normalizer-3.4.5-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:75ee9c1cce2911581a70a3c0919d8bccf5b1cbc9b0e5171400ec736b4b569497"}, - {file = "charset_normalizer-3.4.5-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1d1401945cb77787dbd3af2446ff2d75912327c4c3a1526ab7955ecf8600687c"}, - {file = "charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a45e504f5e1be0bd385935a8e1507c442349ca36f511a47057a71c9d1d6ea9e"}, - {file = "charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e09f671a54ce70b79a1fc1dc6da3072b7ef7251fadb894ed92d9aa8218465a5f"}, - {file = "charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d01de5e768328646e6a3fa9e562706f8f6641708c115c62588aef2b941a4f88e"}, - {file = "charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:131716d6786ad5e3dc542f5cc6f397ba3339dc0fb87f87ac30e550e8987756af"}, - {file = "charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1a374cc0b88aa710e8865dc1bd6edb3743c59f27830f0293ab101e4cf3ce9f85"}, - {file = "charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d31f0d1671e1534e395f9eb84a68e0fb670e1edb1fe819a9d7f564ae3bc4e53f"}, - {file = "charset_normalizer-3.4.5-cp311-cp311-win32.whl", hash = "sha256:cace89841c0599d736d3d74a27bc5821288bb47c5441923277afc6059d7fbcb4"}, - {file = "charset_normalizer-3.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:f8102ae93c0bc863b1d41ea0f4499c20a83229f52ed870850892df555187154a"}, - {file = "charset_normalizer-3.4.5-cp311-cp311-win_arm64.whl", hash = "sha256:ed98364e1c262cf5f9363c3eca8c2df37024f52a8fa1180a3610014f26eac51c"}, - {file = "charset_normalizer-3.4.5-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ed97c282ee4f994ef814042423a529df9497e3c666dca19be1d4cd1129dc7ade"}, - {file = "charset_normalizer-3.4.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0294916d6ccf2d069727d65973c3a1ca477d68708db25fd758dd28b0827cff54"}, - {file = "charset_normalizer-3.4.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:dc57a0baa3eeedd99fafaef7511b5a6ef4581494e8168ee086031744e2679467"}, - {file = "charset_normalizer-3.4.5-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ed1a9a204f317ef879b32f9af507d47e49cd5e7f8e8d5d96358c98373314fc60"}, - {file = "charset_normalizer-3.4.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7ad83b8f9379176c841f8865884f3514d905bcd2a9a3b210eaa446e7d2223e4d"}, - {file = "charset_normalizer-3.4.5-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:a118e2e0b5ae6b0120d5efa5f866e58f2bb826067a646431da4d6a2bdae7950e"}, - {file = "charset_normalizer-3.4.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:754f96058e61a5e22e91483f823e07df16416ce76afa4ebf306f8e1d1296d43f"}, - {file = "charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0c300cefd9b0970381a46394902cd18eaf2aa00163f999590ace991989dcd0fc"}, - {file = "charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c108f8619e504140569ee7de3f97d234f0fbae338a7f9f360455071ef9855a95"}, - {file = "charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d1028de43596a315e2720a9849ee79007ab742c06ad8b45a50db8cdb7ed4a82a"}, - {file = "charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:19092dde50335accf365cce21998a1c6dd8eafd42c7b226eb54b2747cdce2fac"}, - {file = "charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4354e401eb6dab9aed3c7b4030514328a6c748d05e1c3e19175008ca7de84fb1"}, - {file = "charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a68766a3c58fde7f9aaa22b3786276f62ab2f594efb02d0a1421b6282e852e98"}, - {file = "charset_normalizer-3.4.5-cp312-cp312-win32.whl", hash = "sha256:1827734a5b308b65ac54e86a618de66f935a4f63a8a462ff1e19a6788d6c2262"}, - {file = "charset_normalizer-3.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:728c6a963dfab66ef865f49286e45239384249672cd598576765acc2a640a636"}, - {file = "charset_normalizer-3.4.5-cp312-cp312-win_arm64.whl", hash = "sha256:75dfd1afe0b1647449e852f4fb428195a7ed0588947218f7ba929f6538487f02"}, - {file = "charset_normalizer-3.4.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ac59c15e3f1465f722607800c68713f9fbc2f672b9eb649fe831da4019ae9b23"}, - {file = "charset_normalizer-3.4.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:165c7b21d19365464e8f70e5ce5e12524c58b48c78c1f5a57524603c1ab003f8"}, - {file = "charset_normalizer-3.4.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:28269983f25a4da0425743d0d257a2d6921ea7d9b83599d4039486ec5b9f911d"}, - {file = "charset_normalizer-3.4.5-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d27ce22ec453564770d29d03a9506d449efbb9fa13c00842262b2f6801c48cce"}, - {file = "charset_normalizer-3.4.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0625665e4ebdddb553ab185de5db7054393af8879fb0c87bd5690d14379d6819"}, - {file = "charset_normalizer-3.4.5-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:c23eb3263356d94858655b3e63f85ac5d50970c6e8febcdde7830209139cc37d"}, - {file = "charset_normalizer-3.4.5-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e6302ca4ae283deb0af68d2fbf467474b8b6aedcd3dab4db187e07f94c109763"}, - {file = "charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e51ae7d81c825761d941962450f50d041db028b7278e7b08930b4541b3e45cb9"}, - {file = "charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:597d10dec876923e5c59e48dbd366e852eacb2b806029491d307daea6b917d7c"}, - {file = "charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5cffde4032a197bd3b42fd0b9509ec60fb70918d6970e4cc773f20fc9180ca67"}, - {file = "charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2da4eedcb6338e2321e831a0165759c0c620e37f8cd044a263ff67493be8ffb3"}, - {file = "charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:65a126fb4b070d05340a84fc709dd9e7c75d9b063b610ece8a60197a291d0adf"}, - {file = "charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c7a80a9242963416bd81f99349d5f3fce1843c303bd404f204918b6d75a75fd6"}, - {file = "charset_normalizer-3.4.5-cp313-cp313-win32.whl", hash = "sha256:f1d725b754e967e648046f00c4facc42d414840f5ccc670c5670f59f83693e4f"}, - {file = "charset_normalizer-3.4.5-cp313-cp313-win_amd64.whl", hash = "sha256:e37bd100d2c5d3ba35db9c7c5ba5a9228cbcffe5c4778dc824b164e5257813d7"}, - {file = "charset_normalizer-3.4.5-cp313-cp313-win_arm64.whl", hash = "sha256:93b3b2cc5cf1b8743660ce77a4f45f3f6d1172068207c1defc779a36eea6bb36"}, - {file = "charset_normalizer-3.4.5-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8197abe5ca1ffb7d91e78360f915eef5addff270f8a71c1fc5be24a56f3e4873"}, - {file = "charset_normalizer-3.4.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a2aecdb364b8a1802afdc7f9327d55dad5366bc97d8502d0f5854e50712dbc5f"}, - {file = "charset_normalizer-3.4.5-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a66aa5022bf81ab4b1bebfb009db4fd68e0c6d4307a1ce5ef6a26e5878dfc9e4"}, - {file = "charset_normalizer-3.4.5-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d77f97e515688bd615c1d1f795d540f32542d514242067adcb8ef532504cb9ee"}, - {file = "charset_normalizer-3.4.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01a1ed54b953303ca7e310fafe0fe347aab348bd81834a0bcd602eb538f89d66"}, - {file = "charset_normalizer-3.4.5-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:b2d37d78297b39a9eb9eb92c0f6df98c706467282055419df141389b23f93362"}, - {file = "charset_normalizer-3.4.5-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e71bbb595973622b817c042bd943c3f3667e9c9983ce3d205f973f486fec98a7"}, - {file = "charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4cd966c2559f501c6fd69294d082c2934c8dd4719deb32c22961a5ac6db0df1d"}, - {file = "charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d5e52d127045d6ae01a1e821acfad2f3a1866c54d0e837828538fabe8d9d1bd6"}, - {file = "charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:30a2b1a48478c3428d047ed9690d57c23038dac838a87ad624c85c0a78ebeb39"}, - {file = "charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:d8ed79b8f6372ca4254955005830fd61c1ccdd8c0fac6603e2c145c61dd95db6"}, - {file = "charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:c5af897b45fa606b12464ccbe0014bbf8c09191e0a66aab6aa9d5cf6e77e0c94"}, - {file = "charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1088345bcc93c58d8d8f3d783eca4a6e7a7752bbff26c3eee7e73c597c191c2e"}, - {file = "charset_normalizer-3.4.5-cp314-cp314-win32.whl", hash = "sha256:ee57b926940ba00bca7ba7041e665cc956e55ef482f851b9b65acb20d867e7a2"}, - {file = "charset_normalizer-3.4.5-cp314-cp314-win_amd64.whl", hash = "sha256:4481e6da1830c8a1cc0b746b47f603b653dadb690bcd851d039ffaefe70533aa"}, - {file = "charset_normalizer-3.4.5-cp314-cp314-win_arm64.whl", hash = "sha256:97ab7787092eb9b50fb47fa04f24c75b768a606af1bcba1957f07f128a7219e4"}, - {file = "charset_normalizer-3.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e22d1059b951e7ae7c20ef6b06afd10fb95e3c41bf3c4fbc874dba113321c193"}, - {file = "charset_normalizer-3.4.5-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:afca7f78067dd27c2b848f1b234623d26b87529296c6c5652168cc1954f2f3b2"}, - {file = "charset_normalizer-3.4.5-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ec56a2266f32bc06ed3c3e2a8f58417ce02f7e0356edc89786e52db13c593c98"}, - {file = "charset_normalizer-3.4.5-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2b970382e4a36bed897c19f310f31d7d13489c11b4f468ddfba42d41cddfb918"}, - {file = "charset_normalizer-3.4.5-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:573ef5814c4b7c0d59a7710aa920eaaaef383bd71626aa420fba27b5cab92e8d"}, - {file = "charset_normalizer-3.4.5-cp38-cp38-manylinux_2_31_armv7l.whl", hash = "sha256:50bcbca6603c06a1dcc7b056ed45c37715fb5d2768feb3bcd37d2313c587a5b9"}, - {file = "charset_normalizer-3.4.5-cp38-cp38-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1f2da5cbb9becfcd607757a169e38fb82aa5fd86fae6653dea716e7b613fe2cf"}, - {file = "charset_normalizer-3.4.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fc1c64934b8faf7584924143eb9db4770bbdb16659626e1a1a4d9efbcb68d947"}, - {file = "charset_normalizer-3.4.5-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:ae8b03427410731469c4033934cf473426faff3e04b69d2dfb64a4281a3719f8"}, - {file = "charset_normalizer-3.4.5-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:b3e71afc578b98512bfe7bdb822dd6bc57d4b0093b4b6e5487c1e96ad4ace242"}, - {file = "charset_normalizer-3.4.5-cp38-cp38-musllinux_1_2_riscv64.whl", hash = "sha256:4b8551b6e6531e156db71193771c93bda78ffc4d1e6372517fe58ad3b91e4659"}, - {file = "charset_normalizer-3.4.5-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:65b3c403a5b6b8034b655e7385de4f72b7b244869a22b32d4030b99a60593eca"}, - {file = "charset_normalizer-3.4.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:8ce11cd4d62d11166f2b441e30ace226c19a3899a7cf0796f668fba49a9fb123"}, - {file = "charset_normalizer-3.4.5-cp38-cp38-win32.whl", hash = "sha256:66dee73039277eb35380d1b82cccc69cc82b13a66f9f4a18da32d573acf02b7c"}, - {file = "charset_normalizer-3.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:d29dd9c016f2078b43d0c357511e87eee5b05108f3dd603423cb389b89813969"}, - {file = "charset_normalizer-3.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:259cd1ca995ad525f638e131dbcc2353a586564c038fc548a3fe450a91882139"}, - {file = "charset_normalizer-3.4.5-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a28afb04baa55abf26df544e3e5c6534245d3daa5178bc4a8eeb48202060d0e"}, - {file = "charset_normalizer-3.4.5-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ff95a9283de8a457e6b12989de3f9f5193430f375d64297d323a615ea52cbdb3"}, - {file = "charset_normalizer-3.4.5-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:708c7acde173eedd4bfa4028484426ba689d2103b28588c513b9db2cd5ecde9c"}, - {file = "charset_normalizer-3.4.5-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aa92ec1102eaff840ccd1021478af176a831f1bccb08e526ce844b7ddda85c22"}, - {file = "charset_normalizer-3.4.5-cp39-cp39-manylinux_2_31_armv7l.whl", hash = "sha256:5fea359734b140d0d6741189fea5478c6091b54ffc69d7ce119e0a05637d8c99"}, - {file = "charset_normalizer-3.4.5-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e545b51da9f9af5c67815ca0eb40676c0f016d0b0381c86f20451e35696c5f95"}, - {file = "charset_normalizer-3.4.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:30987f4a8ed169983f93e1be8ffeea5214a779e27ed0b059835c7afe96550ad7"}, - {file = "charset_normalizer-3.4.5-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:149ec69866c3d6c2fb6f758dbc014ecb09f30b35a5ca90b6a8a2d4e54e18fdfe"}, - {file = "charset_normalizer-3.4.5-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:530beedcec9b6e027e7a4b6ce26eed36678aa39e17da85e6e03d7bd9e8e9d7c9"}, - {file = "charset_normalizer-3.4.5-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:14498a429321de554b140013142abe7608f9d8ccc04d7baf2ad60498374aefa2"}, - {file = "charset_normalizer-3.4.5-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2820a98460c83663dd8ec015d9ddfd1e4879f12e06bb7d0500f044fb477d2770"}, - {file = "charset_normalizer-3.4.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:aa2f963b4da26daf46231d9b9e0e2c9408a751f8f0d0f44d2de56d3caf51d294"}, - {file = "charset_normalizer-3.4.5-cp39-cp39-win32.whl", hash = "sha256:82cc7c2ad42faec8b574351f8bc2a0c049043893853317bd9bb309f5aba6cb5a"}, - {file = "charset_normalizer-3.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:92263f7eca2f4af326cd20de8d16728d2602f7cfea02e790dcde9d83c365d7cc"}, - {file = "charset_normalizer-3.4.5-cp39-cp39-win_arm64.whl", hash = "sha256:014837af6fabf57121b6254fa8ade10dceabc3528b27b721a64bbc7b8b1d4eb4"}, - {file = "charset_normalizer-3.4.5-py3-none-any.whl", hash = "sha256:9db5e3fcdcee89a78c04dffb3fe33c79f77bd741a624946db2591c81b2fc85b0"}, - {file = "charset_normalizer-3.4.5.tar.gz", hash = "sha256:95adae7b6c42a6c5b5b559b1a99149f090a57128155daeea91732c8d970d8644"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cdd68a1fb318e290a2077696b7eb7a21a49163c455979c639bf5a5dcdc46617d"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e17b8d5d6a8c47c85e68ca8379def1303fd360c3e22093a807cd34a71cd082b8"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:511ef87c8aec0783e08ac18565a16d435372bc1ac25a91e6ac7f5ef2b0bff790"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:007d05ec7321d12a40227aae9e2bc6dca73f3cb21058999a1df9e193555a9dcc"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf29836da5119f3c8a8a70667b0ef5fdca3bb12f80fd06487cfa575b3909b393"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:12d8baf840cc7889b37c7c770f478adea7adce3dcb3944d02ec87508e2dcf153"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d560742f3c0d62afaccf9f41fe485ed69bd7661a241f86a3ef0f0fb8b1a397af"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b14b2d9dac08e28bb8046a1a0434b1750eb221c8f5b87a68f4fa11a6f97b5e34"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:bc17a677b21b3502a21f66a8cc64f5bfad4df8a0b8434d661666f8ce90ac3af1"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:750e02e074872a3fad7f233b47734166440af3cdea0add3e95163110816d6752"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:4e5163c14bffd570ef2affbfdd77bba66383890797df43dc8b4cc7d6f500bf53"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6ed74185b2db44f41ef35fd1617c5888e59792da9bbc9190d6c7300617182616"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:94e1885b270625a9a828c9793b4d52a64445299baa1fea5a173bf1d3dd9a1a5a"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-win32.whl", hash = "sha256:6785f414ae0f3c733c437e0f3929197934f526d19dfaa75e18fdb4f94c6fb374"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:6696b7688f54f5af4462118f0bfa7c1621eeb87154f77fa04b9295ce7a8f2943"}, + {file = "charset_normalizer-3.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:66671f93accb62ed07da56613636f3641f1a12c13046ce91ffc923721f23c008"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7641bb8895e77f921102f72833904dcd9901df5d6d72a2ab8f31d04b7e51e4e7"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:202389074300232baeb53ae2569a60901f7efadd4245cf3a3bf0617d60b439d7"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:30b8d1d8c52a48c2c5690e152c169b673487a2a58de1ec7393196753063fcd5e"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:532bc9bf33a68613fd7d65e4b1c71a6a38d7d42604ecf239c77392e9b4e8998c"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fe249cb4651fd12605b7288b24751d8bfd46d35f12a20b1ba33dea122e690df"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:65bcd23054beab4d166035cabbc868a09c1a49d1efe458fe8e4361215df40265"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:08e721811161356f97b4059a9ba7bafb23ea5ee2255402c42881c214e173c6b4"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e060d01aec0a910bdccb8be71faf34e7799ce36950f8294c8bf612cba65a2c9e"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:38c0109396c4cfc574d502df99742a45c72c08eff0a36158b6f04000043dbf38"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1c2a768fdd44ee4a9339a9b0b130049139b8ce3c01d2ce09f67f5a68048d477c"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:1a87ca9d5df6fe460483d9a5bbf2b18f620cbed41b432e2bddb686228282d10b"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:d635aab80466bc95771bb78d5370e74d36d1fe31467b6b29b8b57b2a3cd7d22c"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ae196f021b5e7c78e918242d217db021ed2a6ace2bc6ae94c0fc596221c7f58d"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-win32.whl", hash = "sha256:adb2597b428735679446b46c8badf467b4ca5f5056aae4d51a19f9570301b1ad"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:8e385e4267ab76874ae30db04c627faaaf0b509e1ccc11a95b3fc3e83f855c00"}, + {file = "charset_normalizer-3.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:d4a48e5b3c2a489fae013b7589308a40146ee081f6f509e047e0e096084ceca1"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eca9705049ad3c7345d574e3510665cb2cf844c2f2dcfe675332677f081cbd46"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6178f72c5508bfc5fd446a5905e698c6212932f25bcdd4b47a757a50605a90e2"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1421b502d83040e6d7fb2fb18dff63957f720da3d77b2fbd3187ceb63755d7b"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:edac0f1ab77644605be2cbba52e6b7f630731fc42b34cb0f634be1a6eface56a"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5649fd1c7bade02f320a462fdefd0b4bd3ce036065836d4f42e0de958038e116"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:203104ed3e428044fd943bc4bf45fa73c0730391f9621e37fe39ecf477b128cb"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:298930cec56029e05497a76988377cbd7457ba864beeea92ad7e844fe74cd1f1"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:708838739abf24b2ceb208d0e22403dd018faeef86ddac04319a62ae884c4f15"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:0f7eb884681e3938906ed0434f20c63046eacd0111c4ba96f27b76084cd679f5"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4dc1e73c36828f982bfe79fadf5919923f8a6f4df2860804db9a98c48824ce8d"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:aed52fea0513bac0ccde438c188c8a471c4e0f457c2dd20cdbf6ea7a450046c7"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fea24543955a6a729c45a73fe90e08c743f0b3334bbf3201e6c4bc1b0c7fa464"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb6d88045545b26da47aa879dd4a89a71d1dce0f0e549b1abcb31dfe4a8eac49"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-win32.whl", hash = "sha256:2257141f39fe65a3fdf38aeccae4b953e5f3b3324f4ff0daf9f15b8518666a2c"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:5ed6ab538499c8644b8a3e18debabcd7ce684f3fa91cf867521a7a0279cab2d6"}, + {file = "charset_normalizer-3.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:56be790f86bfb2c98fb742ce566dfb4816e5a83384616ab59c49e0604d49c51d"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:f495a1652cf3fbab2eb0639776dad966c2fb874d79d87ca07f9d5f059b8bd215"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e712b419df8ba5e42b226c510472b37bd57b38e897d3eca5e8cfd410a29fa859"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f59099f9b66f0d7145115e6f80dd8b1d847176df89b234a5a6b3f00437aa0832"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-win32.whl", hash = "sha256:4042d5c8f957e15221d423ba781e85d553722fc4113f523f2feb7b188cc34c5e"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:3946fa46a0cf3e4c8cb1cc52f56bb536310d34f25f01ca9b6c16afa767dab110"}, + {file = "charset_normalizer-3.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:80d04837f55fc81da168b98de4f4b797ef007fc8a79ab71c6ec9bc4dd662b15b"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c36c333c39be2dbca264d7803333c896ab8fa7d4d6f0ab7edb7dfd7aea6e98c0"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c2aed2e5e41f24ea8ef1590b8e848a79b56f3a5564a65ceec43c9d692dc7d8a"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:54523e136b8948060c0fa0bc7b1b50c32c186f2fceee897a495406bb6e311d2b"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:715479b9a2802ecac752a3b0efa2b0b60285cf962ee38414211abdfccc233b41"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bd6c2a1c7573c64738d716488d2cdd3c00e340e4835707d8fdb8dc1a66ef164e"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:c45e9440fb78f8ddabcf714b68f936737a121355bf59f3907f4e17721b9d1aae"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3534e7dcbdcf757da6b85a0bbf5b6868786d5982dd959b065e65481644817a18"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e8ac484bf18ce6975760921bb6148041faa8fef0547200386ea0b52b5d27bf7b"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a5fe03b42827c13cdccd08e6c0247b6a6d4b5e3cdc53fd1749f5896adcdc2356"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2d6eb928e13016cea4f1f21d1e10c1cebd5a421bc57ddf5b1142ae3f86824fab"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e74327fb75de8986940def6e8dee4f127cc9752bee7355bb323cc5b2659b6d46"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d6038d37043bced98a66e68d3aa2b6a35505dc01328cd65217cefe82f25def44"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7579e913a5339fb8fa133f6bbcfd8e6749696206cf05acdbdca71a1b436d8e72"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-win32.whl", hash = "sha256:5b77459df20e08151cd6f8b9ef8ef1f961ef73d85c21a555c7eed5b79410ec10"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-win_amd64.whl", hash = "sha256:92a0a01ead5e668468e952e4238cccd7c537364eb7d851ab144ab6627dbbe12f"}, + {file = "charset_normalizer-3.4.7-cp314-cp314-win_arm64.whl", hash = "sha256:67f6279d125ca0046a7fd386d01b311c6363844deac3e5b069b514ba3e63c246"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:effc3f449787117233702311a1b7d8f59cba9ced946ba727bdc329ec69028e24"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:733784b6d6def852c814bce5f318d25da2ee65dd4839a0718641c696e09a2960"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a89c23ef8d2c6b27fd200a42aa4ac72786e7c60d40efdc76e6011260b6e949c4"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c114670c45346afedc0d947faf3c7f701051d2518b943679c8ff88befe14f8e"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:a180c5e59792af262bf263b21a3c49353f25945d8d9f70628e73de370d55e1e1"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3c9a494bc5ec77d43cea229c4f6db1e4d8fe7e1bbffa8b6f0f0032430ff8ab44"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8d828b6667a32a728a1ad1d93957cdf37489c57b97ae6c4de2860fa749b8fc1e"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cf1493cd8607bec4d8a7b9b004e699fcf8f9103a9284cc94962cb73d20f9d4a3"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0c96c3b819b5c3e9e165495db84d41914d6894d55181d2d108cc1a69bfc9cce0"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:752a45dc4a6934060b3b0dab47e04edc3326575f82be64bc4fc293914566503e"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:8778f0c7a52e56f75d12dae53ae320fae900a8b9b4164b981b9c5ce059cd1fcb"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ce3412fbe1e31eb81ea42f4169ed94861c56e643189e1e75f0041f3fe7020abe"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-win32.whl", hash = "sha256:c03a41a8784091e67a39648f70c5f97b5b6a37f216896d44d2cdcb82615339a0"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-win_amd64.whl", hash = "sha256:03853ed82eeebbce3c2abfdbc98c96dc205f32a79627688ac9a27370ea61a49c"}, + {file = "charset_normalizer-3.4.7-cp314-cp314t-win_arm64.whl", hash = "sha256:c35abb8bfff0185efac5878da64c45dafd2b37fb0383add1be155a763c1f083d"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e5f4d355f0a2b1a31bc3edec6795b46324349c9cb25eed068049e4f472fb4259"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:16d971e29578a5e97d7117866d15889a4a07befe0e87e703ed63cd90cb348c01"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:dca4bbc466a95ba9c0234ef56d7dd9509f63da22274589ebd4ed7f1f4d4c54e3"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e80c8378d8f3d83cd3164da1ad2df9e37a666cdde7b1cb2298ed0b558064be30"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:36836d6ff945a00b88ba1e4572d721e60b5b8c98c155d465f56ad19d68f23734"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-manylinux_2_31_armv7l.whl", hash = "sha256:bd9b23791fe793e4968dba0c447e12f78e425c59fc0e3b97f6450f4781f3ee60"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:aef65cd602a6d0e0ff6f9930fcb1c8fec60dd2cfcb6facaf4bdb0e5873042db0"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:82b271f5137d07749f7bf32f70b17ab6eaabedd297e75dce75081a24f76eb545"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:1efde3cae86c8c273f1eb3b287be7d8499420cf2fe7585c41d370d3e790054a5"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:c593052c465475e64bbfe5dbd81680f64a67fdc752c56d7a0ae205dc8aeefe0f"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-musllinux_1_2_riscv64.whl", hash = "sha256:af21eb4409a119e365397b2adbaca4c9ccab56543a65d5dbd9f920d6ac29f686"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:84c018e49c3bf790f9c2771c45e9313a08c2c2a6342b162cd650258b57817706"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dd915403e231e6b1809fe9b6d9fc55cf8fb5e02765ac625d9cd623342a7905d7"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-win32.whl", hash = "sha256:320ade88cfb846b8cd6b4ddf5ee9e80ee0c1f52401f2456b84ae1ae6a1a5f207"}, + {file = "charset_normalizer-3.4.7-cp38-cp38-win_amd64.whl", hash = "sha256:1dc8b0ea451d6e69735094606991f32867807881400f808a106ee1d963c46a83"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:177a0ba5f0211d488e295aaf82707237e331c24788d8d76c96c5a41594723217"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e0d51f618228538a3e8f46bd246f87a6cd030565e015803691603f55e12afb5"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:14265bfe1f09498b9d8ec91e9ec9fa52775edf90fcbde092b25f4a33d444fea9"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:87fad7d9ba98c86bcb41b2dc8dbb326619be2562af1f8ff50776a39e55721c5a"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f22dec1690b584cea26fade98b2435c132c1b5f68e39f5a0b7627cd7ae31f1dc"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-manylinux_2_31_armv7l.whl", hash = "sha256:d61f00a0869d77422d9b2aba989e2d24afa6ffd552af442e0e58de4f35ea6d00"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6370e8686f662e6a3941ee48ed4742317cafbe5707e36406e9df792cdb535776"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a6c5863edfbe888d9eff9c8b8087354e27618d9da76425c119293f11712a6319"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:ed065083d0898c9d5b4bbec7b026fd755ff7454e6e8b73a67f8c744b13986e24"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:2cd4a60d0e2fb04537162c62bbbb4182f53541fe0ede35cdf270a1c1e723cc42"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:813c0e0132266c08eb87469a642cb30aaff57c5f426255419572aaeceeaa7bf4"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:07d9e39b01743c3717745f4c530a6349eadbfa043c7577eef86c502c15df2c67"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c0f081d69a6e58272819b70288d3221a6ee64b98df852631c80f293514d3b274"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-win32.whl", hash = "sha256:8751d2787c9131302398b11e6c8068053dcb55d5a8964e114b6e196cf16cb366"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-win_amd64.whl", hash = "sha256:12a6fff75f6bc66711b73a2f0addfc4c8c15a20e805146a02d147a318962c444"}, + {file = "charset_normalizer-3.4.7-cp39-cp39-win_arm64.whl", hash = "sha256:bb8cc7534f51d9a017b93e3e85b260924f909601c3df002bcdb58ddb4dc41a5c"}, + {file = "charset_normalizer-3.4.7-py3-none-any.whl", hash = "sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d"}, + {file = "charset_normalizer-3.4.7.tar.gz", hash = "sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5"}, ] [[package]] @@ -672,13 +688,13 @@ test = ["matplotlib", "pytest", "pytest-cov"] [[package]] name = "packaging" -version = "26.0" +version = "26.1" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529"}, - {file = "packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4"}, + {file = "packaging-26.1-py3-none-any.whl", hash = "sha256:5d9c0669c6285e491e0ced2eee587eaf67b670d94a19e94e3984a481aba6802f"}, + {file = "packaging-26.1.tar.gz", hash = "sha256:f042152b681c4bfac5cae2742a55e103d27ab2ec0f3d88037136b6bfe7c9c5de"}, ] [[package]] @@ -1246,58 +1262,58 @@ widechars = ["wcwidth"] [[package]] name = "tomli" -version = "2.4.0" +version = "2.4.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" files = [ - {file = "tomli-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867"}, - {file = "tomli-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9"}, - {file = "tomli-2.4.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:551e321c6ba03b55676970b47cb1b73f14a0a4dce6a3e1a9458fd6d921d72e95"}, - {file = "tomli-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e3f639a7a8f10069d0e15408c0b96a2a828cfdec6fca05296ebcdcc28ca7c76"}, - {file = "tomli-2.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b168f2731796b045128c45982d3a4874057626da0e2ef1fdd722848b741361d"}, - {file = "tomli-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:133e93646ec4300d651839d382d63edff11d8978be23da4cc106f5a18b7d0576"}, - {file = "tomli-2.4.0-cp311-cp311-win32.whl", hash = "sha256:b6c78bdf37764092d369722d9946cb65b8767bfa4110f902a1b2542d8d173c8a"}, - {file = "tomli-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:d3d1654e11d724760cdb37a3d7691f0be9db5fbdaef59c9f532aabf87006dbaa"}, - {file = "tomli-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:cae9c19ed12d4e8f3ebf46d1a75090e4c0dc16271c5bce1c833ac168f08fb614"}, - {file = "tomli-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:920b1de295e72887bafa3ad9f7a792f811847d57ea6b1215154030cf131f16b1"}, - {file = "tomli-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6d9a4aee98fac3eab4952ad1d73aee87359452d1c086b5ceb43ed02ddb16b8"}, - {file = "tomli-2.4.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36b9d05b51e65b254ea6c2585b59d2c4cb91c8a3d91d0ed0f17591a29aaea54a"}, - {file = "tomli-2.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c8a885b370751837c029ef9bc014f27d80840e48bac415f3412e6593bbc18c1"}, - {file = "tomli-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8768715ffc41f0008abe25d808c20c3d990f42b6e2e58305d5da280ae7d1fa3b"}, - {file = "tomli-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b438885858efd5be02a9a133caf5812b8776ee0c969fea02c45e8e3f296ba51"}, - {file = "tomli-2.4.0-cp312-cp312-win32.whl", hash = "sha256:0408e3de5ec77cc7f81960c362543cbbd91ef883e3138e81b729fc3eea5b9729"}, - {file = "tomli-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:685306e2cc7da35be4ee914fd34ab801a6acacb061b6a7abca922aaf9ad368da"}, - {file = "tomli-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:5aa48d7c2356055feef06a43611fc401a07337d5b006be13a30f6c58f869e3c3"}, - {file = "tomli-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84d081fbc252d1b6a982e1870660e7330fb8f90f676f6e78b052ad4e64714bf0"}, - {file = "tomli-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9a08144fa4cba33db5255f9b74f0b89888622109bd2776148f2597447f92a94e"}, - {file = "tomli-2.4.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c73add4bb52a206fd0c0723432db123c0c75c280cbd67174dd9d2db228ebb1b4"}, - {file = "tomli-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fb2945cbe303b1419e2706e711b7113da57b7db31ee378d08712d678a34e51e"}, - {file = "tomli-2.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bbb1b10aa643d973366dc2cb1ad94f99c1726a02343d43cbc011edbfac579e7c"}, - {file = "tomli-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4cbcb367d44a1f0c2be408758b43e1ffb5308abe0ea222897d6bfc8e8281ef2f"}, - {file = "tomli-2.4.0-cp313-cp313-win32.whl", hash = "sha256:7d49c66a7d5e56ac959cb6fc583aff0651094ec071ba9ad43df785abc2320d86"}, - {file = "tomli-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:3cf226acb51d8f1c394c1b310e0e0e61fecdd7adcb78d01e294ac297dd2e7f87"}, - {file = "tomli-2.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:d20b797a5c1ad80c516e41bc1fb0443ddb5006e9aaa7bda2d71978346aeb9132"}, - {file = "tomli-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:26ab906a1eb794cd4e103691daa23d95c6919cc2fa9160000ac02370cc9dd3f6"}, - {file = "tomli-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:20cedb4ee43278bc4f2fee6cb50daec836959aadaf948db5172e776dd3d993fc"}, - {file = "tomli-2.4.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:39b0b5d1b6dd03684b3fb276407ebed7090bbec989fa55838c98560c01113b66"}, - {file = "tomli-2.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a26d7ff68dfdb9f87a016ecfd1e1c2bacbe3108f4e0f8bcd2228ef9a766c787d"}, - {file = "tomli-2.4.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:20ffd184fb1df76a66e34bd1b36b4a4641bd2b82954befa32fe8163e79f1a702"}, - {file = "tomli-2.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:75c2f8bbddf170e8effc98f5e9084a8751f8174ea6ccf4fca5398436e0320bc8"}, - {file = "tomli-2.4.0-cp314-cp314-win32.whl", hash = "sha256:31d556d079d72db7c584c0627ff3a24c5d3fb4f730221d3444f3efb1b2514776"}, - {file = "tomli-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:43e685b9b2341681907759cf3a04e14d7104b3580f808cfde1dfdb60ada85475"}, - {file = "tomli-2.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:3d895d56bd3f82ddd6faaff993c275efc2ff38e52322ea264122d72729dca2b2"}, - {file = "tomli-2.4.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:5b5807f3999fb66776dbce568cc9a828544244a8eb84b84b9bafc080c99597b9"}, - {file = "tomli-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c084ad935abe686bd9c898e62a02a19abfc9760b5a79bc29644463eaf2840cb0"}, - {file = "tomli-2.4.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f2e3955efea4d1cfbcb87bc321e00dc08d2bcb737fd1d5e398af111d86db5df"}, - {file = "tomli-2.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e0fe8a0b8312acf3a88077a0802565cb09ee34107813bba1c7cd591fa6cfc8d"}, - {file = "tomli-2.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:413540dce94673591859c4c6f794dfeaa845e98bf35d72ed59636f869ef9f86f"}, - {file = "tomli-2.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0dc56fef0e2c1c470aeac5b6ca8cc7b640bb93e92d9803ddaf9ea03e198f5b0b"}, - {file = "tomli-2.4.0-cp314-cp314t-win32.whl", hash = "sha256:d878f2a6707cc9d53a1be1414bbb419e629c3d6e67f69230217bb663e76b5087"}, - {file = "tomli-2.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2add28aacc7425117ff6364fe9e06a183bb0251b03f986df0e78e974047571fd"}, - {file = "tomli-2.4.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2b1e3b80e1d5e52e40e9b924ec43d81570f0e7d09d11081b797bc4692765a3d4"}, - {file = "tomli-2.4.0-py3-none-any.whl", hash = "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a"}, - {file = "tomli-2.4.0.tar.gz", hash = "sha256:aa89c3f6c277dd275d8e243ad24f3b5e701491a860d5121f2cdd399fbb31fc9c"}, + {file = "tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30"}, + {file = "tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a"}, + {file = "tomli-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076"}, + {file = "tomli-2.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9"}, + {file = "tomli-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c"}, + {file = "tomli-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc"}, + {file = "tomli-2.4.1-cp311-cp311-win32.whl", hash = "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049"}, + {file = "tomli-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e"}, + {file = "tomli-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece"}, + {file = "tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a"}, + {file = "tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085"}, + {file = "tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9"}, + {file = "tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5"}, + {file = "tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585"}, + {file = "tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1"}, + {file = "tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917"}, + {file = "tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9"}, + {file = "tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257"}, + {file = "tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54"}, + {file = "tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a"}, + {file = "tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897"}, + {file = "tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f"}, + {file = "tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d"}, + {file = "tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5"}, + {file = "tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd"}, + {file = "tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36"}, + {file = "tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd"}, + {file = "tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf"}, + {file = "tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac"}, + {file = "tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662"}, + {file = "tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853"}, + {file = "tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15"}, + {file = "tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba"}, + {file = "tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6"}, + {file = "tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7"}, + {file = "tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232"}, + {file = "tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4"}, + {file = "tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c"}, + {file = "tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d"}, + {file = "tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41"}, + {file = "tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c"}, + {file = "tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f"}, + {file = "tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8"}, + {file = "tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26"}, + {file = "tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396"}, + {file = "tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe"}, + {file = "tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f"}, ] [[package]] diff --git a/reference.md b/reference.md index 6206656f..02741563 100644 --- a/reference.md +++ b/reference.md @@ -649,6 +649,7 @@ client = TrueFoundry( ) client.users.delete( id="id", + tenant_name="tenantName", ) ``` @@ -673,6 +674,14 @@ client.users.delete(
+**tenant_name:** `typing.Optional[str]` — Tenant name + +
+
+ +
+
+ **request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
@@ -824,6 +833,14 @@ client.users.deactivate(
+**tenant_name:** `typing.Optional[str]` — Tenant name + +
+
+ +
+
+ **request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
@@ -895,6 +912,14 @@ client.users.activate(
+**tenant_name:** `typing.Optional[str]` — Tenant name + +
+
+ +
+
+ **request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
@@ -1063,6 +1088,77 @@ client.users.get_resources(
+ +
+ + +
client.users.get_permissions(...) -> AsyncHttpResponse[GetUserPermissionsResponse] +
+
+ +#### 📝 Description + +
+
+ +
+
+ +Get all role bindings associated with a user, including team-inherited bindings. +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from truefoundry_sdk import TrueFoundry + +client = TrueFoundry( + api_key="YOUR_API_KEY", + base_url="https://yourhost.com/path/to/api", +) +client.users.get_permissions( + id="id", +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `str` — User Id + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ +
@@ -1079,7 +1175,7 @@ client.users.get_resources(
-Get all manual teams associated with a user. +Get all teams associated with a user, including their role in each team.
@@ -1454,6 +1550,77 @@ client.teams.delete(
+ + + + +
client.teams.get_permissions(...) -> AsyncHttpResponse[GetTeamPermissionsResponse] +
+
+ +#### 📝 Description + +
+
+ +
+
+ +Get all role bindings associated with a team. +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from truefoundry_sdk import TrueFoundry + +client = TrueFoundry( + api_key="YOUR_API_KEY", + base_url="https://yourhost.com/path/to/api", +) +client.teams.get_permissions( + id="id", +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `str` — Team Id + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ +
@@ -1495,6 +1662,7 @@ client = TrueFoundry( response = client.personal_access_tokens.list( limit=10, offset=0, + name_search_query="nameSearchQuery", ) for item in response: yield item @@ -1532,6 +1700,14 @@ for page in response.iter_pages():
+**name_search_query:** `typing.Optional[str]` — Return personal access tokens with names that contain this string + +
+
+ +
+
+ **request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
@@ -1882,6 +2058,8 @@ response = client.virtual_accounts.list( limit=10, offset=0, name_search_query="nameSearchQuery", + is_expired=True, + filter="filter", ) for item in response: yield item @@ -1927,6 +2105,30 @@ for page in response.iter_pages():
+**owned_by_teams:** `typing.Optional[typing.Union[str, typing.Sequence[str]]]` — Return virtual accounts owned by these teams + +
+
+ +
+
+ +**is_expired:** `typing.Optional[bool]` — Filter virtual accounts by expiration status. true = expired, false = not expired + +
+
+ +
+
+ +**filter:** `typing.Optional[str]` — JSON string: structured filter tree (AND/OR groups, column leaves on `name`, json_map leaves on manifest.tags). + +
+
+ +
+
+ **request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
@@ -2953,8 +3155,8 @@ client.clusters.is_connected(
-## Environments -
client.environments.list(...) -> AsyncPager[Environment, ListEnvironmentsResponse] +## Applications +
client.applications.list(...) -> AsyncPager[Application, ListApplicationsResponse]
@@ -2966,7 +3168,7 @@ client.clusters.is_connected(
-List environments, if no environments are found, default environments are created and returned. Pagination is available based on query parameters +Retrieves a list of all latest applications. Supports filtering by application ID, name, type, and other parameters. Pagination is available based on query parameters.
@@ -2982,14 +3184,33 @@ List environments, if no environments are found, default environments are create ```python from truefoundry_sdk import TrueFoundry +from truefoundry_sdk.applications import ( + ApplicationsListRequestDeviceTypeFilter, + ApplicationsListRequestLifecycleStage, +) client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -response = client.environments.list( +response = client.applications.list( limit=10, offset=0, + application_id="applicationId", + workspace_id="workspaceId", + application_name="applicationName", + fqn="fqn", + workspace_fqn="workspaceFqn", + application_type="applicationType", + name_search_query="nameSearchQuery", + environment_id="environmentId", + cluster_id="clusterId", + application_set_id="applicationSetId", + paused=True, + device_type_filter=ApplicationsListRequestDeviceTypeFilter.CPU, + last_deployed_by_subjects="lastDeployedBySubjects", + lifecycle_stage=ApplicationsListRequestLifecycleStage.ACTIVE, + is_recommendation_present_and_visible=True, ) for item in response: yield item @@ -3027,80 +3248,111 @@ for page in response.iter_pages():
-**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. +**application_id:** `typing.Optional[str]` — Application id of the application
+ +
+
+ +**workspace_id:** `typing.Optional[str]` — Workspace id of the application (comma separated for multiple) +
+
+
+**application_name:** `typing.Optional[str]` — Name of application +
-
-
client.environments.create_or_update(...) -> AsyncHttpResponse[GetEnvironmentResponse]
-#### 📝 Description +**fqn:** `typing.Optional[str]` — Fully qualified name (FQN) of the application + +
+
+**workspace_fqn:** `typing.Optional[str]` — Fully qualified name (FQN) of the workspace + +
+
+
-Creates a new Environment or updates an existing Environment. +**application_type:** `typing.Optional[str]` — Type of application (comma separated for multiple). Allowed Values: async-service, service, job, spark-job, helm, notebook, codeserver, rstudio, ssh-server, volume, application, application-set, intercept, workflow +
+ +
+
+ +**name_search_query:** `typing.Optional[str]` — Search query for application name +
-#### 🔌 Usage -
+**environment_id:** `typing.Optional[str]` — Filter by Environment ids of the application (comma separated for multiple) + +
+
+
-```python -from truefoundry_sdk import ( - EnvironmentColor, - EnvironmentManifest, - EnvironmentOptimizeFor, - TrueFoundry, -) +**cluster_id:** `typing.Optional[str]` — Filter by Cluster ids of the application (comma separated for multiple) + +
+
-client = TrueFoundry( - api_key="YOUR_API_KEY", - base_url="https://yourhost.com/path/to/api", -) -client.environments.create_or_update( - manifest=EnvironmentManifest( - name="name", - color=EnvironmentColor(), - is_production=True, - optimize_for=EnvironmentOptimizeFor.COST, - ), -) +
+
-``` +**application_set_id:** `typing.Optional[str]` — Filter by Application Set id of the application +
+ +
+
+ +**paused:** `typing.Optional[bool]` — Filter by Application Paused status +
-#### ⚙️ Parameters +
+
+ +**device_type_filter:** `typing.Optional[ApplicationsListRequestDeviceTypeFilter]` — Filter by device type of the application. Allowed values: cpu, nvidia_gpu, aws_inferentia, nvidia_mig_gpu, nvidia_timeslicing_gpu, gcp_tpu + +
+
+**last_deployed_by_subjects:** `typing.Optional[str]` — Filter by last deployed by specific users + +
+
+
-**manifest:** `EnvironmentManifest` — Environment Manifest +**lifecycle_stage:** `typing.Optional[ApplicationsListRequestLifecycleStage]` — Filter by application lifecycle state
@@ -3108,7 +3360,7 @@ client.environments.create_or_update(
-**dry_run:** `typing.Optional[bool]` — Dry run +**is_recommendation_present_and_visible:** `typing.Optional[bool]` — Filter out applications with recommendations that are allowed to be shown
@@ -3128,7 +3380,7 @@ client.environments.create_or_update(
-
client.environments.get(...) -> AsyncHttpResponse[GetEnvironmentResponse] +
client.applications.create_or_update(...) -> AsyncHttpResponse[GetApplicationDeploymentResponse]
@@ -3140,7 +3392,7 @@ client.environments.create_or_update(
-Get Environment associated with the provided id. +Create a new Application Deployment based on the provided manifest.
@@ -3161,8 +3413,8 @@ client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -client.environments.get( - id="id", +client.applications.create_or_update( + manifest={"key": "value"}, ) ``` @@ -3179,7 +3431,63 @@ client.environments.get(
-**id:** `str` — Environment id +**manifest:** `typing.Dict[str, typing.Any]` — Manifest of application + +
+
+ +
+
+ +**dry_run:** `typing.Optional[bool]` — Dry run + +
+
+ +
+
+ +**force_deploy:** `typing.Optional[bool]` — Cancels any ongoing deployments + +
+
+ +
+
+ +**trigger_on_deploy:** `typing.Optional[bool]` — Trigger on deploy + +
+
+ +
+
+ +**workspace_id:** `typing.Optional[str]` — workspace id of the workspace + +
+
+ +
+
+ +**application_id:** `typing.Optional[str]` — Id of the application + +
+
+ +
+
+ +**name:** `typing.Optional[str]` — Name of application + +
+
+ +
+
+ +**application_set_id:** `typing.Optional[str]` — Application Set Id
@@ -3199,7 +3507,7 @@ client.environments.get(
-
client.environments.delete(...) -> AsyncHttpResponse[bool] +
client.applications.get(...) -> AsyncHttpResponse[GetApplicationResponse]
@@ -3211,7 +3519,7 @@ client.environments.get(
-Delete Environment associated with the provided id. +Get Application associated with the provided application ID.
@@ -3232,7 +3540,7 @@ client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -client.environments.delete( +client.applications.get( id="id", ) @@ -3250,7 +3558,7 @@ client.environments.delete(
-**id:** `str` — Environment id +**id:** `str` — Id of the application
@@ -3270,8 +3578,7 @@ client.environments.delete(
-## Applications -
client.applications.list(...) -> AsyncPager[Application, ListApplicationsResponse] +
client.applications.delete(...) -> AsyncHttpResponse[DeleteApplicationResponse]
@@ -3283,7 +3590,7 @@ client.environments.delete(
-Retrieves a list of all latest applications. Supports filtering by application ID, name, type, and other parameters. Pagination is available based on query parameters. +Delete Application associated with the provided application ID.
@@ -3299,39 +3606,14 @@ Retrieves a list of all latest applications. Supports filtering by application I ```python from truefoundry_sdk import TrueFoundry -from truefoundry_sdk.applications import ( - ApplicationsListRequestDeviceTypeFilter, - ApplicationsListRequestLifecycleStage, -) client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -response = client.applications.list( - limit=10, - offset=0, - application_id="applicationId", - workspace_id="workspaceId", - application_name="applicationName", - fqn="fqn", - workspace_fqn="workspaceFqn", - application_type="applicationType", - name_search_query="nameSearchQuery", - environment_id="environmentId", - cluster_id="clusterId", - application_set_id="applicationSetId", - paused=True, - device_type_filter=ApplicationsListRequestDeviceTypeFilter.CPU, - last_deployed_by_subjects="lastDeployedBySubjects", - lifecycle_stage=ApplicationsListRequestLifecycleStage.ACTIVE, - is_recommendation_present_and_visible=True, +client.applications.delete( + id="id", ) -for item in response: - yield item -# alternatively, you can paginate page-by-page -for page in response.iter_pages(): - yield page ``` @@ -3347,7 +3629,7 @@ for page in response.iter_pages():
-**limit:** `typing.Optional[int]` — Number of items per page +**id:** `str` — Id of the application
@@ -3355,119 +3637,71 @@ for page in response.iter_pages():
-**offset:** `typing.Optional[int]` — Number of items to skip +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
- -
-
- -**application_id:** `typing.Optional[str]` — Application id of the application -
-
-
-**workspace_id:** `typing.Optional[str]` — Workspace id of the application (comma separated for multiple) -
+
+
client.applications.redeploy(...) -> AsyncHttpResponse[GetApplicationDeploymentResponse]
-**application_name:** `typing.Optional[str]` — Name of application - -
-
+#### 📝 Description
-**fqn:** `typing.Optional[str]` — Fully qualified name (FQN) of the application - -
-
-
-**workspace_fqn:** `typing.Optional[str]` — Fully qualified name (FQN) of the workspace - +Creates a new deployment with the same manifest as the given deployment.
- -
-
- -**application_type:** `typing.Optional[str]` — Type of application (comma separated for multiple). Allowed Values: async-service, service, job, spark-job, helm, notebook, codeserver, rstudio, ssh-server, volume, application, application-set, intercept, workflow -
-
-
- -**name_search_query:** `typing.Optional[str]` — Search query for application name - -
-
+#### 🔌 Usage
-**environment_id:** `typing.Optional[str]` — Filter by Environment ids of the application (comma separated for multiple) - -
-
-
-**cluster_id:** `typing.Optional[str]` — Filter by Cluster ids of the application (comma separated for multiple) - -
-
+```python +from truefoundry_sdk import TrueFoundry -
-
+client = TrueFoundry( + api_key="YOUR_API_KEY", + base_url="https://yourhost.com/path/to/api", +) +client.applications.redeploy( + id="id", + deployment_id="deploymentId", +) -**application_set_id:** `typing.Optional[str]` — Filter by Application Set id of the application - +```
- -
-
- -**paused:** `typing.Optional[bool]` — Filter by Application Paused status -
-
-
- -**device_type_filter:** `typing.Optional[ApplicationsListRequestDeviceTypeFilter]` — Filter by device type of the application. Allowed values: cpu, nvidia_gpu, aws_inferentia, nvidia_mig_gpu, nvidia_timeslicing_gpu, gcp_tpu - -
-
+#### ⚙️ Parameters
-**last_deployed_by_subjects:** `typing.Optional[str]` — Filter by last deployed by specific users - -
-
-
-**lifecycle_stage:** `typing.Optional[ApplicationsListRequestLifecycleStage]` — Filter by application lifecycle state +**id:** `str` — Application id of the application
@@ -3475,7 +3709,7 @@ for page in response.iter_pages():
-**is_recommendation_present_and_visible:** `typing.Optional[bool]` — Filter out applications with recommendations that are allowed to be shown +**deployment_id:** `str` — Deployment id of the deployment
@@ -3495,7 +3729,7 @@ for page in response.iter_pages():
-
client.applications.create_or_update(...) -> AsyncHttpResponse[GetApplicationDeploymentResponse] +
client.applications.scale_to_zero(...) -> AsyncHttpResponse[None]
@@ -3507,7 +3741,7 @@ for page in response.iter_pages():
-Create a new Application Deployment based on the provided manifest. +Pause a running application by scaling to 0 replicas
@@ -3528,8 +3762,8 @@ client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -client.applications.create_or_update( - manifest={"key": "value"}, +client.applications.scale_to_zero( + id="id", ) ``` @@ -3546,7 +3780,7 @@ client.applications.create_or_update(
-**manifest:** `typing.Dict[str, typing.Any]` — Manifest of application +**id:** `str` — Id of the application
@@ -3554,55 +3788,70 @@ client.applications.create_or_update(
-**dry_run:** `typing.Optional[bool]` — Dry run +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+ +
-
-
-**force_deploy:** `typing.Optional[bool]` — Cancels any ongoing deployments -
+
+
client.applications.scale_to_original(...) -> AsyncHttpResponse[Deployment]
-**trigger_on_deploy:** `typing.Optional[bool]` — Trigger on deploy - -
-
+#### 📝 Description
-**workspace_id:** `typing.Optional[str]` — workspace id of the workspace - -
-
-
-**application_id:** `typing.Optional[str]` — Id of the application - +Resume a paused application by scaling back to the original number of replicas +
+
+#### 🔌 Usage +
-**name:** `typing.Optional[str]` — Name of application - +
+
+ +```python +from truefoundry_sdk import TrueFoundry + +client = TrueFoundry( + api_key="YOUR_API_KEY", + base_url="https://yourhost.com/path/to/api", +) +client.applications.scale_to_original( + id="id", +) + +```
+
+
+ +#### ⚙️ Parameters
-**application_set_id:** `typing.Optional[str]` — Application Set Id +
+
+ +**id:** `str` — Id of the application
@@ -3622,7 +3871,7 @@ client.applications.create_or_update(
-
client.applications.get(...) -> AsyncHttpResponse[GetApplicationResponse] +
client.applications.cancel_deployment(...) -> AsyncHttpResponse[ApplicationsCancelDeploymentResponse]
@@ -3634,7 +3883,7 @@ client.applications.create_or_update(
-Get Application associated with the provided application ID. +Cancel an ongoing deployment associated with the provided application ID and deployment ID.
@@ -3655,8 +3904,9 @@ client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -client.applications.get( +client.applications.cancel_deployment( id="id", + deployment_id="deploymentId", ) ``` @@ -3673,7 +3923,15 @@ client.applications.get(
-**id:** `str` — Id of the application +**id:** `str` — Application id of the application + +
+
+ +
+
+ +**deployment_id:** `str` — Deployment id of the deployment
@@ -3693,7 +3951,8 @@ client.applications.get(
-
client.applications.delete(...) -> AsyncHttpResponse[DeleteApplicationResponse] +## ApplicationVersions +
client.application_versions.list(...) -> AsyncPager[Deployment, ListApplicationDeploymentsResponse]
@@ -3705,7 +3964,7 @@ client.applications.get(
-Delete Application associated with the provided application ID. +Fetch all deployments for a given application ID with optional filters such as deployment ID or version. Supports pagination.
@@ -3726,9 +3985,18 @@ client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -client.applications.delete( +response = client.application_versions.list( id="id", + limit=10, + offset=0, + version="1", + deployment_id="deployment123", ) +for item in response: + yield item +# alternatively, you can paginate page-by-page +for page in response.iter_pages(): + yield page ``` @@ -3752,6 +4020,38 @@ client.applications.delete(
+**limit:** `typing.Optional[int]` — Number of items per page + +
+
+ +
+
+ +**offset:** `typing.Optional[int]` — Number of items to skip + +
+
+ +
+
+ +**version:** `typing.Optional[str]` — Deployment version. Filter deployments by version. + +
+
+ +
+
+ +**deployment_id:** `typing.Optional[str]` — Deployment ID. Filter deployments by a specific ID. + +
+
+ +
+
+ **request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
@@ -3764,7 +4064,7 @@ client.applications.delete(
-
client.applications.redeploy(...) -> AsyncHttpResponse[GetApplicationDeploymentResponse] +
client.application_versions.get(...) -> AsyncHttpResponse[GetApplicationDeploymentResponse]
@@ -3776,7 +4076,7 @@ client.applications.delete(
-Creates a new deployment with the same manifest as the given deployment. +Get Deployment associated with the provided application ID and deployment ID.
@@ -3797,7 +4097,7 @@ client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -client.applications.redeploy( +client.application_versions.get( id="id", deployment_id="deploymentId", ) @@ -3844,7 +4144,8 @@ client.applications.redeploy(
-
client.applications.scale_to_zero(...) -> AsyncHttpResponse[None] +## Jobs +
client.jobs.list_runs(...) -> AsyncPager[JobRun, ListJobRunResponse]
@@ -3856,7 +4157,7 @@ client.applications.redeploy(
-Pause a running application by scaling to 0 replicas +List Job Runs for provided Job Id. Filter the data based on parameters passed in the query
@@ -3871,15 +4172,25 @@ Pause a running application by scaling to 0 replicas
```python -from truefoundry_sdk import TrueFoundry +from truefoundry_sdk import JobRunsSortBy, SortDirection, TrueFoundry client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -client.applications.scale_to_zero( - id="id", +response = client.jobs.list_runs( + job_id="jobId", + limit=10, + offset=0, + search_prefix="searchPrefix", + sort_by=JobRunsSortBy.START_TIME, + order=SortDirection.ASC, ) +for item in response: + yield item +# alternatively, you can paginate page-by-page +for page in response.iter_pages(): + yield page ```
@@ -3895,7 +4206,7 @@ client.applications.scale_to_zero(
-**id:** `str` — Id of the application +**job_id:** `str` — Job id of the application
@@ -3903,70 +4214,63 @@ client.applications.scale_to_zero(
-**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. +**limit:** `typing.Optional[int]` — Number of items per page
- -
+
+
+**offset:** `typing.Optional[int]` — Number of items to skip +
-
-
client.applications.scale_to_original(...) -> AsyncHttpResponse[Deployment]
-#### 📝 Description - -
-
+**search_prefix:** `typing.Optional[str]` — Prefix used to search for job runs by name or identifier + +
+
-Resume a paused application by scaling back to the original number of replicas -
-
+**sort_by:** `typing.Optional[JobRunsSortBy]` — Attribute to sort by +
-#### 🔌 Usage -
+**order:** `typing.Optional[SortDirection]` — Sorting order + +
+
+
-```python -from truefoundry_sdk import TrueFoundry - -client = TrueFoundry( - api_key="YOUR_API_KEY", - base_url="https://yourhost.com/path/to/api", -) -client.applications.scale_to_original( - id="id", -) - -``` -
-
+**triggered_by:** `typing.Optional[typing.Union[str, typing.Sequence[str]]]` — Array of subject slugs + -#### ⚙️ Parameters -
+**status:** `typing.Optional[typing.Union[JobRunStatus, typing.Sequence[JobRunStatus]]]` — Status of the job run + +
+
+
-**id:** `str` — Id of the application +**version_numbers:** `typing.Optional[typing.Union[float, typing.Sequence[float]]]` — Version number of the deployment
@@ -3986,7 +4290,7 @@ client.applications.scale_to_original(
-
client.applications.cancel_deployment(...) -> AsyncHttpResponse[ApplicationsCancelDeploymentResponse] +
client.jobs.get_run(...) -> AsyncHttpResponse[GetJobRunResponse]
@@ -3998,7 +4302,7 @@ client.applications.scale_to_original(
-Cancel an ongoing deployment associated with the provided application ID and deployment ID. +Get Job Run for provided jobRunName and jobId
@@ -4019,9 +4323,9 @@ client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -client.applications.cancel_deployment( - id="id", - deployment_id="deploymentId", +client.jobs.get_run( + job_id="jobId", + job_run_name="jobRunName", ) ``` @@ -4038,7 +4342,7 @@ client.applications.cancel_deployment(
-**id:** `str` — Application id of the application +**job_id:** `str` — Application Id of JOB
@@ -4046,7 +4350,7 @@ client.applications.cancel_deployment(
-**deployment_id:** `str` — Deployment id of the deployment +**job_run_name:** `str` — Job run name of the application
@@ -4066,8 +4370,7 @@ client.applications.cancel_deployment(
-## ApplicationVersions -
client.application_versions.list(...) -> AsyncPager[Deployment, ListApplicationDeploymentsResponse] +
client.jobs.delete_run(...) -> AsyncHttpResponse[DeleteJobRunResponse]
@@ -4079,7 +4382,7 @@ client.applications.cancel_deployment(
-Fetch all deployments for a given application ID with optional filters such as deployment ID or version. Supports pagination. +Delete Job Run for provided jobRunName and jobId
@@ -4100,18 +4403,10 @@ client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -response = client.application_versions.list( - id="id", - limit=10, - offset=0, - version="1", - deployment_id="deployment123", +client.jobs.delete_run( + job_id="jobId", + job_run_name="jobRunName", ) -for item in response: - yield item -# alternatively, you can paginate page-by-page -for page in response.iter_pages(): - yield page ``` @@ -4127,7 +4422,7 @@ for page in response.iter_pages():
-**id:** `str` — Id of the application +**job_id:** `str` — Application Id of JOB
@@ -4135,7 +4430,7 @@ for page in response.iter_pages():
-**limit:** `typing.Optional[int]` — Number of items per page +**job_run_name:** `str` — Job run name of the application
@@ -4143,55 +4438,31 @@ for page in response.iter_pages():
-**offset:** `typing.Optional[int]` — Number of items to skip +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+ +
-
-
-**version:** `typing.Optional[str]` — Deployment version. Filter deployments by version. -
+
+
client.jobs.trigger(...) -> AsyncHttpResponse[TriggerJobRunResponse]
-**deployment_id:** `typing.Optional[str]` — Deployment ID. Filter deployments by a specific ID. - -
-
+#### 📝 Description
-**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. - -
-
- - - - - - -
- -
client.application_versions.get(...) -> AsyncHttpResponse[GetApplicationDeploymentResponse] -
-
- -#### 📝 Description -
-
-
- -Get Deployment associated with the provided application ID and deployment ID. +Trigger Job for provided deploymentId or applicationId
@@ -4212,10 +4483,7 @@ client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -client.application_versions.get( - id="id", - deployment_id="deploymentId", -) +client.jobs.trigger() ```
@@ -4231,7 +4499,7 @@ client.application_versions.get(
-**id:** `str` — Application id of the application +**deployment_id:** `typing.Optional[str]` — Deployment Id of the job
@@ -4239,7 +4507,23 @@ client.application_versions.get(
-**deployment_id:** `str` — Deployment id of the deployment +**application_id:** `typing.Optional[str]` — Application Id of the job + +
+
+ +
+
+ +**input:** `typing.Optional[TriggerJobRequestInput]` — Job trigger input + +
+
+ +
+
+ +**metadata:** `typing.Optional[Metadata]` — Metadata for the job run including job_alias_name
@@ -4259,8 +4543,7 @@ client.application_versions.get(
-## Jobs -
client.jobs.list_runs(...) -> AsyncPager[JobRun, ListJobRunResponse] +
client.jobs.terminate(...) -> AsyncHttpResponse[TerminateJobResponse]
@@ -4272,7 +4555,7 @@ client.application_versions.get(
-List Job Runs for provided Job Id. Filter the data based on parameters passed in the query +Terminate Job for provided deploymentId and jobRunName
@@ -4287,25 +4570,16 @@ List Job Runs for provided Job Id. Filter the data based on parameters passed in
```python -from truefoundry_sdk import JobRunsSortBy, SortDirection, TrueFoundry +from truefoundry_sdk import TrueFoundry client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -response = client.jobs.list_runs( - job_id="jobId", - limit=10, - offset=0, - search_prefix="searchPrefix", - sort_by=JobRunsSortBy.START_TIME, - order=SortDirection.ASC, +client.jobs.terminate( + deployment_id="deploymentId", + job_run_name="jobRunName", ) -for item in response: - yield item -# alternatively, you can paginate page-by-page -for page in response.iter_pages(): - yield page ```
@@ -4321,63 +4595,7 @@ for page in response.iter_pages():
-**job_id:** `str` — Job id of the application - -
-
- -
-
- -**limit:** `typing.Optional[int]` — Number of items per page - -
-
- -
-
- -**offset:** `typing.Optional[int]` — Number of items to skip - -
-
- -
-
- -**search_prefix:** `typing.Optional[str]` — Prefix used to search for job runs by name or identifier - -
-
- -
-
- -**sort_by:** `typing.Optional[JobRunsSortBy]` — Attribute to sort by - -
-
- -
-
- -**order:** `typing.Optional[SortDirection]` — Sorting order - -
-
- -
-
- -**triggered_by:** `typing.Optional[typing.Union[str, typing.Sequence[str]]]` — Array of subject slugs - -
-
- -
-
- -**status:** `typing.Optional[typing.Union[JobRunStatus, typing.Sequence[JobRunStatus]]]` — Status of the job run +**deployment_id:** `str` — Deployment Id of the Deployment
@@ -4385,7 +4603,7 @@ for page in response.iter_pages():
-**version_numbers:** `typing.Optional[typing.Union[float, typing.Sequence[float]]]` — Version number of the deployment +**job_run_name:** `str` — Job Run name
@@ -4405,7 +4623,8 @@ for page in response.iter_pages():
-
client.jobs.get_run(...) -> AsyncHttpResponse[GetJobRunResponse] +## Environments +
client.environments.list(...) -> AsyncPager[Environment, ListEnvironmentsResponse]
@@ -4417,7 +4636,7 @@ for page in response.iter_pages():
-Get Job Run for provided jobRunName and jobId +List environments, if no environments are found, default environments are created and returned. Pagination is available based on query parameters
@@ -4438,10 +4657,15 @@ client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -client.jobs.get_run( - job_id="jobId", - job_run_name="jobRunName", +response = client.environments.list( + limit=10, + offset=0, ) +for item in response: + yield item +# alternatively, you can paginate page-by-page +for page in response.iter_pages(): + yield page ``` @@ -4457,7 +4681,7 @@ client.jobs.get_run(
-**job_id:** `str` — Application Id of JOB +**limit:** `typing.Optional[int]` — Number of items per page
@@ -4465,7 +4689,7 @@ client.jobs.get_run(
-**job_run_name:** `str` — Job run name of the application +**offset:** `typing.Optional[int]` — Number of items to skip
@@ -4485,7 +4709,7 @@ client.jobs.get_run(
-
client.jobs.delete_run(...) -> AsyncHttpResponse[DeleteJobRunResponse] +
client.environments.create_or_update(...) -> AsyncHttpResponse[GetEnvironmentResponse]
@@ -4497,7 +4721,7 @@ client.jobs.get_run(
-Delete Job Run for provided jobRunName and jobId +Creates a new Environment or updates an existing Environment.
@@ -4512,15 +4736,24 @@ Delete Job Run for provided jobRunName and jobId
```python -from truefoundry_sdk import TrueFoundry +from truefoundry_sdk import ( + EnvironmentColor, + EnvironmentManifest, + EnvironmentOptimizeFor, + TrueFoundry, +) client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -client.jobs.delete_run( - job_id="jobId", - job_run_name="jobRunName", +client.environments.create_or_update( + manifest=EnvironmentManifest( + name="name", + color=EnvironmentColor(), + is_production=True, + optimize_for=EnvironmentOptimizeFor.COST, + ), ) ``` @@ -4537,7 +4770,7 @@ client.jobs.delete_run(
-**job_id:** `str` — Application Id of JOB +**manifest:** `EnvironmentManifest` — Environment Manifest
@@ -4545,7 +4778,7 @@ client.jobs.delete_run(
-**job_run_name:** `str` — Job run name of the application +**dry_run:** `typing.Optional[bool]` — Dry run
@@ -4565,7 +4798,7 @@ client.jobs.delete_run(
-
client.jobs.trigger(...) -> AsyncHttpResponse[TriggerJobRunResponse] +
client.environments.get(...) -> AsyncHttpResponse[GetEnvironmentResponse]
@@ -4577,7 +4810,7 @@ client.jobs.delete_run(
-Trigger Job for provided deploymentId or applicationId +Get Environment associated with the provided id.
@@ -4598,7 +4831,9 @@ client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -client.jobs.trigger() +client.environments.get( + id="id", +) ``` @@ -4614,31 +4849,7 @@ client.jobs.trigger()
-**deployment_id:** `typing.Optional[str]` — Deployment Id of the job - -
-
- -
-
- -**application_id:** `typing.Optional[str]` — Application Id of the job - -
-
- -
-
- -**input:** `typing.Optional[TriggerJobRequestInput]` — Job trigger input - -
-
- -
-
- -**metadata:** `typing.Optional[Metadata]` — Metadata for the job run including job_alias_name +**id:** `str` — Environment id
@@ -4658,7 +4869,7 @@ client.jobs.trigger()
-
client.jobs.terminate(...) -> AsyncHttpResponse[TerminateJobResponse] +
client.environments.delete(...) -> AsyncHttpResponse[bool]
@@ -4670,7 +4881,7 @@ client.jobs.trigger()
-Terminate Job for provided deploymentId and jobRunName +Delete Environment associated with the provided id.
@@ -4691,9 +4902,8 @@ client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -client.jobs.terminate( - deployment_id="deploymentId", - job_run_name="jobRunName", +client.environments.delete( + id="id", ) ``` @@ -4710,15 +4920,7 @@ client.jobs.terminate(
-**deployment_id:** `str` — Deployment Id of the Deployment - -
-
- -
-
- -**job_run_name:** `str` — Job Run name +**id:** `str` — Environment id
@@ -4751,7 +4953,7 @@ client.jobs.terminate(
-List workspaces associated with the user. Optional filters include clusterId, fqn, and workspace name. Pagination is available based on query parameters. +List workspaces associated with the user. Optional filters include clusterId, fqn, and workspace name.
@@ -4778,6 +4980,7 @@ response = client.workspaces.list( cluster_id="clusterId", name="name", fqn="fqn", + include_cluster=True, ) for item in response: yield item @@ -4839,6 +5042,14 @@ for page in response.iter_pages():
+**include_cluster:** `typing.Optional[bool]` — When true, each workspace includes cluster information + +
+
+ +
+
+ **request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
@@ -4933,7 +5144,7 @@ client.workspaces.create_or_update(
-
client.workspaces.get(...) -> AsyncHttpResponse[GetWorkspaceResponse] +
client.workspaces.search(...) -> AsyncPager[Workspace, ListWorkspacesResponse]
@@ -4945,7 +5156,7 @@ client.workspaces.create_or_update(
-Get workspace associated with provided workspace id +List workspaces the user can read with optional structured `filter` (name, id, environmentId, cluster_fqn) and pagination.
@@ -4966,9 +5177,17 @@ client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -client.workspaces.get( - id="id", +response = client.workspaces.search( + limit=10, + offset=0, + filter="filter", + include_cluster=True, ) +for item in response: + yield item +# alternatively, you can paginate page-by-page +for page in response.iter_pages(): + yield page ``` @@ -4984,7 +5203,7 @@ client.workspaces.get(
-**id:** `str` — Workspace id of the space +**limit:** `typing.Optional[int]` — Number of items per page
@@ -4992,23 +5211,118 @@ client.workspaces.get(
-**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. +**offset:** `typing.Optional[int]` — Number of items to skip
- -
+
+
+**filter:** `typing.Optional[str]` — JSON string containing array of search filters with string, type and operator +
-
-
client.workspaces.delete(...) -> AsyncHttpResponse[WorkspacesDeleteResponse]
-#### 📝 Description +**include_cluster:** `typing.Optional[bool]` — When true, each workspace includes cluster information + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+ + + + + + +
+ +
client.workspaces.get(...) -> AsyncHttpResponse[GetWorkspaceResponse] +
+
+ +#### 📝 Description + +
+
+ +
+
+ +Get workspace associated with provided workspace id +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from truefoundry_sdk import TrueFoundry + +client = TrueFoundry( + api_key="YOUR_API_KEY", + base_url="https://yourhost.com/path/to/api", +) +client.workspaces.get( + id="id", +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `str` — Workspace id of the space + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ + +
+
+
+ +
client.workspaces.delete(...) -> AsyncHttpResponse[WorkspacesDeleteResponse] +
+
+ +#### 📝 Description
@@ -5601,6 +5915,14 @@ client.secret_groups.create_or_update(
+**dry_run:** `typing.Optional[bool]` — Validate the manifest and collaborators without persisting or updating authorizations and secret groups + +
+
+ +
+
+ **request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
@@ -6352,6 +6674,14 @@ client.ml_repos.create_or_update(
+**dry_run:** `typing.Optional[bool]` — Validate the manifest and collaborators without persisting changes or updating artifact location in the database + +
+
+ +
+
+ **request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
@@ -6376,13 +6706,7 @@ client.ml_repos.create_or_update(
-Get a ml repo by id -Args: - id: Unique identifier of the ml repo to get - user_info: Authenticated user information - -Returns: - GetMLRepoResponse: The ml repo +Get an ML Repo by its ID.
@@ -6453,13 +6777,7 @@ client.ml_repos.get(
-Delete a ml repo -Args: - id: Unique identifier of the ml repo to delete - user_info: Authenticated user information - -Returns: - EmptyResponse: Empty response indicating successful deletion +Delete an ML Repo by its ID.
@@ -6530,13 +6848,7 @@ client.ml_repos.delete(
-List ml repos -Args: - filters: Filters for the ml repos - user_info: Authenticated user information - -Returns: - ListMLReposResponse: List of ml repos +List ML Repos with optional filtering by name.
@@ -6582,7 +6894,7 @@ for page in response.iter_pages():
-**name:** `typing.Optional[str]` +**name:** `typing.Optional[str]` — Name of the ML Repo to filter by
@@ -6590,7 +6902,7 @@ for page in response.iter_pages():
-**limit:** `typing.Optional[int]` +**limit:** `typing.Optional[int]` — Maximum number of ML Repos to return
@@ -6598,7 +6910,7 @@ for page in response.iter_pages():
-**offset:** `typing.Optional[int]` +**offset:** `typing.Optional[int]` — Number of ML Repos to skip for pagination
@@ -6798,6 +7110,20 @@ for page in response.iter_pages():
+#### 📝 Description + +
+
+ +
+
+ +Get an artifact by its ID. +
+
+
+
+ #### 🔌 Usage
@@ -6855,6 +7181,20 @@ client.artifacts.get(
+#### 📝 Description + +
+
+ +
+
+ +Delete an artifact by its ID. +
+
+
+
+ #### 🔌 Usage
@@ -6912,6 +7252,20 @@ client.artifacts.delete(
+#### 📝 Description + +
+
+ +
+
+ +List artifacts with optional filtering by FQN, ML Repo, name, or run ID. +
+
+
+
+ #### 🔌 Usage
@@ -6956,23 +7310,828 @@ for page in response.iter_pages():
-**fqn:** `typing.Optional[str]` +**fqn:** `typing.Optional[str]` — Fully qualified name to filter artifacts by (format: '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}') + +
+
+ +
+
+ +**ml_repo_id:** `typing.Optional[str]` — ID of the ML Repo to filter artifacts by + +
+
+ +
+
+ +**name:** `typing.Optional[str]` — Name of the artifact to filter by + +
+
+ +
+
+ +**offset:** `typing.Optional[int]` — Number of artifacts to skip for pagination + +
+
+ +
+
+ +**limit:** `typing.Optional[int]` — Maximum number of artifacts to return + +
+
+ +
+
+ +**run_id:** `typing.Optional[str]` — ID of the run to filter artifacts by + +
+
+ +
+
+ +**include_empty_artifacts:** `typing.Optional[bool]` — Whether to include artifacts that have no versions + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+ + +
+
+
+ +
client.artifacts.create_or_update(...) -> AsyncHttpResponse[GetArtifactVersionResponse] +
+
+ +#### 📝 Description + +
+
+ +
+
+ +Create or update an artifact version. +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from truefoundry_sdk import ( + ArtifactManifest, + TrueFoundry, + TrueFoundryManagedSource, +) + +client = TrueFoundry( + api_key="YOUR_API_KEY", + base_url="https://yourhost.com/path/to/api", +) +client.artifacts.create_or_update( + manifest=ArtifactManifest( + name="name", + metadata={"key": "value"}, + ml_repo="ml_repo", + source=TrueFoundryManagedSource(), + ), +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**manifest:** `ArtifactManifest` — Manifest containing metadata for the artifact to apply + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ + +
+
+
+ +## Prompts +
client.prompts.get(...) -> AsyncHttpResponse[GetPromptResponse] +
+
+ +#### 📝 Description + +
+
+ +
+
+ +Get a prompt by its ID. +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from truefoundry_sdk import TrueFoundry + +client = TrueFoundry( + api_key="YOUR_API_KEY", + base_url="https://yourhost.com/path/to/api", +) +client.prompts.get( + id="id", +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `str` + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ + +
+
+
+ +
client.prompts.delete(...) -> AsyncHttpResponse[EmptyResponse] +
+
+ +#### 📝 Description + +
+
+ +
+
+ +Delete a prompt by its ID. +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from truefoundry_sdk import TrueFoundry + +client = TrueFoundry( + api_key="YOUR_API_KEY", + base_url="https://yourhost.com/path/to/api", +) +client.prompts.delete( + id="id", +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `str` + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ + +
+
+
+ +
client.prompts.list(...) -> AsyncPager[Prompt, ListPromptsResponse] +
+
+ +#### 📝 Description + +
+
+ +
+
+ +List prompts with optional filtering by FQN, ML Repo, or name. +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from truefoundry_sdk import TrueFoundry + +client = TrueFoundry( + api_key="YOUR_API_KEY", + base_url="https://yourhost.com/path/to/api", +) +response = client.prompts.list( + fqn="fqn", + ml_repo_id="ml_repo_id", + name="name", + offset=1, + limit=1, + include_empty_prompts=True, +) +for item in response: + yield item +# alternatively, you can paginate page-by-page +for page in response.iter_pages(): + yield page + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**fqn:** `typing.Optional[str]` — Fully qualified name to filter prompts by (format: 'chat_prompt:{tenant_name}/{ml_repo_name}/{prompt_name}') + +
+
+ +
+
+ +**ml_repo_id:** `typing.Optional[str]` — ID of the ML Repo to filter prompts by + +
+
+ +
+
+ +**name:** `typing.Optional[str]` — Name of the prompt to filter by + +
+
+ +
+
+ +**offset:** `typing.Optional[int]` — Number of prompts to skip for pagination + +
+
+ +
+
+ +**limit:** `typing.Optional[int]` — Maximum number of prompts to return + +
+
+ +
+
+ +**include_empty_prompts:** `typing.Optional[bool]` — Whether to include prompts that have no versions + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ + +
+
+
+ +
client.prompts.create_or_update(...) -> AsyncHttpResponse[GetPromptVersionResponse] +
+
+ +#### 📝 Description + +
+
+ +
+
+ +Create or update a prompt version. +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from truefoundry_sdk import ChatPromptManifest, SystemMessage, TrueFoundry + +client = TrueFoundry( + api_key="YOUR_API_KEY", + base_url="https://yourhost.com/path/to/api", +) +client.prompts.create_or_update( + manifest=ChatPromptManifest( + name="name", + metadata={"key": "value"}, + ml_repo="ml_repo", + messages=[ + SystemMessage( + content="content", + ) + ], + ), +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**manifest:** `ChatPromptManifest` — Manifest containing metadata for the prompt to apply + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ + +
+
+
+ +## Models +
client.models.get(...) -> AsyncHttpResponse[GetModelResponse] +
+
+ +#### 📝 Description + +
+
+ +
+
+ +Get a model by its ID. +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from truefoundry_sdk import TrueFoundry + +client = TrueFoundry( + api_key="YOUR_API_KEY", + base_url="https://yourhost.com/path/to/api", +) +client.models.get( + id="id", +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `str` + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ + +
+
+
+ +
client.models.delete(...) -> AsyncHttpResponse[EmptyResponse] +
+
+ +#### 📝 Description + +
+
+ +
+
+ +Delete a model by its ID. +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from truefoundry_sdk import TrueFoundry + +client = TrueFoundry( + api_key="YOUR_API_KEY", + base_url="https://yourhost.com/path/to/api", +) +client.models.delete( + id="id", +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `str` + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ + +
+
+
+ +
client.models.list(...) -> AsyncPager[Model, ListModelsResponse] +
+
+ +#### 📝 Description + +
+
+ +
+
+ +List models with optional filtering by FQN, ML Repo, name, or run ID. +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from truefoundry_sdk import TrueFoundry + +client = TrueFoundry( + api_key="YOUR_API_KEY", + base_url="https://yourhost.com/path/to/api", +) +response = client.models.list( + fqn="fqn", + ml_repo_id="ml_repo_id", + name="name", + offset=1, + limit=1, + run_id="run_id", + include_empty_models=True, +) +for item in response: + yield item +# alternatively, you can paginate page-by-page +for page in response.iter_pages(): + yield page + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**fqn:** `typing.Optional[str]` — Fully qualified name to filter models by (format: 'model:{tenant_name}/{ml_repo_name}/{model_name}') + +
+
+ +
+
+ +**ml_repo_id:** `typing.Optional[str]` — ID of the ML Repo to filter models by + +
+
+ +
+
+ +**name:** `typing.Optional[str]` — Name of the model to filter by + +
+
+ +
+
+ +**offset:** `typing.Optional[int]` — Number of models to skip for pagination + +
+
+ +
+
+ +**limit:** `typing.Optional[int]` — Maximum number of models to return + +
+
+ +
+
+ +**run_id:** `typing.Optional[str]` — ID of the run to filter models by + +
+
+ +
+
+ +**include_empty_models:** `typing.Optional[bool]` — Whether to include models that have no versions + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ + +
+
+
+ +
client.models.create_or_update(...) -> AsyncHttpResponse[GetModelVersionResponse] +
+
+ +#### 📝 Description + +
+
+ +
+
+ +Create or update a model version. +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from truefoundry_sdk import ModelManifest, TrueFoundry, TrueFoundryManagedSource + +client = TrueFoundry( + api_key="YOUR_API_KEY", + base_url="https://yourhost.com/path/to/api", +) +client.models.create_or_update( + manifest=ModelManifest( + name="name", + metadata={"key": "value"}, + ml_repo="ml_repo", + source=TrueFoundryManagedSource(), + ), +) + +``` +
+
+
+
+ +#### ⚙️ Parameters
-**ml_repo_id:** `typing.Optional[str]` - -
-
-
-**name:** `typing.Optional[str]` +**manifest:** `ModelManifest` — Manifest containing metadata for the model to apply
@@ -6980,53 +8139,36 @@ for page in response.iter_pages():
-**offset:** `typing.Optional[int]` +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
-
-
-**limit:** `typing.Optional[int]` -
+
+## ArtifactVersions +
client.artifact_versions.apply_tags(...) -> AsyncHttpResponse[EmptyResponse]
-**run_id:** `typing.Optional[str]` - -
-
+#### 📝 Description
-**include_empty_artifacts:** `typing.Optional[bool]` - -
-
-
-**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. - -
-
+Apply tags to an artifact version. - - -
- -
client.artifacts.create_or_update(...) -> AsyncHttpResponse[GetArtifactVersionResponse] -
-
#### 🔌 Usage @@ -7037,23 +8179,15 @@ for page in response.iter_pages():
```python -from truefoundry_sdk import ( - ArtifactManifest, - TrueFoundry, - TrueFoundryManagedSource, -) +from truefoundry_sdk import TrueFoundry client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -client.artifacts.create_or_update( - manifest=ArtifactManifest( - name="name", - metadata={"key": "value"}, - ml_repo="ml_repo", - source=TrueFoundryManagedSource(), - ), +client.artifact_versions.apply_tags( + artifact_version_id="artifact_version_id", + tags=["tags"], ) ``` @@ -7070,7 +8204,23 @@ client.artifacts.create_or_update(
-**manifest:** `ArtifactManifest` +**artifact_version_id:** `str` — ID of the artifact version to apply tags to + +
+
+ +
+
+ +**tags:** `typing.Sequence[str]` — List of tags to apply to the artifact version + +
+
+ +
+
+ +**force:** `typing.Optional[bool]` — Whether to overwrite existing tags if they conflict
@@ -7090,11 +8240,24 @@ client.artifacts.create_or_update(
-## Prompts -
client.prompts.get(...) -> AsyncHttpResponse[GetPromptResponse] +
client.artifact_versions.get(...) -> AsyncHttpResponse[GetArtifactVersionResponse] +
+
+ +#### 📝 Description + +
+
+
+Get an artifact version by its ID. +
+
+
+
+ #### 🔌 Usage
@@ -7110,7 +8273,7 @@ client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -client.prompts.get( +client.artifact_versions.get( id="id", ) @@ -7148,10 +8311,24 @@ client.prompts.get(
-
client.prompts.delete(...) -> AsyncHttpResponse[EmptyResponse] +
client.artifact_versions.delete(...) -> AsyncHttpResponse[EmptyResponse] +
+
+ +#### 📝 Description + +
+
+
+Delete an artifact version by its ID. +
+
+
+
+ #### 🔌 Usage
@@ -7167,7 +8344,7 @@ client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -client.prompts.delete( +client.artifact_versions.delete( id="id", ) @@ -7205,10 +8382,24 @@ client.prompts.delete(
-
client.prompts.list(...) -> AsyncPager[Prompt, ListPromptsResponse] +
client.artifact_versions.list(...) -> AsyncPager[ArtifactVersion, ListArtifactVersionsResponse] +
+
+ +#### 📝 Description +
+
+
+ +List artifact versions with optional filtering by tag, FQN, artifact ID, ML Repo, name, version, run IDs, or run steps. +
+
+
+
+ #### 🔌 Usage
@@ -7224,13 +8415,16 @@ client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -response = client.prompts.list( +response = client.artifact_versions.list( + tag="tag", fqn="fqn", + artifact_id="artifact_id", ml_repo_id="ml_repo_id", name="name", + version=1, offset=1, limit=1, - include_empty_prompts=True, + include_internal_metadata=True, ) for item in response: yield item @@ -7252,7 +8446,47 @@ for page in response.iter_pages():
-**fqn:** `typing.Optional[str]` +**tag:** `typing.Optional[str]` — Tag to filter artifact versions by + +
+
+ +
+
+ +**fqn:** `typing.Optional[str]` — Fully qualified name to filter artifact versions by (format: '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}' or '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}:{version}') + +
+
+ +
+
+ +**artifact_id:** `typing.Optional[str]` — ID of the artifact to filter versions by + +
+
+ +
+
+ +**ml_repo_id:** `typing.Optional[str]` — ID of the ML Repo to filter artifact versions by + +
+
+ +
+
+ +**name:** `typing.Optional[str]` — Name of the artifact to filter versions by + +
+
+ +
+
+ +**version:** `typing.Optional[int]` — Version number (positive integer) or 'latest' to filter by specific version
@@ -7260,7 +8494,7 @@ for page in response.iter_pages():
-**ml_repo_id:** `typing.Optional[str]` +**run_ids:** `typing.Optional[typing.Union[str, typing.Sequence[str]]]` — List of run IDs to filter artifact versions by
@@ -7268,7 +8502,7 @@ for page in response.iter_pages():
-**name:** `typing.Optional[str]` +**run_steps:** `typing.Optional[typing.Union[int, typing.Sequence[int]]]` — List of run step numbers to filter artifact versions by
@@ -7276,7 +8510,7 @@ for page in response.iter_pages():
-**offset:** `typing.Optional[int]` +**offset:** `typing.Optional[int]` — Number of artifact versions to skip for pagination
@@ -7284,7 +8518,7 @@ for page in response.iter_pages():
-**limit:** `typing.Optional[int]` +**limit:** `typing.Optional[int]` — Maximum number of artifact versions to return
@@ -7292,7 +8526,7 @@ for page in response.iter_pages():
-**include_empty_prompts:** `typing.Optional[bool]` +**include_internal_metadata:** `typing.Optional[bool]` — Whether to include internal metadata in the response
@@ -7312,10 +8546,24 @@ for page in response.iter_pages():
-
client.prompts.create_or_update(...) -> AsyncHttpResponse[GetPromptVersionResponse] +
client.artifact_versions.get_signed_urls(...) -> AsyncHttpResponse[GetSignedUrLsResponse] +
+
+ +#### 📝 Description + +
+
+
+Get pre-signed URLs for reading or writing files in an artifact version. +
+
+
+
+ #### 🔌 Usage
@@ -7325,23 +8573,16 @@ for page in response.iter_pages():
```python -from truefoundry_sdk import ChatPromptManifest, SystemMessage, TrueFoundry +from truefoundry_sdk import Operation, TrueFoundry client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -client.prompts.create_or_update( - manifest=ChatPromptManifest( - name="name", - metadata={"key": "value"}, - ml_repo="ml_repo", - messages=[ - SystemMessage( - content="content", - ) - ], - ), +client.artifact_versions.get_signed_urls( + id="id", + paths=["paths"], + operation=Operation.READ, ) ``` @@ -7358,7 +8599,23 @@ client.prompts.create_or_update(
-**manifest:** `ChatPromptManifest` +**id:** `str` — ID of the artifact version to get signed URLs for + +
+
+ +
+
+ +**paths:** `typing.Sequence[str]` — List of relative file paths within the artifact version to get signed URLs for + +
+
+ +
+
+ +**operation:** `Operation` — Operation type for the signed URL (e.g., 'READ' or 'WRITE')
@@ -7378,11 +8635,24 @@ client.prompts.create_or_update(
-## Models -
client.models.get(...) -> AsyncHttpResponse[GetModelResponse] +
client.artifact_versions.create_multi_part_upload(...) -> AsyncHttpResponse[MultiPartUploadResponse] +
+
+ +#### 📝 Description +
+
+
+ +Create a multipart upload for large files in an artifact version. +
+
+
+
+ #### 🔌 Usage
@@ -7398,8 +8668,10 @@ client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -client.models.get( +client.artifact_versions.create_multi_part_upload( id="id", + path="path", + num_parts=1, ) ``` @@ -7416,7 +8688,23 @@ client.models.get(
-**id:** `str` +**id:** `str` — ID of the artifact version to upload files to + +
+
+ +
+
+ +**path:** `str` — Relative path within the artifact version where the file should be uploaded + +
+
+ +
+
+ +**num_parts:** `int` — Number of parts to split the upload into for multipart upload
@@ -7436,10 +8724,24 @@ client.models.get(
-
client.models.delete(...) -> AsyncHttpResponse[EmptyResponse] +
client.artifact_versions.stage(...) -> AsyncHttpResponse[StageArtifactResponse] +
+
+ +#### 📝 Description + +
+
+
+Stage an artifact version for upload, returning storage location and version ID. +
+
+
+
+ #### 🔌 Usage
@@ -7449,14 +8751,19 @@ client.models.get(
```python -from truefoundry_sdk import TrueFoundry +from truefoundry_sdk import ModelManifest, TrueFoundry, TrueFoundryManagedSource client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -client.models.delete( - id="id", +client.artifact_versions.stage( + manifest=ModelManifest( + name="name", + metadata={"key": "value"}, + ml_repo="ml_repo", + source=TrueFoundryManagedSource(), + ), ) ``` @@ -7473,7 +8780,7 @@ client.models.delete(
-**id:** `str` +**manifest:** `StageArtifactRequestManifest` — Manifest containing metadata for the artifact to be staged (model or generic artifact)
@@ -7493,10 +8800,24 @@ client.models.delete(
-
client.models.list(...) -> AsyncPager[Model, ListModelsResponse] +
client.artifact_versions.list_files(...) -> AsyncPager[FileInfo, ListFilesResponse] +
+
+ +#### 📝 Description + +
+
+
+List files and directories in an artifact version. +
+
+
+
+ #### 🔌 Usage
@@ -7512,14 +8833,8 @@ client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -response = client.models.list( - fqn="fqn", - ml_repo_id="ml_repo_id", - name="name", - offset=1, - limit=1, - run_id="run_id", - include_empty_models=True, +response = client.artifact_versions.list_files( + id="id", ) for item in response: yield item @@ -7541,7 +8856,7 @@ for page in response.iter_pages():
-**fqn:** `typing.Optional[str]` +**id:** `str` — ID of the artifact version to list files from
@@ -7549,7 +8864,7 @@ for page in response.iter_pages():
-**ml_repo_id:** `typing.Optional[str]` +**path:** `typing.Optional[str]` — Relative path within the artifact version to list files from (defaults to root)
@@ -7557,7 +8872,7 @@ for page in response.iter_pages():
-**name:** `typing.Optional[str]` +**limit:** `typing.Optional[int]` — Maximum number of files/directories to return
@@ -7565,7 +8880,7 @@ for page in response.iter_pages():
-**offset:** `typing.Optional[int]` +**page_token:** `typing.Optional[str]` — Token to retrieve the next page of results
@@ -7573,45 +8888,35 @@ for page in response.iter_pages():
-**limit:** `typing.Optional[int]` +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
-
-
-**run_id:** `typing.Optional[str]` -
+
+
client.artifact_versions.mark_stage_failure(...) -> AsyncHttpResponse[EmptyResponse]
-**include_empty_models:** `typing.Optional[bool]` - -
-
+#### 📝 Description
-**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. - -
-
+
+
+ +Mark a staged artifact version as failed.
- - -
- -
client.models.create_or_update(...) -> AsyncHttpResponse[GetModelVersionResponse] -
-
#### 🔌 Usage @@ -7622,19 +8927,14 @@ for page in response.iter_pages():
```python -from truefoundry_sdk import ModelManifest, TrueFoundry, TrueFoundryManagedSource +from truefoundry_sdk import TrueFoundry client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -client.models.create_or_update( - manifest=ModelManifest( - name="name", - metadata={"key": "value"}, - ml_repo="ml_repo", - source=TrueFoundryManagedSource(), - ), +client.artifact_versions.mark_stage_failure( + id="id", ) ``` @@ -7651,7 +8951,7 @@ client.models.create_or_update(
-**manifest:** `ModelManifest` +**id:** `str` — ID of the staged artifact version to mark as failed
@@ -7671,11 +8971,25 @@ client.models.create_or_update(
-## ArtifactVersions -
client.artifact_versions.apply_tags(...) -> AsyncHttpResponse[EmptyResponse] +## ModelVersions +
client.model_versions.apply_tags(...) -> AsyncHttpResponse[EmptyResponse] +
+
+ +#### 📝 Description + +
+
+
+Apply tags to a model version. +
+
+
+
+ #### 🔌 Usage
@@ -7691,8 +9005,8 @@ client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -client.artifact_versions.apply_tags( - artifact_version_id="artifact_version_id", +client.model_versions.apply_tags( + model_version_id="model_version_id", tags=["tags"], ) @@ -7710,7 +9024,7 @@ client.artifact_versions.apply_tags(
-**artifact_version_id:** `str` +**model_version_id:** `str` — ID of the model version to apply tags to
@@ -7718,7 +9032,7 @@ client.artifact_versions.apply_tags(
-**tags:** `typing.Sequence[str]` +**tags:** `typing.Sequence[str]` — List of tags to apply to the model version
@@ -7726,7 +9040,7 @@ client.artifact_versions.apply_tags(
-**force:** `typing.Optional[bool]` +**force:** `typing.Optional[bool]` — Whether to overwrite existing tags if they conflict
@@ -7746,7 +9060,7 @@ client.artifact_versions.apply_tags(
-
client.artifact_versions.get(...) -> AsyncHttpResponse[GetArtifactVersionResponse] +
client.model_versions.get(...) -> AsyncHttpResponse[GetModelVersionResponse]
@@ -7758,7 +9072,7 @@ client.artifact_versions.apply_tags(
-Get artifact version API +Get a model version by its ID.
@@ -7779,7 +9093,7 @@ client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -client.artifact_versions.get( +client.model_versions.get( id="id", ) @@ -7817,7 +9131,7 @@ client.artifact_versions.get(
-
client.artifact_versions.delete(...) -> AsyncHttpResponse[EmptyResponse] +
client.model_versions.delete(...) -> AsyncHttpResponse[EmptyResponse]
@@ -7829,7 +9143,7 @@ client.artifact_versions.get(
-Delete artifact versions API +Delete a model version by its ID.
@@ -7850,7 +9164,7 @@ client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -client.artifact_versions.delete( +client.model_versions.delete( id="id", ) @@ -7888,7 +9202,7 @@ client.artifact_versions.delete(
-
client.artifact_versions.list(...) -> AsyncPager[ArtifactVersion, ListArtifactVersionsResponse] +
client.model_versions.list(...) -> AsyncPager[ModelVersion, ListModelVersionsResponse]
@@ -7900,7 +9214,7 @@ client.artifact_versions.delete(
-List artifact version API +List model versions with optional filtering by tag, FQN, model ID, ML Repo, name, version, run IDs, or run steps.
@@ -7921,10 +9235,10 @@ client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -response = client.artifact_versions.list( +response = client.model_versions.list( tag="tag", fqn="fqn", - artifact_id="artifact_id", + model_id="model_id", ml_repo_id="ml_repo_id", name="name", version=1, @@ -7952,7 +9266,7 @@ for page in response.iter_pages():
-**tag:** `typing.Optional[str]` +**tag:** `typing.Optional[str]` — Tag to filter model versions by
@@ -7960,7 +9274,7 @@ for page in response.iter_pages():
-**fqn:** `typing.Optional[str]` +**fqn:** `typing.Optional[str]` — Fully qualified name to filter model versions by (format: 'model:{tenant_name}/{ml_repo_name}/{model_name}' or 'model:{tenant_name}/{ml_repo_name}/{model_name}:{version}')
@@ -7968,7 +9282,7 @@ for page in response.iter_pages():
-**artifact_id:** `typing.Optional[str]` +**model_id:** `typing.Optional[str]` — ID of the model to filter versions by
@@ -7976,7 +9290,7 @@ for page in response.iter_pages():
-**ml_repo_id:** `typing.Optional[str]` +**ml_repo_id:** `typing.Optional[str]` — ID of the ML Repo to filter model versions by
@@ -7984,7 +9298,7 @@ for page in response.iter_pages():
-**name:** `typing.Optional[str]` +**name:** `typing.Optional[str]` — Name of the model to filter versions by
@@ -7992,7 +9306,7 @@ for page in response.iter_pages():
-**version:** `typing.Optional[int]` +**version:** `typing.Optional[int]` — Version number (positive integer) or 'latest' to filter by specific version
@@ -8000,7 +9314,7 @@ for page in response.iter_pages():
-**run_ids:** `typing.Optional[typing.Union[str, typing.Sequence[str]]]` +**run_ids:** `typing.Optional[typing.Union[str, typing.Sequence[str]]]` — List of run IDs to filter model versions by
@@ -8008,7 +9322,7 @@ for page in response.iter_pages():
-**run_steps:** `typing.Optional[typing.Union[int, typing.Sequence[int]]]` +**run_steps:** `typing.Optional[typing.Union[int, typing.Sequence[int]]]` — List of run step numbers to filter model versions by
@@ -8016,7 +9330,7 @@ for page in response.iter_pages():
-**offset:** `typing.Optional[int]` +**offset:** `typing.Optional[int]` — Number of model versions to skip for pagination
@@ -8024,7 +9338,7 @@ for page in response.iter_pages():
-**limit:** `typing.Optional[int]` +**limit:** `typing.Optional[int]` — Maximum number of model versions to return
@@ -8032,7 +9346,7 @@ for page in response.iter_pages():
-**include_internal_metadata:** `typing.Optional[bool]` +**include_internal_metadata:** `typing.Optional[bool]` — Whether to include internal metadata in the response
@@ -8052,84 +9366,24 @@ for page in response.iter_pages():
-
client.artifact_versions.get_signed_urls(...) -> AsyncHttpResponse[GetSignedUrLsResponse] -
-
- -#### 🔌 Usage - -
-
- -
-
- -```python -from truefoundry_sdk import Operation, TrueFoundry - -client = TrueFoundry( - api_key="YOUR_API_KEY", - base_url="https://yourhost.com/path/to/api", -) -client.artifact_versions.get_signed_urls( - id="id", - paths=["paths"], - operation=Operation.READ, -) - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**id:** `str` - -
-
- +## PromptVersions +
client.prompt_versions.apply_tags(...) -> AsyncHttpResponse[EmptyResponse]
-**paths:** `typing.Sequence[str]` - -
-
+#### 📝 Description
-**operation:** `Operation` - -
-
-
-**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. - -
-
+Apply tags to a prompt version.
- -
-
- -
client.artifact_versions.create_multi_part_upload(...) -> AsyncHttpResponse[MultiPartUploadResponse] -
-
#### 🔌 Usage @@ -8146,10 +9400,9 @@ client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -client.artifact_versions.create_multi_part_upload( - id="id", - path="path", - num_parts=1, +client.prompt_versions.apply_tags( + prompt_version_id="prompt_version_id", + tags=["tags"], ) ``` @@ -8166,7 +9419,7 @@ client.artifact_versions.create_multi_part_upload(
-**id:** `str` +**prompt_version_id:** `str` — ID of the prompt version to apply tags to
@@ -8174,7 +9427,7 @@ client.artifact_versions.create_multi_part_upload(
-**path:** `str` +**tags:** `typing.Sequence[str]` — List of tags to apply to the prompt version
@@ -8182,7 +9435,7 @@ client.artifact_versions.create_multi_part_upload(
-**num_parts:** `int` +**force:** `typing.Optional[bool]` — Whether to overwrite existing tags if they conflict
@@ -8202,71 +9455,23 @@ client.artifact_versions.create_multi_part_upload(
-
client.artifact_versions.stage(...) -> AsyncHttpResponse[StageArtifactResponse] -
-
- -#### 🔌 Usage - -
-
- +
client.prompt_versions.get(...) -> AsyncHttpResponse[GetPromptVersionResponse]
-```python -from truefoundry_sdk import ModelManifest, TrueFoundry, TrueFoundryManagedSource - -client = TrueFoundry( - api_key="YOUR_API_KEY", - base_url="https://yourhost.com/path/to/api", -) -client.artifact_versions.stage( - manifest=ModelManifest( - name="name", - metadata={"key": "value"}, - ml_repo="ml_repo", - source=TrueFoundryManagedSource(), - ), -) - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
+#### 📝 Description
-**manifest:** `StageArtifactRequestManifest` - -
-
-
-**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. - -
-
+Get a prompt version by its ID.
- -
-
- -
client.artifact_versions.list_files(...) -> AsyncPager[FileInfo, ListFilesResponse] -
-
#### 🔌 Usage @@ -8283,14 +9488,9 @@ client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -response = client.artifact_versions.list_files( +client.prompt_versions.get( id="id", ) -for item in response: - yield item -# alternatively, you can paginate page-by-page -for page in response.iter_pages(): - yield page ```
@@ -8314,30 +9514,6 @@ for page in response.iter_pages():
-**path:** `typing.Optional[str]` - -
-
- -
-
- -**limit:** `typing.Optional[int]` - -
-
- -
-
- -**page_token:** `typing.Optional[str]` - -
-
- -
-
- **request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
@@ -8350,10 +9526,24 @@ for page in response.iter_pages():
-
client.artifact_versions.mark_stage_failure(...) -> AsyncHttpResponse[EmptyResponse] +
client.prompt_versions.delete(...) -> AsyncHttpResponse[EmptyResponse] +
+
+ +#### 📝 Description + +
+
+
+Delete a prompt version by its ID. +
+
+
+
+ #### 🔌 Usage
@@ -8369,7 +9559,7 @@ client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -client.artifact_versions.mark_stage_failure( +client.prompt_versions.delete( id="id", ) @@ -8407,11 +9597,24 @@ client.artifact_versions.mark_stage_failure(
-## ModelVersions -
client.model_versions.apply_tags(...) -> AsyncHttpResponse[EmptyResponse] +
client.prompt_versions.list(...) -> AsyncPager[PromptVersion, ListPromptVersionsResponse] +
+
+ +#### 📝 Description + +
+
+
+List prompt versions with optional filtering by tag, FQN, prompt ID, ML Repo, name, or version. +
+
+
+
+ #### 🔌 Usage
@@ -8427,10 +9630,21 @@ client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -client.model_versions.apply_tags( - model_version_id="model_version_id", - tags=["tags"], +response = client.prompt_versions.list( + tag="tag", + fqn="fqn", + prompt_id="prompt_id", + ml_repo_id="ml_repo_id", + name="name", + version=1, + offset=1, + limit=1, ) +for item in response: + yield item +# alternatively, you can paginate page-by-page +for page in response.iter_pages(): + yield page ```
@@ -8446,7 +9660,47 @@ client.model_versions.apply_tags(
-**model_version_id:** `str` +**tag:** `typing.Optional[str]` — Tag to filter prompt versions by + +
+
+ +
+
+ +**fqn:** `typing.Optional[str]` — Fully qualified name to filter prompt versions by (format: 'chat_prompt:{tenant_name}/{ml_repo_name}/{prompt_name}' or 'chat_prompt:{tenant_name}/{ml_repo_name}/{prompt_name}:{version}') + +
+
+ +
+
+ +**prompt_id:** `typing.Optional[str]` — ID of the prompt to filter versions by + +
+
+ +
+
+ +**ml_repo_id:** `typing.Optional[str]` — ID of the ML Repo to filter prompt versions by + +
+
+ +
+
+ +**name:** `typing.Optional[str]` — Name of the prompt to filter versions by + +
+
+ +
+
+ +**version:** `typing.Optional[int]` — Version number (positive integer) or 'latest' to filter by specific version
@@ -8454,7 +9708,7 @@ client.model_versions.apply_tags(
-**tags:** `typing.Sequence[str]` +**offset:** `typing.Optional[int]` — Number of prompt versions to skip for pagination
@@ -8462,7 +9716,7 @@ client.model_versions.apply_tags(
-**force:** `typing.Optional[bool]` +**limit:** `typing.Optional[int]` — Maximum number of prompt versions to return
@@ -8482,7 +9736,8 @@ client.model_versions.apply_tags(
-
client.model_versions.get(...) -> AsyncHttpResponse[GetModelVersionResponse] +## AgentSkills +
client.agent_skills.get(...) -> AsyncHttpResponse[GetAgentSkillResponse]
@@ -8494,7 +9749,7 @@ client.model_versions.apply_tags(
-Get model version API +Get an agent skill artifact by its ID.
@@ -8515,8 +9770,8 @@ client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -client.model_versions.get( - id="id", +client.agent_skills.get( + agent_skill_id="agent_skill_id", ) ``` @@ -8533,7 +9788,7 @@ client.model_versions.get(
-**id:** `str` +**agent_skill_id:** `str`
@@ -8553,7 +9808,7 @@ client.model_versions.get(
-
client.model_versions.delete(...) -> AsyncHttpResponse[EmptyResponse] +
client.agent_skills.delete(...) -> AsyncHttpResponse[EmptyResponse]
@@ -8565,7 +9820,7 @@ client.model_versions.get(
-Delete model versions API +Delete an agent skill artifact by its ID.
@@ -8586,8 +9841,8 @@ client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -client.model_versions.delete( - id="id", +client.agent_skills.delete( + agent_skill_id="agent_skill_id", ) ``` @@ -8604,7 +9859,7 @@ client.model_versions.delete(
-**id:** `str` +**agent_skill_id:** `str`
@@ -8624,7 +9879,7 @@ client.model_versions.delete(
-
client.model_versions.list(...) -> AsyncPager[ModelVersion, ListModelVersionsResponse] +
client.agent_skills.list(...) -> AsyncPager[AgentSkill, ListAgentSkillsResponse]
@@ -8636,7 +9891,7 @@ client.model_versions.delete(
-List model version API +List agent skills with optional filtering by FQN, ML Repo, or name. When present, `latest_version.manifest.source` is `blob-storage` with `description` only; use GET agent skill version for full SKILL.md (inline `source` with `skill_md`).
@@ -8657,16 +9912,13 @@ client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -response = client.model_versions.list( - tag="tag", +response = client.agent_skills.list( fqn="fqn", - model_id="model_id", ml_repo_id="ml_repo_id", name="name", - version=1, offset=1, limit=1, - include_internal_metadata=True, + include_empty_agent_skills=True, ) for item in response: yield item @@ -8688,7 +9940,7 @@ for page in response.iter_pages():
-**tag:** `typing.Optional[str]` +**fqn:** `typing.Optional[str]` — Fully qualified name to filter agent skills by (format: 'agent_skill:{tenant}/{ml_repo}/{agent_skill_name}')
@@ -8696,7 +9948,7 @@ for page in response.iter_pages():
-**fqn:** `typing.Optional[str]` +**ml_repo_id:** `typing.Optional[str]` — ML Repo ID filter
@@ -8704,7 +9956,7 @@ for page in response.iter_pages():
-**model_id:** `typing.Optional[str]` +**name:** `typing.Optional[str]` — Agent skill name filter
@@ -8712,7 +9964,7 @@ for page in response.iter_pages():
-**ml_repo_id:** `typing.Optional[str]` +**offset:** `typing.Optional[int]` — Pagination offset
@@ -8720,7 +9972,7 @@ for page in response.iter_pages():
-**name:** `typing.Optional[str]` +**limit:** `typing.Optional[int]` — Page size
@@ -8728,7 +9980,7 @@ for page in response.iter_pages():
-**version:** `typing.Optional[int]` +**include_empty_agent_skills:** `typing.Optional[bool]` — Whether to include agent skills that have no versions
@@ -8736,62 +9988,35 @@ for page in response.iter_pages():
-**run_ids:** `typing.Optional[typing.Union[str, typing.Sequence[str]]]` +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
- -
-
- -**run_steps:** `typing.Optional[typing.Union[int, typing.Sequence[int]]]` -
-
-
-**offset:** `typing.Optional[int]` -
+
+
client.agent_skills.create_or_update(...) -> AsyncHttpResponse[GetAgentSkillVersionResponse]
-**limit:** `typing.Optional[int]` - -
-
+#### 📝 Description
-**include_internal_metadata:** `typing.Optional[bool]` - -
-
-
-**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. - -
-
+Create or update an agent skill version from a manifest. - - -
- -## PromptVersions -
client.prompt_versions.apply_tags(...) -> AsyncHttpResponse[EmptyResponse] -
-
#### 🔌 Usage @@ -8802,15 +10027,25 @@ for page in response.iter_pages():
```python -from truefoundry_sdk import TrueFoundry +from truefoundry_sdk import ( + AgentSkillManifest, + AgentSkillSourceInline, + TrueFoundry, +) client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -client.prompt_versions.apply_tags( - prompt_version_id="prompt_version_id", - tags=["tags"], +client.agent_skills.create_or_update( + manifest=AgentSkillManifest( + name="name", + metadata={"key": "value"}, + ml_repo="ml_repo", + source=AgentSkillSourceInline( + skill_md="skill_md", + ), + ), ) ``` @@ -8827,23 +10062,7 @@ client.prompt_versions.apply_tags(
-**prompt_version_id:** `str` - -
-
- -
-
- -**tags:** `typing.Sequence[str]` - -
-
- -
-
- -**force:** `typing.Optional[bool]` +**manifest:** `AgentSkillManifest` — Manifest containing metadata for the agent skill to apply
@@ -8863,24 +10082,11 @@ client.prompt_versions.apply_tags(
-
client.prompt_versions.get(...) -> AsyncHttpResponse[GetPromptVersionResponse] -
-
- -#### 📝 Description - +## AgentSkillVersions +
client.agent_skill_versions.get(...) -> AsyncHttpResponse[GetAgentSkillVersionResponse]
-
-
- -Get prompt version API -
-
-
-
- #### 🔌 Usage
@@ -8896,8 +10102,8 @@ client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -client.prompt_versions.get( - id="id", +client.agent_skill_versions.get( + agent_skill_version_id="agent_skill_version_id", ) ``` @@ -8914,7 +10120,7 @@ client.prompt_versions.get(
-**id:** `str` +**agent_skill_version_id:** `str`
@@ -8934,24 +10140,10 @@ client.prompt_versions.get(
-
client.prompt_versions.delete(...) -> AsyncHttpResponse[EmptyResponse] -
-
- -#### 📝 Description - -
-
- +
client.agent_skill_versions.delete(...) -> AsyncHttpResponse[EmptyResponse]
-Delete prompt versions API -
-
-
-
- #### 🔌 Usage
@@ -8967,8 +10159,8 @@ client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -client.prompt_versions.delete( - id="id", +client.agent_skill_versions.delete( + agent_skill_version_id="agent_skill_version_id", ) ``` @@ -8985,7 +10177,7 @@ client.prompt_versions.delete(
-**id:** `str` +**agent_skill_version_id:** `str`
@@ -9005,7 +10197,7 @@ client.prompt_versions.delete(
-
client.prompt_versions.list(...) -> AsyncPager[PromptVersion, ListPromptVersionsResponse] +
client.agent_skill_versions.list(...) -> AsyncPager[AgentSkillVersion, ListAgentSkillVersionsResponse]
@@ -9017,7 +10209,7 @@ client.prompt_versions.delete(
-List prompt version API +List agent skill versions. Each manifest has `source.type` `blob-storage` and `description` only; use GET for full SKILL.md content.
@@ -9038,10 +10230,9 @@ client = TrueFoundry( api_key="YOUR_API_KEY", base_url="https://yourhost.com/path/to/api", ) -response = client.prompt_versions.list( - tag="tag", +response = client.agent_skill_versions.list( fqn="fqn", - prompt_id="prompt_id", + agent_skill_id="agent_skill_id", ml_repo_id="ml_repo_id", name="name", version=1, @@ -9068,7 +10259,7 @@ for page in response.iter_pages():
-**tag:** `typing.Optional[str]` +**fqn:** `typing.Optional[str]` — FQN filter for agent skill versions
@@ -9076,7 +10267,7 @@ for page in response.iter_pages():
-**fqn:** `typing.Optional[str]` +**agent_skill_id:** `typing.Optional[str]` — Parent agent skill artifact ID
@@ -9084,7 +10275,7 @@ for page in response.iter_pages():
-**prompt_id:** `typing.Optional[str]` +**ml_repo_id:** `typing.Optional[str]` — ML Repo ID filter
@@ -9092,7 +10283,7 @@ for page in response.iter_pages():
-**ml_repo_id:** `typing.Optional[str]` +**name:** `typing.Optional[str]` — Agent skill name filter
@@ -9100,7 +10291,7 @@ for page in response.iter_pages():
-**name:** `typing.Optional[str]` +**version:** `typing.Optional[int]` — Version number or 'latest'
@@ -9108,7 +10299,7 @@ for page in response.iter_pages():
-**version:** `typing.Optional[int]` +**offset:** `typing.Optional[int]` — Pagination offset
@@ -9116,15 +10307,7 @@ for page in response.iter_pages():
-**offset:** `typing.Optional[int]` - -
-
- -
-
- -**limit:** `typing.Optional[int]` +**limit:** `typing.Optional[int]` — Page size
@@ -9158,13 +10341,6 @@ for page in response.iter_pages():
Get a data directory by its ID. - -Args: - id (str): The ID of the data directory to retrieve - user_info: Current authenticated user info - -Returns: - DataDirectoryResponse: Response containing the retrieved data directory
@@ -9235,15 +10411,7 @@ client.data_directories.get(
-Delete a data directory and optionally its contents. - -Args: - id: Unique identifier of the data directory to delete - delete_contents: If True, also deletes the data directory's contents - user_info: Authenticated user information - -Returns: - EmptyResponse: Empty response indicating successful deletion +Delete a data directory, optionally including its contents.
@@ -9323,18 +10491,7 @@ client.data_directories.delete(
-List all data directories with optional filtering and pagination. - -Args: - filters: Query parameters for filtering and pagination - - ml_repo_id: Filter data directories by ml repo ID - - name: Optional filter data directories by name - - limit: Optional maximum number of data directories to return - - offset: Optional number of data directories to skip - user_info: Authenticated user information - -Returns: - ListDataDirectoriesResponse: List of data directories and pagination info +List data directories with optional filtering by FQN, ML Repo, or name.
@@ -9382,7 +10539,7 @@ for page in response.iter_pages():
-**fqn:** `typing.Optional[str]` +**fqn:** `typing.Optional[str]` — Fully qualified name to filter data directories by
@@ -9390,7 +10547,7 @@ for page in response.iter_pages():
-**ml_repo_id:** `typing.Optional[str]` +**ml_repo_id:** `typing.Optional[str]` — ID of the ML Repo to filter data directories by
@@ -9398,7 +10555,7 @@ for page in response.iter_pages():
-**name:** `typing.Optional[str]` +**name:** `typing.Optional[str]` — Name of the data directory to filter by
@@ -9406,7 +10563,7 @@ for page in response.iter_pages():
-**limit:** `typing.Optional[int]` +**limit:** `typing.Optional[int]` — Maximum number of data directories to return
@@ -9414,7 +10571,7 @@ for page in response.iter_pages():
-**offset:** `typing.Optional[int]` +**offset:** `typing.Optional[int]` — Number of data directories to skip for pagination
@@ -9438,6 +10595,20 @@ for page in response.iter_pages():
+#### 📝 Description + +
+
+ +
+
+ +Create or update a data directory. +
+
+
+
+ #### 🔌 Usage
@@ -9480,7 +10651,7 @@ client.data_directories.create_or_update(
-**manifest:** `DataDirectoryManifest` +**manifest:** `DataDirectoryManifest` — Manifest containing metadata for the data directory to apply
@@ -9512,14 +10683,7 @@ client.data_directories.create_or_update(
-List files in a dataset. - -Args: - request_dto: Request containing dataset ID, path, page token and limit - user_info: Authenticated user information - -Returns: - ListFilesResponse: Response containing files and pagination info +List files and directories in a data directory.
@@ -9563,7 +10727,7 @@ for page in response.iter_pages():
-**id:** `str` +**id:** `str` — ID of the artifact version to list files from
@@ -9571,7 +10735,7 @@ for page in response.iter_pages():
-**path:** `typing.Optional[str]` +**path:** `typing.Optional[str]` — Relative path within the artifact version to list files from (defaults to root)
@@ -9579,7 +10743,7 @@ for page in response.iter_pages():
-**limit:** `typing.Optional[int]` +**limit:** `typing.Optional[int]` — Maximum number of files/directories to return
@@ -9587,7 +10751,7 @@ for page in response.iter_pages():
-**page_token:** `typing.Optional[str]` +**page_token:** `typing.Optional[str]` — Token to retrieve the next page of results
@@ -9619,14 +10783,7 @@ for page in response.iter_pages():
-Delete files from the dataset. - -Args: - request_dto: Request containing dataset ID and paths - user_info: Authenticated user information - -Returns: - EmptyResponse: Empty response indicating successful deletion +Delete files from a data directory.
@@ -9666,7 +10823,7 @@ client.data_directories.delete_files(
-**id:** `str` +**id:** `str` — ID of the artifact version to delete files from
@@ -9674,7 +10831,7 @@ client.data_directories.delete_files(
-**paths:** `typing.Sequence[str]` +**paths:** `typing.Sequence[str]` — List of relative file paths within the artifact version to delete
@@ -9706,14 +10863,7 @@ client.data_directories.delete_files(
-Get signed URLs for a dataset. - -Args: - request_dto: Request containing dataset ID, paths and operation - user_info: Authenticated user information - -Returns: - GetSignedURLsResponse: Response containing signed URLs +Get pre-signed URLs for reading or writing files in a data directory.
@@ -9754,7 +10904,7 @@ client.data_directories.get_signed_urls(
-**id:** `str` +**id:** `str` — ID of the artifact version to get signed URLs for
@@ -9762,7 +10912,7 @@ client.data_directories.get_signed_urls(
-**paths:** `typing.Sequence[str]` +**paths:** `typing.Sequence[str]` — List of relative file paths within the artifact version to get signed URLs for
@@ -9770,7 +10920,7 @@ client.data_directories.get_signed_urls(
-**operation:** `Operation` +**operation:** `Operation` — Operation type for the signed URL (e.g., 'READ' or 'WRITE')
@@ -9802,14 +10952,7 @@ client.data_directories.get_signed_urls(
-Create a multipart upload for a dataset - -Args: - request_dto: Request containing dataset ID, path and number of parts - user_info: Authenticated user information - -Returns: - MultiPartUploadResponse: Response containing multipart upload info +Create a multipart upload for large files in a data directory.
@@ -9850,7 +10993,7 @@ client.data_directories.create_multipart_upload(
-**id:** `str` +**id:** `str` — ID of the artifact version to upload files to
@@ -9858,7 +11001,7 @@ client.data_directories.create_multipart_upload(
-**path:** `str` +**path:** `str` — Relative path within the artifact version where the file should be uploaded
@@ -9866,7 +11009,7 @@ client.data_directories.create_multipart_upload(
-**num_parts:** `int` +**num_parts:** `int` — Number of parts to split the upload into for multipart upload
@@ -10855,7 +11998,7 @@ client.internal.vcs.get_authenticated_url(
## Internal DockerRegistries -
client.internal.docker_registries.create_repository(...) -> AsyncHttpResponse[DockerRegistriesCreateRepositoryResponse] +
client.internal.docker_registries.create_repository(...) -> AsyncHttpResponse[CreateDockerRepositoryResponse]
@@ -10944,7 +12087,7 @@ client.internal.docker_registries.create_repository(
-
client.internal.docker_registries.get_credentials(...) -> AsyncHttpResponse[DockerRegistriesGetCredentialsResponse] +
client.internal.docker_registries.get_credentials(...) -> AsyncHttpResponse[GetDockerRegistryCredentialsResponse]
@@ -11253,7 +12396,7 @@ client.internal.build_logs.get(
-List artifact version API +List artifact versions with internal metadata, optionally including model versions.
@@ -11306,7 +12449,7 @@ for page in response.iter_pages():
-**tag:** `typing.Optional[str]` +**tag:** `typing.Optional[str]` — Tag to filter artifact versions by
@@ -11314,7 +12457,7 @@ for page in response.iter_pages():
-**fqn:** `typing.Optional[str]` +**fqn:** `typing.Optional[str]` — Fully qualified name to filter artifact versions by (format: '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}' or '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}:{version}')
@@ -11322,7 +12465,7 @@ for page in response.iter_pages():
-**artifact_id:** `typing.Optional[str]` +**artifact_id:** `typing.Optional[str]` — ID of the artifact to filter versions by
@@ -11330,7 +12473,7 @@ for page in response.iter_pages():
-**ml_repo_id:** `typing.Optional[str]` +**ml_repo_id:** `typing.Optional[str]` — ID of the ML Repo to filter artifact versions by
@@ -11338,7 +12481,7 @@ for page in response.iter_pages():
-**name:** `typing.Optional[str]` +**name:** `typing.Optional[str]` — Name of the artifact to filter versions by
@@ -11346,7 +12489,7 @@ for page in response.iter_pages():
-**version:** `typing.Optional[int]` +**version:** `typing.Optional[int]` — Version number (positive integer) or 'latest' to filter by specific version
@@ -11354,7 +12497,7 @@ for page in response.iter_pages():
-**run_ids:** `typing.Optional[typing.Union[str, typing.Sequence[str]]]` +**run_ids:** `typing.Optional[typing.Union[str, typing.Sequence[str]]]` — List of run IDs to filter artifact versions by
@@ -11362,7 +12505,7 @@ for page in response.iter_pages():
-**run_steps:** `typing.Optional[typing.Union[int, typing.Sequence[int]]]` +**run_steps:** `typing.Optional[typing.Union[int, typing.Sequence[int]]]` — List of run step numbers to filter artifact versions by
@@ -11370,7 +12513,7 @@ for page in response.iter_pages():
-**offset:** `typing.Optional[int]` +**offset:** `typing.Optional[int]` — Number of artifact versions to skip for pagination
@@ -11378,7 +12521,7 @@ for page in response.iter_pages():
-**limit:** `typing.Optional[int]` +**limit:** `typing.Optional[int]` — Maximum number of artifact versions to return
@@ -11386,7 +12529,7 @@ for page in response.iter_pages():
-**include_internal_metadata:** `typing.Optional[bool]` +**include_internal_metadata:** `typing.Optional[bool]` — Whether to include internal metadata in the response
@@ -11394,7 +12537,7 @@ for page in response.iter_pages():
-**include_model_versions:** `typing.Optional[bool]` +**include_model_versions:** `typing.Optional[bool]` — Whether to include model versions in the results (internal use only)
@@ -11419,6 +12562,20 @@ for page in response.iter_pages():
+#### 📝 Description + +
+
+ +
+
+ +Create or update an ML entity (model, prompt, artifact, or data directory). +
+
+
+
+ #### 🔌 Usage
@@ -11457,7 +12614,7 @@ client.internal.ml.apply(
-**manifest:** `ApplyMlEntityRequestManifest` +**manifest:** `ApplyMlEntityRequestManifest` — Manifest containing metadata for the ML entity to apply (model, prompt, artifact, agent skill, or data directory)
@@ -11481,6 +12638,20 @@ client.internal.ml.apply(
+#### 📝 Description + +
+
+ +
+
+ +Delete an ML entity (model, prompt, artifact, agent skill, data directory, or ML Repo) by manifest. +
+
+
+
+ #### 🔌 Usage
@@ -11519,7 +12690,7 @@ client.internal.ml.delete(
-**manifest:** `DeleteMlEntityRequestManifest` +**manifest:** `DeleteMlEntityRequestManifest` — Manifest identifying the ML entity to delete (model, prompt, artifact, agent skill, data directory, or ML Repo)
diff --git a/src/truefoundry_sdk/__init__.py b/src/truefoundry_sdk/__init__.py index 137af53b..aeac82ad 100644 --- a/src/truefoundry_sdk/__init__.py +++ b/src/truefoundry_sdk/__init__.py @@ -7,6 +7,7 @@ if typing.TYPE_CHECKING: from .types import ( + A2AFramework, Account, AccountInfo, ActivateUserResponse, @@ -14,14 +15,23 @@ AddonComponent, AddonComponentName, AddonComponentStatus, + AgentFramework, AgentManifest, AgentSkill, + AgentSkillManifest, + AgentSkillManifestSource, + AgentSkillSourceBlobStorage, + AgentSkillSourceInline, + AgentSkillVersion, AgentSource, Ai21Integrations, Ai21KeyAuth, Ai21Model, Ai21ProviderAccount, AiFeaturesSettings, + AktoGuardrailConfig, + AktoGuardrailConfigConfig, + AktoTokenAuth, Alert, AlertConfig, AlertConfigResource, @@ -114,7 +124,6 @@ AzureOAuth, AzureOpenAiModel, AzureOpenAiModelDeploymentType, - AzureOpenAiModelRegion, AzureOpenAiProviderAccount, AzureOpenAiProviderAccountAuthData, AzurePiiCategory, @@ -134,11 +143,16 @@ BaseAutoscaling, BaseOAuth2Login, BaseOAuth2LoginJwtSource, + BaseRemoteAgent, BaseService, BaseServiceImage, BaseServiceMountsItem, BaseWorkbenchInput, BaseWorkbenchInputMountsItem, + BasetenIntegrations, + BasetenKeyAuth, + BasetenModel, + BasetenProviderAccount, BasicAuthCreds, BedrockModel, BitbucketIntegration, @@ -203,22 +217,33 @@ ContainerTaskConfigMountsItem, CoreNatsOutputConfig, CpuUtilizationMetric, + CreateDockerRepositoryResponse, CreateMultiPartUploadRequest, CreatePersonalAccessTokenResponse, CronMetric, + CustomAgentServerAuth, CustomBasicAuth, CustomBearerAuth, CustomBlobStorage, + CustomEndpoint, + CustomEndpointAuthData, + CustomEndpointIntegrations, + CustomEndpointProviderAccount, + CustomEndpointProviderAccountAuthData, + CustomFramework, CustomGuardrailConfig, CustomGuardrailConfigAuthData, CustomGuardrailConfigConfig, CustomGuardrailConfigOperation, CustomGuardrailConfigTarget, + CustomHeaderAuth, CustomHelmRepo, CustomIntegrations, CustomJwtAuthIntegration, CustomProviderAccount, CustomRegexPattern, + CustomServerHeaderAuth, + CustomServerPassthrough, CustomTlsSettings, CustomUsernamePasswordArtifactsRegistry, DataAccessRule, @@ -228,6 +253,8 @@ DataDirectoryManifestSource, DatabricksApiKeyAuth, DatabricksIntegrations, + DatabricksJobTaskConfig, + DatabricksJobTaskConfigImage, DatabricksModel, DatabricksProviderAccount, DatabricksProviderAccountAuthData, @@ -327,6 +354,7 @@ GatewayMetadataRule, GatewayMetadataWhen, GatewayOtelConfig, + GatewayOtelConfigOtelMetricsExporterConfig, GatewayOtelConfigOtelTracesExporterConfig, GatewayRequestMetadataFilter, GatewayRequestMetadataFilterOperator, @@ -343,6 +371,9 @@ GcpRegion, GcpTpu, GeminiModel, + GenericSecretStoreIntegration, + GetAgentSkillResponse, + GetAgentSkillVersionResponse, GetAlertsResponse, GetApplicationDeploymentResponse, GetApplicationResponse, @@ -353,6 +384,7 @@ GetChartsResponse, GetClusterResponse, GetDataDirectoryResponse, + GetDockerRegistryCredentialsResponse, GetEnvironmentResponse, GetEventsResponse, GetJobRunResponse, @@ -368,8 +400,10 @@ GetSignedUrLsRequest, GetSignedUrLsResponse, GetSuggestedDeploymentEndpointResponse, + GetTeamPermissionsResponse, GetTeamResponse, GetTokenForVirtualAccountResponse, + GetUserPermissionsResponse, GetUserResourcesResponse, GetUserResponse, GetUserTeamsResponse, @@ -389,6 +423,7 @@ GoogleModelArmorGuardrailConfig, GoogleModelArmorGuardrailConfigAuthData, GoogleModelArmorGuardrailConfigConfig, + GoogleModelArmorGuardrailConfigOperation, GoogleModelArmorKeyFileAuth, GoogleModelArmorKeyFileAuthKeyFileContent, GoogleVertexProviderAccount, @@ -409,12 +444,15 @@ GuardrailsRule, GuardrailsWhen, H2OFramework, + HashicorpAppRoleAuth, HashicorpIntegrations, HashicorpProviderAccount, HashicorpTokenAuth, HashicorpVaultIntegration, + HashicorpVaultIntegrationAuthData, HeaderMatch, HeaderRoutingConfig, + HeadersOverride, HealthProbe, Helm, HelmRepo, @@ -478,8 +516,11 @@ LatencyBasedLoadBalanceTarget, LatencyBasedLoadBalancing, LatencyBasedLoadBalancingRule, + LegacyAgentManifest, LibraryName, LightGbmFramework, + ListAgentSkillVersionsResponse, + ListAgentSkillsResponse, ListApplicationDeploymentsResponse, ListApplicationsResponse, ListArtifactVersionsResponse, @@ -524,13 +565,17 @@ LogsSortingDirection, Manual, McpServerAuth, + McpServerEnvAuth, + McpServerEnvAuthAuthLevel, McpServerHeaderAuth, + McpServerHeaderAuthAuthLevel, McpServerHeaderOverrideAuth, McpServerIntegration, McpServerIntegrationTransport, McpServerIntegrations, McpServerManifest, McpServerOAuth2, + McpServerOAuth2GrantType, McpServerOAuth2JwtSource, McpServerPassthrough, McpServerProviderAccount, @@ -540,6 +585,9 @@ McpServerWithUrl, McpTool, McpToolSetting, + McpToolTarget, + McpToolsOperator, + McpToolsOperatorCondition, Metadata, Metric, MimeType, @@ -600,8 +648,6 @@ OpenAiModel, OpenAiModerationsGuardrailConfig, OpenAiModerationsGuardrailConfigConfig, - OpenAiModerationsGuardrailConfigConfigCategoryThresholdsValue, - OpenAiModerationsGuardrailConfigConfigCategoryThresholdsValueHarassment, OpenApiSpecSource, OpenApimcpServerManifest, OpenApimcpToolSetting, @@ -613,10 +659,15 @@ OpenaiApiKeyAuth, OpenaiProviderAccount, Operation, - OtelExporterGrpcConfig, - OtelExporterHttpConfig, - OtelExporterHttpConfigEncoding, - OtelExporterSpanAttributeFilter, + OtelExporterGrpcConfigBase, + OtelExporterHttpConfigBase, + OtelExporterHttpConfigBaseEncoding, + OtelMetricsExporterGrpcConfig, + OtelMetricsExporterHttpConfig, + OtelTracesExporterCommonConfig, + OtelTracesExporterGrpcConfig, + OtelTracesExporterHttpConfig, + OtelTracesExporterSpanAttributeFilter, OwnDataAccessRule, OwnedBy, PaddleFramework, @@ -691,10 +742,6 @@ PrivatePricingTier, PrometheusAlertRule, Prompt, - PromptFooGuardType, - PromptFooGuardrailConfig, - PromptFooGuardrailConfigConfig, - PromptFooGuardrailConfigOperation, PromptSource, PromptVersion, ProviderAccounts, @@ -723,19 +770,29 @@ RegexGuardrailConfigConfig, RegexGuardrailConfigOperation, RegisterUsersResponse, + RemoteAgent, RemoteMcpServerManifest, RemoteSource, RemoteSpecSource, Resources, ResourcesDevicesItem, ResourcesNode, + ResponseFormatJsonObject, + ResponseFormatJsonSchema, + ResponseFormatJsonSchemaJsonSchema, + ResponseFormatText, RetryConfig, RevokeAllPersonalAccessTokenResponse, + RoleBindingManifest, + RoleBindingPermission, + RoleBindingSubject, + RoleBindingSubjectType, RoleManifest, RoleWithResource, RoleWithResourceResourceType, Rolling, RpsMetric, + SagemakerAssumedRoleBasedAuth, SagemakerModel, SambaNovaIntegrations, SambaNovaKeyAuth, @@ -754,6 +811,7 @@ SecretMount, SecretStoreConfig, SecretVersion, + SelfHostedAgent, SelfHostedModel, SelfHostedModelAuthData, SelfHostedModelIntegrations, @@ -827,12 +885,17 @@ StageArtifactResponse, StaticVolumeConfig, StatsModelsFramework, + StdioMcpServerManifest, + StickyRouting, + StickySessionIdentifier, + StickySessionIdentifierSource, StringDataMount, SubAgent, Subject, SubjectClause, SubjectConditionGroup, SubjectConditionGroupOperator, + SubjectPermission, SubjectType, SyncTokenInSecretStoreInfo, SyncVirtualAccountTokenResponse, @@ -874,6 +937,20 @@ TracingProjectStorageConfig, TransformersFramework, TriggerJobRunResponse, + TrojAiClientIdAuth, + TrojAiGuardrailConfig, + TrojAiGuardrailConfigConfig, + TrojAiGuardrailConfigOperation, + TrueFoundryAgentManifest, + TrueFoundryAgentManifestModelParams, + TrueFoundryAgentManifestModelParamsReasoningEffort, + TrueFoundryAgentManifestResponseFormat, + TrueFoundryAgentManifestSandbox, + TrueFoundryAgentMcpServer, + TrueFoundryAgentMcpTool, + TrueFoundryAgentSkill, + TrueFoundryAgentUserMessage, + TrueFoundryAgentVariable, TrueFoundryApplyRequestManifest, TrueFoundryApplyResponse, TrueFoundryApplyResponseAction, @@ -900,6 +977,7 @@ UserMetadata, UserMetadataTenantRoleManagedBy, UserResource, + UserTeamInfo, Uv, ValidationError, ValidationErrorLocItem, @@ -957,6 +1035,8 @@ UnprocessableEntityError, ) from . import ( + agent_skill_versions, + agent_skills, alerts, application_versions, applications, @@ -997,6 +1077,7 @@ from .version import __version__ from .workspaces import WorkspacesDeleteResponse _dynamic_imports: typing.Dict[str, str] = { + "A2AFramework": ".types", "Account": ".types", "AccountInfo": ".types", "ActivateUserResponse": ".types", @@ -1004,14 +1085,23 @@ "AddonComponent": ".types", "AddonComponentName": ".types", "AddonComponentStatus": ".types", + "AgentFramework": ".types", "AgentManifest": ".types", "AgentSkill": ".types", + "AgentSkillManifest": ".types", + "AgentSkillManifestSource": ".types", + "AgentSkillSourceBlobStorage": ".types", + "AgentSkillSourceInline": ".types", + "AgentSkillVersion": ".types", "AgentSource": ".types", "Ai21Integrations": ".types", "Ai21KeyAuth": ".types", "Ai21Model": ".types", "Ai21ProviderAccount": ".types", "AiFeaturesSettings": ".types", + "AktoGuardrailConfig": ".types", + "AktoGuardrailConfigConfig": ".types", + "AktoTokenAuth": ".types", "Alert": ".types", "AlertConfig": ".types", "AlertConfigResource": ".types", @@ -1108,7 +1198,6 @@ "AzureOAuth": ".types", "AzureOpenAiModel": ".types", "AzureOpenAiModelDeploymentType": ".types", - "AzureOpenAiModelRegion": ".types", "AzureOpenAiProviderAccount": ".types", "AzureOpenAiProviderAccountAuthData": ".types", "AzurePiiCategory": ".types", @@ -1129,11 +1218,16 @@ "BaseAutoscaling": ".types", "BaseOAuth2Login": ".types", "BaseOAuth2LoginJwtSource": ".types", + "BaseRemoteAgent": ".types", "BaseService": ".types", "BaseServiceImage": ".types", "BaseServiceMountsItem": ".types", "BaseWorkbenchInput": ".types", "BaseWorkbenchInputMountsItem": ".types", + "BasetenIntegrations": ".types", + "BasetenKeyAuth": ".types", + "BasetenModel": ".types", + "BasetenProviderAccount": ".types", "BasicAuthCreds": ".types", "BedrockModel": ".types", "BitbucketIntegration": ".types", @@ -1200,22 +1294,33 @@ "ContainerTaskConfigMountsItem": ".types", "CoreNatsOutputConfig": ".types", "CpuUtilizationMetric": ".types", + "CreateDockerRepositoryResponse": ".types", "CreateMultiPartUploadRequest": ".types", "CreatePersonalAccessTokenResponse": ".types", "CronMetric": ".types", + "CustomAgentServerAuth": ".types", "CustomBasicAuth": ".types", "CustomBearerAuth": ".types", "CustomBlobStorage": ".types", + "CustomEndpoint": ".types", + "CustomEndpointAuthData": ".types", + "CustomEndpointIntegrations": ".types", + "CustomEndpointProviderAccount": ".types", + "CustomEndpointProviderAccountAuthData": ".types", + "CustomFramework": ".types", "CustomGuardrailConfig": ".types", "CustomGuardrailConfigAuthData": ".types", "CustomGuardrailConfigConfig": ".types", "CustomGuardrailConfigOperation": ".types", "CustomGuardrailConfigTarget": ".types", + "CustomHeaderAuth": ".types", "CustomHelmRepo": ".types", "CustomIntegrations": ".types", "CustomJwtAuthIntegration": ".types", "CustomProviderAccount": ".types", "CustomRegexPattern": ".types", + "CustomServerHeaderAuth": ".types", + "CustomServerPassthrough": ".types", "CustomTlsSettings": ".types", "CustomUsernamePasswordArtifactsRegistry": ".types", "DataAccessRule": ".types", @@ -1225,6 +1330,8 @@ "DataDirectoryManifestSource": ".types", "DatabricksApiKeyAuth": ".types", "DatabricksIntegrations": ".types", + "DatabricksJobTaskConfig": ".types", + "DatabricksJobTaskConfigImage": ".types", "DatabricksModel": ".types", "DatabricksProviderAccount": ".types", "DatabricksProviderAccountAuthData": ".types", @@ -1327,6 +1434,7 @@ "GatewayMetadataRule": ".types", "GatewayMetadataWhen": ".types", "GatewayOtelConfig": ".types", + "GatewayOtelConfigOtelMetricsExporterConfig": ".types", "GatewayOtelConfigOtelTracesExporterConfig": ".types", "GatewayRequestMetadataFilter": ".types", "GatewayRequestMetadataFilterOperator": ".types", @@ -1343,6 +1451,9 @@ "GcpRegion": ".types", "GcpTpu": ".types", "GeminiModel": ".types", + "GenericSecretStoreIntegration": ".types", + "GetAgentSkillResponse": ".types", + "GetAgentSkillVersionResponse": ".types", "GetAlertsResponse": ".types", "GetApplicationDeploymentResponse": ".types", "GetApplicationResponse": ".types", @@ -1353,6 +1464,7 @@ "GetChartsResponse": ".types", "GetClusterResponse": ".types", "GetDataDirectoryResponse": ".types", + "GetDockerRegistryCredentialsResponse": ".types", "GetEnvironmentResponse": ".types", "GetEventsResponse": ".types", "GetJobRunResponse": ".types", @@ -1368,8 +1480,10 @@ "GetSignedUrLsRequest": ".types", "GetSignedUrLsResponse": ".types", "GetSuggestedDeploymentEndpointResponse": ".types", + "GetTeamPermissionsResponse": ".types", "GetTeamResponse": ".types", "GetTokenForVirtualAccountResponse": ".types", + "GetUserPermissionsResponse": ".types", "GetUserResourcesResponse": ".types", "GetUserResponse": ".types", "GetUserTeamsResponse": ".types", @@ -1389,6 +1503,7 @@ "GoogleModelArmorGuardrailConfig": ".types", "GoogleModelArmorGuardrailConfigAuthData": ".types", "GoogleModelArmorGuardrailConfigConfig": ".types", + "GoogleModelArmorGuardrailConfigOperation": ".types", "GoogleModelArmorKeyFileAuth": ".types", "GoogleModelArmorKeyFileAuthKeyFileContent": ".types", "GoogleVertexProviderAccount": ".types", @@ -1409,12 +1524,15 @@ "GuardrailsRule": ".types", "GuardrailsWhen": ".types", "H2OFramework": ".types", + "HashicorpAppRoleAuth": ".types", "HashicorpIntegrations": ".types", "HashicorpProviderAccount": ".types", "HashicorpTokenAuth": ".types", "HashicorpVaultIntegration": ".types", + "HashicorpVaultIntegrationAuthData": ".types", "HeaderMatch": ".types", "HeaderRoutingConfig": ".types", + "HeadersOverride": ".types", "HealthProbe": ".types", "Helm": ".types", "HelmRepo": ".types", @@ -1478,8 +1596,11 @@ "LatencyBasedLoadBalanceTarget": ".types", "LatencyBasedLoadBalancing": ".types", "LatencyBasedLoadBalancingRule": ".types", + "LegacyAgentManifest": ".types", "LibraryName": ".types", "LightGbmFramework": ".types", + "ListAgentSkillVersionsResponse": ".types", + "ListAgentSkillsResponse": ".types", "ListApplicationDeploymentsResponse": ".types", "ListApplicationsResponse": ".types", "ListArtifactVersionsResponse": ".types", @@ -1524,13 +1645,17 @@ "LogsSortingDirection": ".types", "Manual": ".types", "McpServerAuth": ".types", + "McpServerEnvAuth": ".types", + "McpServerEnvAuthAuthLevel": ".types", "McpServerHeaderAuth": ".types", + "McpServerHeaderAuthAuthLevel": ".types", "McpServerHeaderOverrideAuth": ".types", "McpServerIntegration": ".types", "McpServerIntegrationTransport": ".types", "McpServerIntegrations": ".types", "McpServerManifest": ".types", "McpServerOAuth2": ".types", + "McpServerOAuth2GrantType": ".types", "McpServerOAuth2JwtSource": ".types", "McpServerPassthrough": ".types", "McpServerProviderAccount": ".types", @@ -1540,6 +1665,9 @@ "McpServerWithUrl": ".types", "McpTool": ".types", "McpToolSetting": ".types", + "McpToolTarget": ".types", + "McpToolsOperator": ".types", + "McpToolsOperatorCondition": ".types", "Metadata": ".types", "MethodNotAllowedError": ".errors", "Metric": ".types", @@ -1603,8 +1731,6 @@ "OpenAiModel": ".types", "OpenAiModerationsGuardrailConfig": ".types", "OpenAiModerationsGuardrailConfigConfig": ".types", - "OpenAiModerationsGuardrailConfigConfigCategoryThresholdsValue": ".types", - "OpenAiModerationsGuardrailConfigConfigCategoryThresholdsValueHarassment": ".types", "OpenApiSpecSource": ".types", "OpenApimcpServerManifest": ".types", "OpenApimcpToolSetting": ".types", @@ -1616,10 +1742,15 @@ "OpenaiApiKeyAuth": ".types", "OpenaiProviderAccount": ".types", "Operation": ".types", - "OtelExporterGrpcConfig": ".types", - "OtelExporterHttpConfig": ".types", - "OtelExporterHttpConfigEncoding": ".types", - "OtelExporterSpanAttributeFilter": ".types", + "OtelExporterGrpcConfigBase": ".types", + "OtelExporterHttpConfigBase": ".types", + "OtelExporterHttpConfigBaseEncoding": ".types", + "OtelMetricsExporterGrpcConfig": ".types", + "OtelMetricsExporterHttpConfig": ".types", + "OtelTracesExporterCommonConfig": ".types", + "OtelTracesExporterGrpcConfig": ".types", + "OtelTracesExporterHttpConfig": ".types", + "OtelTracesExporterSpanAttributeFilter": ".types", "OwnDataAccessRule": ".types", "OwnedBy": ".types", "PaddleFramework": ".types", @@ -1694,10 +1825,6 @@ "PrivatePricingTier": ".types", "PrometheusAlertRule": ".types", "Prompt": ".types", - "PromptFooGuardType": ".types", - "PromptFooGuardrailConfig": ".types", - "PromptFooGuardrailConfigConfig": ".types", - "PromptFooGuardrailConfigOperation": ".types", "PromptSource": ".types", "PromptVersion": ".types", "ProviderAccounts": ".types", @@ -1727,19 +1854,29 @@ "RegexGuardrailConfigConfig": ".types", "RegexGuardrailConfigOperation": ".types", "RegisterUsersResponse": ".types", + "RemoteAgent": ".types", "RemoteMcpServerManifest": ".types", "RemoteSource": ".types", "RemoteSpecSource": ".types", "Resources": ".types", "ResourcesDevicesItem": ".types", "ResourcesNode": ".types", + "ResponseFormatJsonObject": ".types", + "ResponseFormatJsonSchema": ".types", + "ResponseFormatJsonSchemaJsonSchema": ".types", + "ResponseFormatText": ".types", "RetryConfig": ".types", "RevokeAllPersonalAccessTokenResponse": ".types", + "RoleBindingManifest": ".types", + "RoleBindingPermission": ".types", + "RoleBindingSubject": ".types", + "RoleBindingSubjectType": ".types", "RoleManifest": ".types", "RoleWithResource": ".types", "RoleWithResourceResourceType": ".types", "Rolling": ".types", "RpsMetric": ".types", + "SagemakerAssumedRoleBasedAuth": ".types", "SagemakerModel": ".types", "SambaNovaIntegrations": ".types", "SambaNovaKeyAuth": ".types", @@ -1758,6 +1895,7 @@ "SecretMount": ".types", "SecretStoreConfig": ".types", "SecretVersion": ".types", + "SelfHostedAgent": ".types", "SelfHostedModel": ".types", "SelfHostedModelAuthData": ".types", "SelfHostedModelIntegrations": ".types", @@ -1832,12 +1970,17 @@ "StageArtifactResponse": ".types", "StaticVolumeConfig": ".types", "StatsModelsFramework": ".types", + "StdioMcpServerManifest": ".types", + "StickyRouting": ".types", + "StickySessionIdentifier": ".types", + "StickySessionIdentifierSource": ".types", "StringDataMount": ".types", "SubAgent": ".types", "Subject": ".types", "SubjectClause": ".types", "SubjectConditionGroup": ".types", "SubjectConditionGroupOperator": ".types", + "SubjectPermission": ".types", "SubjectType": ".types", "SyncTokenInSecretStoreInfo": ".types", "SyncVirtualAccountTokenResponse": ".types", @@ -1881,7 +2024,21 @@ "TransformersFramework": ".types", "TriggerJobRequestInput": ".jobs", "TriggerJobRunResponse": ".types", + "TrojAiClientIdAuth": ".types", + "TrojAiGuardrailConfig": ".types", + "TrojAiGuardrailConfigConfig": ".types", + "TrojAiGuardrailConfigOperation": ".types", "TrueFoundry": ".client", + "TrueFoundryAgentManifest": ".types", + "TrueFoundryAgentManifestModelParams": ".types", + "TrueFoundryAgentManifestModelParamsReasoningEffort": ".types", + "TrueFoundryAgentManifestResponseFormat": ".types", + "TrueFoundryAgentManifestSandbox": ".types", + "TrueFoundryAgentMcpServer": ".types", + "TrueFoundryAgentMcpTool": ".types", + "TrueFoundryAgentSkill": ".types", + "TrueFoundryAgentUserMessage": ".types", + "TrueFoundryAgentVariable": ".types", "TrueFoundryApplyRequestManifest": ".types", "TrueFoundryApplyResponse": ".types", "TrueFoundryApplyResponseAction": ".types", @@ -1910,6 +2067,7 @@ "UserMetadata": ".types", "UserMetadataTenantRoleManagedBy": ".types", "UserResource": ".types", + "UserTeamInfo": ".types", "Uv": ".types", "ValidationError": ".types", "ValidationErrorLocItem": ".types", @@ -1955,6 +2113,8 @@ "XgBoostModelSchema": ".types", "XgBoostSerializationFormat": ".types", "__version__": ".version", + "agent_skill_versions": ".agent_skill_versions", + "agent_skills": ".agent_skills", "alerts": ".alerts", "application_versions": ".application_versions", "applications": ".applications", @@ -2005,6 +2165,7 @@ def __dir__(): __all__ = [ + "A2AFramework", "Account", "AccountInfo", "ActivateUserResponse", @@ -2012,14 +2173,23 @@ def __dir__(): "AddonComponent", "AddonComponentName", "AddonComponentStatus", + "AgentFramework", "AgentManifest", "AgentSkill", + "AgentSkillManifest", + "AgentSkillManifestSource", + "AgentSkillSourceBlobStorage", + "AgentSkillSourceInline", + "AgentSkillVersion", "AgentSource", "Ai21Integrations", "Ai21KeyAuth", "Ai21Model", "Ai21ProviderAccount", "AiFeaturesSettings", + "AktoGuardrailConfig", + "AktoGuardrailConfigConfig", + "AktoTokenAuth", "Alert", "AlertConfig", "AlertConfigResource", @@ -2116,7 +2286,6 @@ def __dir__(): "AzureOAuth", "AzureOpenAiModel", "AzureOpenAiModelDeploymentType", - "AzureOpenAiModelRegion", "AzureOpenAiProviderAccount", "AzureOpenAiProviderAccountAuthData", "AzurePiiCategory", @@ -2137,11 +2306,16 @@ def __dir__(): "BaseAutoscaling", "BaseOAuth2Login", "BaseOAuth2LoginJwtSource", + "BaseRemoteAgent", "BaseService", "BaseServiceImage", "BaseServiceMountsItem", "BaseWorkbenchInput", "BaseWorkbenchInputMountsItem", + "BasetenIntegrations", + "BasetenKeyAuth", + "BasetenModel", + "BasetenProviderAccount", "BasicAuthCreds", "BedrockModel", "BitbucketIntegration", @@ -2208,22 +2382,33 @@ def __dir__(): "ContainerTaskConfigMountsItem", "CoreNatsOutputConfig", "CpuUtilizationMetric", + "CreateDockerRepositoryResponse", "CreateMultiPartUploadRequest", "CreatePersonalAccessTokenResponse", "CronMetric", + "CustomAgentServerAuth", "CustomBasicAuth", "CustomBearerAuth", "CustomBlobStorage", + "CustomEndpoint", + "CustomEndpointAuthData", + "CustomEndpointIntegrations", + "CustomEndpointProviderAccount", + "CustomEndpointProviderAccountAuthData", + "CustomFramework", "CustomGuardrailConfig", "CustomGuardrailConfigAuthData", "CustomGuardrailConfigConfig", "CustomGuardrailConfigOperation", "CustomGuardrailConfigTarget", + "CustomHeaderAuth", "CustomHelmRepo", "CustomIntegrations", "CustomJwtAuthIntegration", "CustomProviderAccount", "CustomRegexPattern", + "CustomServerHeaderAuth", + "CustomServerPassthrough", "CustomTlsSettings", "CustomUsernamePasswordArtifactsRegistry", "DataAccessRule", @@ -2233,6 +2418,8 @@ def __dir__(): "DataDirectoryManifestSource", "DatabricksApiKeyAuth", "DatabricksIntegrations", + "DatabricksJobTaskConfig", + "DatabricksJobTaskConfigImage", "DatabricksModel", "DatabricksProviderAccount", "DatabricksProviderAccountAuthData", @@ -2335,6 +2522,7 @@ def __dir__(): "GatewayMetadataRule", "GatewayMetadataWhen", "GatewayOtelConfig", + "GatewayOtelConfigOtelMetricsExporterConfig", "GatewayOtelConfigOtelTracesExporterConfig", "GatewayRequestMetadataFilter", "GatewayRequestMetadataFilterOperator", @@ -2351,6 +2539,9 @@ def __dir__(): "GcpRegion", "GcpTpu", "GeminiModel", + "GenericSecretStoreIntegration", + "GetAgentSkillResponse", + "GetAgentSkillVersionResponse", "GetAlertsResponse", "GetApplicationDeploymentResponse", "GetApplicationResponse", @@ -2361,6 +2552,7 @@ def __dir__(): "GetChartsResponse", "GetClusterResponse", "GetDataDirectoryResponse", + "GetDockerRegistryCredentialsResponse", "GetEnvironmentResponse", "GetEventsResponse", "GetJobRunResponse", @@ -2376,8 +2568,10 @@ def __dir__(): "GetSignedUrLsRequest", "GetSignedUrLsResponse", "GetSuggestedDeploymentEndpointResponse", + "GetTeamPermissionsResponse", "GetTeamResponse", "GetTokenForVirtualAccountResponse", + "GetUserPermissionsResponse", "GetUserResourcesResponse", "GetUserResponse", "GetUserTeamsResponse", @@ -2397,6 +2591,7 @@ def __dir__(): "GoogleModelArmorGuardrailConfig", "GoogleModelArmorGuardrailConfigAuthData", "GoogleModelArmorGuardrailConfigConfig", + "GoogleModelArmorGuardrailConfigOperation", "GoogleModelArmorKeyFileAuth", "GoogleModelArmorKeyFileAuthKeyFileContent", "GoogleVertexProviderAccount", @@ -2417,12 +2612,15 @@ def __dir__(): "GuardrailsRule", "GuardrailsWhen", "H2OFramework", + "HashicorpAppRoleAuth", "HashicorpIntegrations", "HashicorpProviderAccount", "HashicorpTokenAuth", "HashicorpVaultIntegration", + "HashicorpVaultIntegrationAuthData", "HeaderMatch", "HeaderRoutingConfig", + "HeadersOverride", "HealthProbe", "Helm", "HelmRepo", @@ -2486,8 +2684,11 @@ def __dir__(): "LatencyBasedLoadBalanceTarget", "LatencyBasedLoadBalancing", "LatencyBasedLoadBalancingRule", + "LegacyAgentManifest", "LibraryName", "LightGbmFramework", + "ListAgentSkillVersionsResponse", + "ListAgentSkillsResponse", "ListApplicationDeploymentsResponse", "ListApplicationsResponse", "ListArtifactVersionsResponse", @@ -2532,13 +2733,17 @@ def __dir__(): "LogsSortingDirection", "Manual", "McpServerAuth", + "McpServerEnvAuth", + "McpServerEnvAuthAuthLevel", "McpServerHeaderAuth", + "McpServerHeaderAuthAuthLevel", "McpServerHeaderOverrideAuth", "McpServerIntegration", "McpServerIntegrationTransport", "McpServerIntegrations", "McpServerManifest", "McpServerOAuth2", + "McpServerOAuth2GrantType", "McpServerOAuth2JwtSource", "McpServerPassthrough", "McpServerProviderAccount", @@ -2548,6 +2753,9 @@ def __dir__(): "McpServerWithUrl", "McpTool", "McpToolSetting", + "McpToolTarget", + "McpToolsOperator", + "McpToolsOperatorCondition", "Metadata", "MethodNotAllowedError", "Metric", @@ -2611,8 +2819,6 @@ def __dir__(): "OpenAiModel", "OpenAiModerationsGuardrailConfig", "OpenAiModerationsGuardrailConfigConfig", - "OpenAiModerationsGuardrailConfigConfigCategoryThresholdsValue", - "OpenAiModerationsGuardrailConfigConfigCategoryThresholdsValueHarassment", "OpenApiSpecSource", "OpenApimcpServerManifest", "OpenApimcpToolSetting", @@ -2624,10 +2830,15 @@ def __dir__(): "OpenaiApiKeyAuth", "OpenaiProviderAccount", "Operation", - "OtelExporterGrpcConfig", - "OtelExporterHttpConfig", - "OtelExporterHttpConfigEncoding", - "OtelExporterSpanAttributeFilter", + "OtelExporterGrpcConfigBase", + "OtelExporterHttpConfigBase", + "OtelExporterHttpConfigBaseEncoding", + "OtelMetricsExporterGrpcConfig", + "OtelMetricsExporterHttpConfig", + "OtelTracesExporterCommonConfig", + "OtelTracesExporterGrpcConfig", + "OtelTracesExporterHttpConfig", + "OtelTracesExporterSpanAttributeFilter", "OwnDataAccessRule", "OwnedBy", "PaddleFramework", @@ -2702,10 +2913,6 @@ def __dir__(): "PrivatePricingTier", "PrometheusAlertRule", "Prompt", - "PromptFooGuardType", - "PromptFooGuardrailConfig", - "PromptFooGuardrailConfigConfig", - "PromptFooGuardrailConfigOperation", "PromptSource", "PromptVersion", "ProviderAccounts", @@ -2735,19 +2942,29 @@ def __dir__(): "RegexGuardrailConfigConfig", "RegexGuardrailConfigOperation", "RegisterUsersResponse", + "RemoteAgent", "RemoteMcpServerManifest", "RemoteSource", "RemoteSpecSource", "Resources", "ResourcesDevicesItem", "ResourcesNode", + "ResponseFormatJsonObject", + "ResponseFormatJsonSchema", + "ResponseFormatJsonSchemaJsonSchema", + "ResponseFormatText", "RetryConfig", "RevokeAllPersonalAccessTokenResponse", + "RoleBindingManifest", + "RoleBindingPermission", + "RoleBindingSubject", + "RoleBindingSubjectType", "RoleManifest", "RoleWithResource", "RoleWithResourceResourceType", "Rolling", "RpsMetric", + "SagemakerAssumedRoleBasedAuth", "SagemakerModel", "SambaNovaIntegrations", "SambaNovaKeyAuth", @@ -2766,6 +2983,7 @@ def __dir__(): "SecretMount", "SecretStoreConfig", "SecretVersion", + "SelfHostedAgent", "SelfHostedModel", "SelfHostedModelAuthData", "SelfHostedModelIntegrations", @@ -2840,12 +3058,17 @@ def __dir__(): "StageArtifactResponse", "StaticVolumeConfig", "StatsModelsFramework", + "StdioMcpServerManifest", + "StickyRouting", + "StickySessionIdentifier", + "StickySessionIdentifierSource", "StringDataMount", "SubAgent", "Subject", "SubjectClause", "SubjectConditionGroup", "SubjectConditionGroupOperator", + "SubjectPermission", "SubjectType", "SyncTokenInSecretStoreInfo", "SyncVirtualAccountTokenResponse", @@ -2889,7 +3112,21 @@ def __dir__(): "TransformersFramework", "TriggerJobRequestInput", "TriggerJobRunResponse", + "TrojAiClientIdAuth", + "TrojAiGuardrailConfig", + "TrojAiGuardrailConfigConfig", + "TrojAiGuardrailConfigOperation", "TrueFoundry", + "TrueFoundryAgentManifest", + "TrueFoundryAgentManifestModelParams", + "TrueFoundryAgentManifestModelParamsReasoningEffort", + "TrueFoundryAgentManifestResponseFormat", + "TrueFoundryAgentManifestSandbox", + "TrueFoundryAgentMcpServer", + "TrueFoundryAgentMcpTool", + "TrueFoundryAgentSkill", + "TrueFoundryAgentUserMessage", + "TrueFoundryAgentVariable", "TrueFoundryApplyRequestManifest", "TrueFoundryApplyResponse", "TrueFoundryApplyResponseAction", @@ -2918,6 +3155,7 @@ def __dir__(): "UserMetadata", "UserMetadataTenantRoleManagedBy", "UserResource", + "UserTeamInfo", "Uv", "ValidationError", "ValidationErrorLocItem", @@ -2963,6 +3201,8 @@ def __dir__(): "XgBoostModelSchema", "XgBoostSerializationFormat", "__version__", + "agent_skill_versions", + "agent_skills", "alerts", "application_versions", "applications", diff --git a/src/truefoundry_sdk/_wrapped_clients.py b/src/truefoundry_sdk/_wrapped_clients.py index 727ddec5..6a3388a5 100644 --- a/src/truefoundry_sdk/_wrapped_clients.py +++ b/src/truefoundry_sdk/_wrapped_clients.py @@ -48,7 +48,7 @@ def _get_by_fqn(client: HasListMethod[T, R], *, fqn: str, request_options: Optio raise NotFoundError( body=HttpError( message=f"No entity found with fqn {fqn}", - statusCode=404, + status_code=404, ) ) return result @@ -67,7 +67,7 @@ async def _aget_by_fqn( raise NotFoundError( body=HttpError( message=f"No entity found with fqn {fqn}", - statusCode=404, + status_code=404, ) ) return result diff --git a/src/truefoundry_sdk/agent_skill_versions/__init__.py b/src/truefoundry_sdk/agent_skill_versions/__init__.py new file mode 100644 index 00000000..5cde0202 --- /dev/null +++ b/src/truefoundry_sdk/agent_skill_versions/__init__.py @@ -0,0 +1,4 @@ +# This file was auto-generated by Fern from our API Definition. + +# isort: skip_file + diff --git a/src/truefoundry_sdk/agent_skill_versions/client.py b/src/truefoundry_sdk/agent_skill_versions/client.py new file mode 100644 index 00000000..b45861a1 --- /dev/null +++ b/src/truefoundry_sdk/agent_skill_versions/client.py @@ -0,0 +1,353 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper +from ..core.pagination import AsyncPager, SyncPager +from ..core.request_options import RequestOptions +from ..types.agent_skill_version import AgentSkillVersion +from ..types.empty_response import EmptyResponse +from ..types.get_agent_skill_version_response import GetAgentSkillVersionResponse +from ..types.list_agent_skill_versions_response import ListAgentSkillVersionsResponse +from .raw_client import AsyncRawAgentSkillVersionsClient, RawAgentSkillVersionsClient + + +class AgentSkillVersionsClient: + def __init__(self, *, client_wrapper: SyncClientWrapper): + self._raw_client = RawAgentSkillVersionsClient(client_wrapper=client_wrapper) + + @property + def with_raw_response(self) -> RawAgentSkillVersionsClient: + """ + Retrieves a raw implementation of this client that returns raw responses. + + Returns + ------- + RawAgentSkillVersionsClient + """ + return self._raw_client + + def get( + self, agent_skill_version_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> GetAgentSkillVersionResponse: + """ + Parameters + ---------- + agent_skill_version_id : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + GetAgentSkillVersionResponse + Successful Response + + Examples + -------- + from truefoundry_sdk import TrueFoundry + + client = TrueFoundry( + api_key="YOUR_API_KEY", + base_url="https://yourhost.com/path/to/api", + ) + client.agent_skill_versions.get( + agent_skill_version_id="agent_skill_version_id", + ) + """ + _response = self._raw_client.get(agent_skill_version_id, request_options=request_options) + return _response.data + + def delete( + self, agent_skill_version_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> EmptyResponse: + """ + Parameters + ---------- + agent_skill_version_id : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + EmptyResponse + Successful Response + + Examples + -------- + from truefoundry_sdk import TrueFoundry + + client = TrueFoundry( + api_key="YOUR_API_KEY", + base_url="https://yourhost.com/path/to/api", + ) + client.agent_skill_versions.delete( + agent_skill_version_id="agent_skill_version_id", + ) + """ + _response = self._raw_client.delete(agent_skill_version_id, request_options=request_options) + return _response.data + + def list( + self, + *, + fqn: typing.Optional[str] = None, + agent_skill_id: typing.Optional[str] = None, + ml_repo_id: typing.Optional[str] = None, + name: typing.Optional[str] = None, + version: typing.Optional[int] = None, + offset: typing.Optional[int] = 0, + limit: typing.Optional[int] = 100, + request_options: typing.Optional[RequestOptions] = None, + ) -> SyncPager[AgentSkillVersion, ListAgentSkillVersionsResponse]: + """ + List agent skill versions. Each manifest has `source.type` `blob-storage` and `description` only; use GET for full SKILL.md content. + + Parameters + ---------- + fqn : typing.Optional[str] + FQN filter for agent skill versions + + agent_skill_id : typing.Optional[str] + Parent agent skill artifact ID + + ml_repo_id : typing.Optional[str] + ML Repo ID filter + + name : typing.Optional[str] + Agent skill name filter + + version : typing.Optional[int] + Version number or 'latest' + + offset : typing.Optional[int] + Pagination offset + + limit : typing.Optional[int] + Page size + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + SyncPager[AgentSkillVersion, ListAgentSkillVersionsResponse] + Successful Response + + Examples + -------- + from truefoundry_sdk import TrueFoundry + + client = TrueFoundry( + api_key="YOUR_API_KEY", + base_url="https://yourhost.com/path/to/api", + ) + response = client.agent_skill_versions.list( + fqn="fqn", + agent_skill_id="agent_skill_id", + ml_repo_id="ml_repo_id", + name="name", + version=1, + offset=1, + limit=1, + ) + for item in response: + yield item + # alternatively, you can paginate page-by-page + for page in response.iter_pages(): + yield page + """ + return self._raw_client.list( + fqn=fqn, + agent_skill_id=agent_skill_id, + ml_repo_id=ml_repo_id, + name=name, + version=version, + offset=offset, + limit=limit, + request_options=request_options, + ) + + +class AsyncAgentSkillVersionsClient: + def __init__(self, *, client_wrapper: AsyncClientWrapper): + self._raw_client = AsyncRawAgentSkillVersionsClient(client_wrapper=client_wrapper) + + @property + def with_raw_response(self) -> AsyncRawAgentSkillVersionsClient: + """ + Retrieves a raw implementation of this client that returns raw responses. + + Returns + ------- + AsyncRawAgentSkillVersionsClient + """ + return self._raw_client + + async def get( + self, agent_skill_version_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> GetAgentSkillVersionResponse: + """ + Parameters + ---------- + agent_skill_version_id : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + GetAgentSkillVersionResponse + Successful Response + + Examples + -------- + import asyncio + + from truefoundry_sdk import AsyncTrueFoundry + + client = AsyncTrueFoundry( + api_key="YOUR_API_KEY", + base_url="https://yourhost.com/path/to/api", + ) + + + async def main() -> None: + await client.agent_skill_versions.get( + agent_skill_version_id="agent_skill_version_id", + ) + + + asyncio.run(main()) + """ + _response = await self._raw_client.get(agent_skill_version_id, request_options=request_options) + return _response.data + + async def delete( + self, agent_skill_version_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> EmptyResponse: + """ + Parameters + ---------- + agent_skill_version_id : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + EmptyResponse + Successful Response + + Examples + -------- + import asyncio + + from truefoundry_sdk import AsyncTrueFoundry + + client = AsyncTrueFoundry( + api_key="YOUR_API_KEY", + base_url="https://yourhost.com/path/to/api", + ) + + + async def main() -> None: + await client.agent_skill_versions.delete( + agent_skill_version_id="agent_skill_version_id", + ) + + + asyncio.run(main()) + """ + _response = await self._raw_client.delete(agent_skill_version_id, request_options=request_options) + return _response.data + + async def list( + self, + *, + fqn: typing.Optional[str] = None, + agent_skill_id: typing.Optional[str] = None, + ml_repo_id: typing.Optional[str] = None, + name: typing.Optional[str] = None, + version: typing.Optional[int] = None, + offset: typing.Optional[int] = 0, + limit: typing.Optional[int] = 100, + request_options: typing.Optional[RequestOptions] = None, + ) -> AsyncPager[AgentSkillVersion, ListAgentSkillVersionsResponse]: + """ + List agent skill versions. Each manifest has `source.type` `blob-storage` and `description` only; use GET for full SKILL.md content. + + Parameters + ---------- + fqn : typing.Optional[str] + FQN filter for agent skill versions + + agent_skill_id : typing.Optional[str] + Parent agent skill artifact ID + + ml_repo_id : typing.Optional[str] + ML Repo ID filter + + name : typing.Optional[str] + Agent skill name filter + + version : typing.Optional[int] + Version number or 'latest' + + offset : typing.Optional[int] + Pagination offset + + limit : typing.Optional[int] + Page size + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AsyncPager[AgentSkillVersion, ListAgentSkillVersionsResponse] + Successful Response + + Examples + -------- + import asyncio + + from truefoundry_sdk import AsyncTrueFoundry + + client = AsyncTrueFoundry( + api_key="YOUR_API_KEY", + base_url="https://yourhost.com/path/to/api", + ) + + + async def main() -> None: + response = await client.agent_skill_versions.list( + fqn="fqn", + agent_skill_id="agent_skill_id", + ml_repo_id="ml_repo_id", + name="name", + version=1, + offset=1, + limit=1, + ) + async for item in response: + yield item + + # alternatively, you can paginate page-by-page + async for page in response.iter_pages(): + yield page + + + asyncio.run(main()) + """ + return await self._raw_client.list( + fqn=fqn, + agent_skill_id=agent_skill_id, + ml_repo_id=ml_repo_id, + name=name, + version=version, + offset=offset, + limit=limit, + request_options=request_options, + ) diff --git a/src/truefoundry_sdk/agent_skill_versions/raw_client.py b/src/truefoundry_sdk/agent_skill_versions/raw_client.py new file mode 100644 index 00000000..ba63cb55 --- /dev/null +++ b/src/truefoundry_sdk/agent_skill_versions/raw_client.py @@ -0,0 +1,418 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing +from json.decoder import JSONDecodeError + +from ..core.api_error import ApiError +from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper +from ..core.http_response import AsyncHttpResponse, HttpResponse +from ..core.jsonable_encoder import jsonable_encoder +from ..core.pagination import AsyncPager, SyncPager +from ..core.pydantic_utilities import parse_obj_as +from ..core.request_options import RequestOptions +from ..errors.unprocessable_entity_error import UnprocessableEntityError +from ..types.agent_skill_version import AgentSkillVersion +from ..types.empty_response import EmptyResponse +from ..types.get_agent_skill_version_response import GetAgentSkillVersionResponse +from ..types.list_agent_skill_versions_response import ListAgentSkillVersionsResponse + + +class RawAgentSkillVersionsClient: + def __init__(self, *, client_wrapper: SyncClientWrapper): + self._client_wrapper = client_wrapper + + def get( + self, agent_skill_version_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> HttpResponse[GetAgentSkillVersionResponse]: + """ + Parameters + ---------- + agent_skill_version_id : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + HttpResponse[GetAgentSkillVersionResponse] + Successful Response + """ + _response = self._client_wrapper.httpx_client.request( + f"api/ml/v1/agent-skill-versions/{jsonable_encoder(agent_skill_version_id)}", + method="GET", + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + GetAgentSkillVersionResponse, + parse_obj_as( + type_=GetAgentSkillVersionResponse, # type: ignore + object_=_response.json(), + ), + ) + return HttpResponse(response=_response, data=_data) + if _response.status_code == 422: + raise UnprocessableEntityError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + + def delete( + self, agent_skill_version_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> HttpResponse[EmptyResponse]: + """ + Parameters + ---------- + agent_skill_version_id : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + HttpResponse[EmptyResponse] + Successful Response + """ + _response = self._client_wrapper.httpx_client.request( + f"api/ml/v1/agent-skill-versions/{jsonable_encoder(agent_skill_version_id)}", + method="DELETE", + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + EmptyResponse, + parse_obj_as( + type_=EmptyResponse, # type: ignore + object_=_response.json(), + ), + ) + return HttpResponse(response=_response, data=_data) + if _response.status_code == 422: + raise UnprocessableEntityError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + + def list( + self, + *, + fqn: typing.Optional[str] = None, + agent_skill_id: typing.Optional[str] = None, + ml_repo_id: typing.Optional[str] = None, + name: typing.Optional[str] = None, + version: typing.Optional[int] = None, + offset: typing.Optional[int] = 0, + limit: typing.Optional[int] = 100, + request_options: typing.Optional[RequestOptions] = None, + ) -> SyncPager[AgentSkillVersion, ListAgentSkillVersionsResponse]: + """ + List agent skill versions. Each manifest has `source.type` `blob-storage` and `description` only; use GET for full SKILL.md content. + + Parameters + ---------- + fqn : typing.Optional[str] + FQN filter for agent skill versions + + agent_skill_id : typing.Optional[str] + Parent agent skill artifact ID + + ml_repo_id : typing.Optional[str] + ML Repo ID filter + + name : typing.Optional[str] + Agent skill name filter + + version : typing.Optional[int] + Version number or 'latest' + + offset : typing.Optional[int] + Pagination offset + + limit : typing.Optional[int] + Page size + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + SyncPager[AgentSkillVersion, ListAgentSkillVersionsResponse] + Successful Response + """ + offset = offset if offset is not None else 0 + + _response = self._client_wrapper.httpx_client.request( + "api/ml/v1/agent-skill-versions", + method="GET", + params={ + "fqn": fqn, + "agent_skill_id": agent_skill_id, + "ml_repo_id": ml_repo_id, + "name": name, + "version": version, + "offset": offset, + "limit": limit, + }, + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _parsed_response = typing.cast( + ListAgentSkillVersionsResponse, + parse_obj_as( + type_=ListAgentSkillVersionsResponse, # type: ignore + object_=_response.json(), + ), + ) + _items = _parsed_response.data + _has_next = True + _get_next = lambda: self.list( + fqn=fqn, + agent_skill_id=agent_skill_id, + ml_repo_id=ml_repo_id, + name=name, + version=version, + offset=offset + len(_items or []), + limit=limit, + request_options=request_options, + ) + return SyncPager(has_next=_has_next, items=_items, get_next=_get_next, response=_parsed_response) + if _response.status_code == 422: + raise UnprocessableEntityError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + + +class AsyncRawAgentSkillVersionsClient: + def __init__(self, *, client_wrapper: AsyncClientWrapper): + self._client_wrapper = client_wrapper + + async def get( + self, agent_skill_version_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> AsyncHttpResponse[GetAgentSkillVersionResponse]: + """ + Parameters + ---------- + agent_skill_version_id : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AsyncHttpResponse[GetAgentSkillVersionResponse] + Successful Response + """ + _response = await self._client_wrapper.httpx_client.request( + f"api/ml/v1/agent-skill-versions/{jsonable_encoder(agent_skill_version_id)}", + method="GET", + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + GetAgentSkillVersionResponse, + parse_obj_as( + type_=GetAgentSkillVersionResponse, # type: ignore + object_=_response.json(), + ), + ) + return AsyncHttpResponse(response=_response, data=_data) + if _response.status_code == 422: + raise UnprocessableEntityError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + + async def delete( + self, agent_skill_version_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> AsyncHttpResponse[EmptyResponse]: + """ + Parameters + ---------- + agent_skill_version_id : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AsyncHttpResponse[EmptyResponse] + Successful Response + """ + _response = await self._client_wrapper.httpx_client.request( + f"api/ml/v1/agent-skill-versions/{jsonable_encoder(agent_skill_version_id)}", + method="DELETE", + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + EmptyResponse, + parse_obj_as( + type_=EmptyResponse, # type: ignore + object_=_response.json(), + ), + ) + return AsyncHttpResponse(response=_response, data=_data) + if _response.status_code == 422: + raise UnprocessableEntityError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + + async def list( + self, + *, + fqn: typing.Optional[str] = None, + agent_skill_id: typing.Optional[str] = None, + ml_repo_id: typing.Optional[str] = None, + name: typing.Optional[str] = None, + version: typing.Optional[int] = None, + offset: typing.Optional[int] = 0, + limit: typing.Optional[int] = 100, + request_options: typing.Optional[RequestOptions] = None, + ) -> AsyncPager[AgentSkillVersion, ListAgentSkillVersionsResponse]: + """ + List agent skill versions. Each manifest has `source.type` `blob-storage` and `description` only; use GET for full SKILL.md content. + + Parameters + ---------- + fqn : typing.Optional[str] + FQN filter for agent skill versions + + agent_skill_id : typing.Optional[str] + Parent agent skill artifact ID + + ml_repo_id : typing.Optional[str] + ML Repo ID filter + + name : typing.Optional[str] + Agent skill name filter + + version : typing.Optional[int] + Version number or 'latest' + + offset : typing.Optional[int] + Pagination offset + + limit : typing.Optional[int] + Page size + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AsyncPager[AgentSkillVersion, ListAgentSkillVersionsResponse] + Successful Response + """ + offset = offset if offset is not None else 0 + + _response = await self._client_wrapper.httpx_client.request( + "api/ml/v1/agent-skill-versions", + method="GET", + params={ + "fqn": fqn, + "agent_skill_id": agent_skill_id, + "ml_repo_id": ml_repo_id, + "name": name, + "version": version, + "offset": offset, + "limit": limit, + }, + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _parsed_response = typing.cast( + ListAgentSkillVersionsResponse, + parse_obj_as( + type_=ListAgentSkillVersionsResponse, # type: ignore + object_=_response.json(), + ), + ) + _items = _parsed_response.data + _has_next = True + + async def _get_next(): + return await self.list( + fqn=fqn, + agent_skill_id=agent_skill_id, + ml_repo_id=ml_repo_id, + name=name, + version=version, + offset=offset + len(_items or []), + limit=limit, + request_options=request_options, + ) + + return AsyncPager(has_next=_has_next, items=_items, get_next=_get_next, response=_parsed_response) + if _response.status_code == 422: + raise UnprocessableEntityError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) diff --git a/src/truefoundry_sdk/agent_skills/__init__.py b/src/truefoundry_sdk/agent_skills/__init__.py new file mode 100644 index 00000000..5cde0202 --- /dev/null +++ b/src/truefoundry_sdk/agent_skills/__init__.py @@ -0,0 +1,4 @@ +# This file was auto-generated by Fern from our API Definition. + +# isort: skip_file + diff --git a/src/truefoundry_sdk/agent_skills/client.py b/src/truefoundry_sdk/agent_skills/client.py new file mode 100644 index 00000000..69c069d5 --- /dev/null +++ b/src/truefoundry_sdk/agent_skills/client.py @@ -0,0 +1,450 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper +from ..core.pagination import AsyncPager, SyncPager +from ..core.request_options import RequestOptions +from ..types.agent_skill import AgentSkill +from ..types.agent_skill_manifest import AgentSkillManifest +from ..types.empty_response import EmptyResponse +from ..types.get_agent_skill_response import GetAgentSkillResponse +from ..types.get_agent_skill_version_response import GetAgentSkillVersionResponse +from ..types.list_agent_skills_response import ListAgentSkillsResponse +from .raw_client import AsyncRawAgentSkillsClient, RawAgentSkillsClient + +# this is used as the default value for optional parameters +OMIT = typing.cast(typing.Any, ...) + + +class AgentSkillsClient: + def __init__(self, *, client_wrapper: SyncClientWrapper): + self._raw_client = RawAgentSkillsClient(client_wrapper=client_wrapper) + + @property + def with_raw_response(self) -> RawAgentSkillsClient: + """ + Retrieves a raw implementation of this client that returns raw responses. + + Returns + ------- + RawAgentSkillsClient + """ + return self._raw_client + + def get( + self, agent_skill_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> GetAgentSkillResponse: + """ + Get an agent skill artifact by its ID. + + Parameters + ---------- + agent_skill_id : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + GetAgentSkillResponse + Successful Response + + Examples + -------- + from truefoundry_sdk import TrueFoundry + + client = TrueFoundry( + api_key="YOUR_API_KEY", + base_url="https://yourhost.com/path/to/api", + ) + client.agent_skills.get( + agent_skill_id="agent_skill_id", + ) + """ + _response = self._raw_client.get(agent_skill_id, request_options=request_options) + return _response.data + + def delete(self, agent_skill_id: str, *, request_options: typing.Optional[RequestOptions] = None) -> EmptyResponse: + """ + Delete an agent skill artifact by its ID. + + Parameters + ---------- + agent_skill_id : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + EmptyResponse + Successful Response + + Examples + -------- + from truefoundry_sdk import TrueFoundry + + client = TrueFoundry( + api_key="YOUR_API_KEY", + base_url="https://yourhost.com/path/to/api", + ) + client.agent_skills.delete( + agent_skill_id="agent_skill_id", + ) + """ + _response = self._raw_client.delete(agent_skill_id, request_options=request_options) + return _response.data + + def list( + self, + *, + fqn: typing.Optional[str] = None, + ml_repo_id: typing.Optional[str] = None, + name: typing.Optional[str] = None, + offset: typing.Optional[int] = 0, + limit: typing.Optional[int] = 100, + include_empty_agent_skills: typing.Optional[bool] = True, + request_options: typing.Optional[RequestOptions] = None, + ) -> SyncPager[AgentSkill, ListAgentSkillsResponse]: + """ + List agent skills with optional filtering by FQN, ML Repo, or name. When present, `latest_version.manifest.source` is `blob-storage` with `description` only; use GET agent skill version for full SKILL.md (inline `source` with `skill_md`). + + Parameters + ---------- + fqn : typing.Optional[str] + Fully qualified name to filter agent skills by (format: 'agent_skill:{tenant}/{ml_repo}/{agent_skill_name}') + + ml_repo_id : typing.Optional[str] + ML Repo ID filter + + name : typing.Optional[str] + Agent skill name filter + + offset : typing.Optional[int] + Pagination offset + + limit : typing.Optional[int] + Page size + + include_empty_agent_skills : typing.Optional[bool] + Whether to include agent skills that have no versions + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + SyncPager[AgentSkill, ListAgentSkillsResponse] + Successful Response + + Examples + -------- + from truefoundry_sdk import TrueFoundry + + client = TrueFoundry( + api_key="YOUR_API_KEY", + base_url="https://yourhost.com/path/to/api", + ) + response = client.agent_skills.list( + fqn="fqn", + ml_repo_id="ml_repo_id", + name="name", + offset=1, + limit=1, + include_empty_agent_skills=True, + ) + for item in response: + yield item + # alternatively, you can paginate page-by-page + for page in response.iter_pages(): + yield page + """ + return self._raw_client.list( + fqn=fqn, + ml_repo_id=ml_repo_id, + name=name, + offset=offset, + limit=limit, + include_empty_agent_skills=include_empty_agent_skills, + request_options=request_options, + ) + + def create_or_update( + self, *, manifest: AgentSkillManifest, request_options: typing.Optional[RequestOptions] = None + ) -> GetAgentSkillVersionResponse: + """ + Create or update an agent skill version from a manifest. + + Parameters + ---------- + manifest : AgentSkillManifest + Manifest containing metadata for the agent skill to apply + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + GetAgentSkillVersionResponse + The created or updated agent skill version + + Examples + -------- + from truefoundry_sdk import ( + AgentSkillManifest, + AgentSkillSourceInline, + TrueFoundry, + ) + + client = TrueFoundry( + api_key="YOUR_API_KEY", + base_url="https://yourhost.com/path/to/api", + ) + client.agent_skills.create_or_update( + manifest=AgentSkillManifest( + name="name", + metadata={"key": "value"}, + ml_repo="ml_repo", + source=AgentSkillSourceInline( + skill_md="skill_md", + ), + ), + ) + """ + _response = self._raw_client.create_or_update(manifest=manifest, request_options=request_options) + return _response.data + + +class AsyncAgentSkillsClient: + def __init__(self, *, client_wrapper: AsyncClientWrapper): + self._raw_client = AsyncRawAgentSkillsClient(client_wrapper=client_wrapper) + + @property + def with_raw_response(self) -> AsyncRawAgentSkillsClient: + """ + Retrieves a raw implementation of this client that returns raw responses. + + Returns + ------- + AsyncRawAgentSkillsClient + """ + return self._raw_client + + async def get( + self, agent_skill_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> GetAgentSkillResponse: + """ + Get an agent skill artifact by its ID. + + Parameters + ---------- + agent_skill_id : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + GetAgentSkillResponse + Successful Response + + Examples + -------- + import asyncio + + from truefoundry_sdk import AsyncTrueFoundry + + client = AsyncTrueFoundry( + api_key="YOUR_API_KEY", + base_url="https://yourhost.com/path/to/api", + ) + + + async def main() -> None: + await client.agent_skills.get( + agent_skill_id="agent_skill_id", + ) + + + asyncio.run(main()) + """ + _response = await self._raw_client.get(agent_skill_id, request_options=request_options) + return _response.data + + async def delete( + self, agent_skill_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> EmptyResponse: + """ + Delete an agent skill artifact by its ID. + + Parameters + ---------- + agent_skill_id : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + EmptyResponse + Successful Response + + Examples + -------- + import asyncio + + from truefoundry_sdk import AsyncTrueFoundry + + client = AsyncTrueFoundry( + api_key="YOUR_API_KEY", + base_url="https://yourhost.com/path/to/api", + ) + + + async def main() -> None: + await client.agent_skills.delete( + agent_skill_id="agent_skill_id", + ) + + + asyncio.run(main()) + """ + _response = await self._raw_client.delete(agent_skill_id, request_options=request_options) + return _response.data + + async def list( + self, + *, + fqn: typing.Optional[str] = None, + ml_repo_id: typing.Optional[str] = None, + name: typing.Optional[str] = None, + offset: typing.Optional[int] = 0, + limit: typing.Optional[int] = 100, + include_empty_agent_skills: typing.Optional[bool] = True, + request_options: typing.Optional[RequestOptions] = None, + ) -> AsyncPager[AgentSkill, ListAgentSkillsResponse]: + """ + List agent skills with optional filtering by FQN, ML Repo, or name. When present, `latest_version.manifest.source` is `blob-storage` with `description` only; use GET agent skill version for full SKILL.md (inline `source` with `skill_md`). + + Parameters + ---------- + fqn : typing.Optional[str] + Fully qualified name to filter agent skills by (format: 'agent_skill:{tenant}/{ml_repo}/{agent_skill_name}') + + ml_repo_id : typing.Optional[str] + ML Repo ID filter + + name : typing.Optional[str] + Agent skill name filter + + offset : typing.Optional[int] + Pagination offset + + limit : typing.Optional[int] + Page size + + include_empty_agent_skills : typing.Optional[bool] + Whether to include agent skills that have no versions + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AsyncPager[AgentSkill, ListAgentSkillsResponse] + Successful Response + + Examples + -------- + import asyncio + + from truefoundry_sdk import AsyncTrueFoundry + + client = AsyncTrueFoundry( + api_key="YOUR_API_KEY", + base_url="https://yourhost.com/path/to/api", + ) + + + async def main() -> None: + response = await client.agent_skills.list( + fqn="fqn", + ml_repo_id="ml_repo_id", + name="name", + offset=1, + limit=1, + include_empty_agent_skills=True, + ) + async for item in response: + yield item + + # alternatively, you can paginate page-by-page + async for page in response.iter_pages(): + yield page + + + asyncio.run(main()) + """ + return await self._raw_client.list( + fqn=fqn, + ml_repo_id=ml_repo_id, + name=name, + offset=offset, + limit=limit, + include_empty_agent_skills=include_empty_agent_skills, + request_options=request_options, + ) + + async def create_or_update( + self, *, manifest: AgentSkillManifest, request_options: typing.Optional[RequestOptions] = None + ) -> GetAgentSkillVersionResponse: + """ + Create or update an agent skill version from a manifest. + + Parameters + ---------- + manifest : AgentSkillManifest + Manifest containing metadata for the agent skill to apply + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + GetAgentSkillVersionResponse + The created or updated agent skill version + + Examples + -------- + import asyncio + + from truefoundry_sdk import ( + AgentSkillManifest, + AgentSkillSourceInline, + AsyncTrueFoundry, + ) + + client = AsyncTrueFoundry( + api_key="YOUR_API_KEY", + base_url="https://yourhost.com/path/to/api", + ) + + + async def main() -> None: + await client.agent_skills.create_or_update( + manifest=AgentSkillManifest( + name="name", + metadata={"key": "value"}, + ml_repo="ml_repo", + source=AgentSkillSourceInline( + skill_md="skill_md", + ), + ), + ) + + + asyncio.run(main()) + """ + _response = await self._raw_client.create_or_update(manifest=manifest, request_options=request_options) + return _response.data diff --git a/src/truefoundry_sdk/agent_skills/raw_client.py b/src/truefoundry_sdk/agent_skills/raw_client.py new file mode 100644 index 00000000..48545bf3 --- /dev/null +++ b/src/truefoundry_sdk/agent_skills/raw_client.py @@ -0,0 +1,538 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing +from json.decoder import JSONDecodeError + +from ..core.api_error import ApiError +from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper +from ..core.http_response import AsyncHttpResponse, HttpResponse +from ..core.jsonable_encoder import jsonable_encoder +from ..core.pagination import AsyncPager, SyncPager +from ..core.pydantic_utilities import parse_obj_as +from ..core.request_options import RequestOptions +from ..core.serialization import convert_and_respect_annotation_metadata +from ..errors.unprocessable_entity_error import UnprocessableEntityError +from ..types.agent_skill import AgentSkill +from ..types.agent_skill_manifest import AgentSkillManifest +from ..types.empty_response import EmptyResponse +from ..types.get_agent_skill_response import GetAgentSkillResponse +from ..types.get_agent_skill_version_response import GetAgentSkillVersionResponse +from ..types.list_agent_skills_response import ListAgentSkillsResponse + +# this is used as the default value for optional parameters +OMIT = typing.cast(typing.Any, ...) + + +class RawAgentSkillsClient: + def __init__(self, *, client_wrapper: SyncClientWrapper): + self._client_wrapper = client_wrapper + + def get( + self, agent_skill_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> HttpResponse[GetAgentSkillResponse]: + """ + Get an agent skill artifact by its ID. + + Parameters + ---------- + agent_skill_id : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + HttpResponse[GetAgentSkillResponse] + Successful Response + """ + _response = self._client_wrapper.httpx_client.request( + f"api/ml/v1/agent-skills/{jsonable_encoder(agent_skill_id)}", + method="GET", + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + GetAgentSkillResponse, + parse_obj_as( + type_=GetAgentSkillResponse, # type: ignore + object_=_response.json(), + ), + ) + return HttpResponse(response=_response, data=_data) + if _response.status_code == 422: + raise UnprocessableEntityError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + + def delete( + self, agent_skill_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> HttpResponse[EmptyResponse]: + """ + Delete an agent skill artifact by its ID. + + Parameters + ---------- + agent_skill_id : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + HttpResponse[EmptyResponse] + Successful Response + """ + _response = self._client_wrapper.httpx_client.request( + f"api/ml/v1/agent-skills/{jsonable_encoder(agent_skill_id)}", + method="DELETE", + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + EmptyResponse, + parse_obj_as( + type_=EmptyResponse, # type: ignore + object_=_response.json(), + ), + ) + return HttpResponse(response=_response, data=_data) + if _response.status_code == 422: + raise UnprocessableEntityError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + + def list( + self, + *, + fqn: typing.Optional[str] = None, + ml_repo_id: typing.Optional[str] = None, + name: typing.Optional[str] = None, + offset: typing.Optional[int] = 0, + limit: typing.Optional[int] = 100, + include_empty_agent_skills: typing.Optional[bool] = True, + request_options: typing.Optional[RequestOptions] = None, + ) -> SyncPager[AgentSkill, ListAgentSkillsResponse]: + """ + List agent skills with optional filtering by FQN, ML Repo, or name. When present, `latest_version.manifest.source` is `blob-storage` with `description` only; use GET agent skill version for full SKILL.md (inline `source` with `skill_md`). + + Parameters + ---------- + fqn : typing.Optional[str] + Fully qualified name to filter agent skills by (format: 'agent_skill:{tenant}/{ml_repo}/{agent_skill_name}') + + ml_repo_id : typing.Optional[str] + ML Repo ID filter + + name : typing.Optional[str] + Agent skill name filter + + offset : typing.Optional[int] + Pagination offset + + limit : typing.Optional[int] + Page size + + include_empty_agent_skills : typing.Optional[bool] + Whether to include agent skills that have no versions + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + SyncPager[AgentSkill, ListAgentSkillsResponse] + Successful Response + """ + offset = offset if offset is not None else 0 + + _response = self._client_wrapper.httpx_client.request( + "api/ml/v1/agent-skills", + method="GET", + params={ + "fqn": fqn, + "ml_repo_id": ml_repo_id, + "name": name, + "offset": offset, + "limit": limit, + "include_empty_agent_skills": include_empty_agent_skills, + }, + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _parsed_response = typing.cast( + ListAgentSkillsResponse, + parse_obj_as( + type_=ListAgentSkillsResponse, # type: ignore + object_=_response.json(), + ), + ) + _items = _parsed_response.data + _has_next = True + _get_next = lambda: self.list( + fqn=fqn, + ml_repo_id=ml_repo_id, + name=name, + offset=offset + len(_items or []), + limit=limit, + include_empty_agent_skills=include_empty_agent_skills, + request_options=request_options, + ) + return SyncPager(has_next=_has_next, items=_items, get_next=_get_next, response=_parsed_response) + if _response.status_code == 422: + raise UnprocessableEntityError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + + def create_or_update( + self, *, manifest: AgentSkillManifest, request_options: typing.Optional[RequestOptions] = None + ) -> HttpResponse[GetAgentSkillVersionResponse]: + """ + Create or update an agent skill version from a manifest. + + Parameters + ---------- + manifest : AgentSkillManifest + Manifest containing metadata for the agent skill to apply + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + HttpResponse[GetAgentSkillVersionResponse] + The created or updated agent skill version + """ + _response = self._client_wrapper.httpx_client.request( + "api/ml/v1/agent-skill-versions", + method="PUT", + json={ + "manifest": convert_and_respect_annotation_metadata( + object_=manifest, annotation=AgentSkillManifest, direction="write" + ), + }, + headers={ + "content-type": "application/json", + }, + request_options=request_options, + omit=OMIT, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + GetAgentSkillVersionResponse, + parse_obj_as( + type_=GetAgentSkillVersionResponse, # type: ignore + object_=_response.json(), + ), + ) + return HttpResponse(response=_response, data=_data) + if _response.status_code == 422: + raise UnprocessableEntityError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + + +class AsyncRawAgentSkillsClient: + def __init__(self, *, client_wrapper: AsyncClientWrapper): + self._client_wrapper = client_wrapper + + async def get( + self, agent_skill_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> AsyncHttpResponse[GetAgentSkillResponse]: + """ + Get an agent skill artifact by its ID. + + Parameters + ---------- + agent_skill_id : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AsyncHttpResponse[GetAgentSkillResponse] + Successful Response + """ + _response = await self._client_wrapper.httpx_client.request( + f"api/ml/v1/agent-skills/{jsonable_encoder(agent_skill_id)}", + method="GET", + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + GetAgentSkillResponse, + parse_obj_as( + type_=GetAgentSkillResponse, # type: ignore + object_=_response.json(), + ), + ) + return AsyncHttpResponse(response=_response, data=_data) + if _response.status_code == 422: + raise UnprocessableEntityError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + + async def delete( + self, agent_skill_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> AsyncHttpResponse[EmptyResponse]: + """ + Delete an agent skill artifact by its ID. + + Parameters + ---------- + agent_skill_id : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AsyncHttpResponse[EmptyResponse] + Successful Response + """ + _response = await self._client_wrapper.httpx_client.request( + f"api/ml/v1/agent-skills/{jsonable_encoder(agent_skill_id)}", + method="DELETE", + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + EmptyResponse, + parse_obj_as( + type_=EmptyResponse, # type: ignore + object_=_response.json(), + ), + ) + return AsyncHttpResponse(response=_response, data=_data) + if _response.status_code == 422: + raise UnprocessableEntityError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + + async def list( + self, + *, + fqn: typing.Optional[str] = None, + ml_repo_id: typing.Optional[str] = None, + name: typing.Optional[str] = None, + offset: typing.Optional[int] = 0, + limit: typing.Optional[int] = 100, + include_empty_agent_skills: typing.Optional[bool] = True, + request_options: typing.Optional[RequestOptions] = None, + ) -> AsyncPager[AgentSkill, ListAgentSkillsResponse]: + """ + List agent skills with optional filtering by FQN, ML Repo, or name. When present, `latest_version.manifest.source` is `blob-storage` with `description` only; use GET agent skill version for full SKILL.md (inline `source` with `skill_md`). + + Parameters + ---------- + fqn : typing.Optional[str] + Fully qualified name to filter agent skills by (format: 'agent_skill:{tenant}/{ml_repo}/{agent_skill_name}') + + ml_repo_id : typing.Optional[str] + ML Repo ID filter + + name : typing.Optional[str] + Agent skill name filter + + offset : typing.Optional[int] + Pagination offset + + limit : typing.Optional[int] + Page size + + include_empty_agent_skills : typing.Optional[bool] + Whether to include agent skills that have no versions + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AsyncPager[AgentSkill, ListAgentSkillsResponse] + Successful Response + """ + offset = offset if offset is not None else 0 + + _response = await self._client_wrapper.httpx_client.request( + "api/ml/v1/agent-skills", + method="GET", + params={ + "fqn": fqn, + "ml_repo_id": ml_repo_id, + "name": name, + "offset": offset, + "limit": limit, + "include_empty_agent_skills": include_empty_agent_skills, + }, + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _parsed_response = typing.cast( + ListAgentSkillsResponse, + parse_obj_as( + type_=ListAgentSkillsResponse, # type: ignore + object_=_response.json(), + ), + ) + _items = _parsed_response.data + _has_next = True + + async def _get_next(): + return await self.list( + fqn=fqn, + ml_repo_id=ml_repo_id, + name=name, + offset=offset + len(_items or []), + limit=limit, + include_empty_agent_skills=include_empty_agent_skills, + request_options=request_options, + ) + + return AsyncPager(has_next=_has_next, items=_items, get_next=_get_next, response=_parsed_response) + if _response.status_code == 422: + raise UnprocessableEntityError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + + async def create_or_update( + self, *, manifest: AgentSkillManifest, request_options: typing.Optional[RequestOptions] = None + ) -> AsyncHttpResponse[GetAgentSkillVersionResponse]: + """ + Create or update an agent skill version from a manifest. + + Parameters + ---------- + manifest : AgentSkillManifest + Manifest containing metadata for the agent skill to apply + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AsyncHttpResponse[GetAgentSkillVersionResponse] + The created or updated agent skill version + """ + _response = await self._client_wrapper.httpx_client.request( + "api/ml/v1/agent-skill-versions", + method="PUT", + json={ + "manifest": convert_and_respect_annotation_metadata( + object_=manifest, annotation=AgentSkillManifest, direction="write" + ), + }, + headers={ + "content-type": "application/json", + }, + request_options=request_options, + omit=OMIT, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + GetAgentSkillVersionResponse, + parse_obj_as( + type_=GetAgentSkillVersionResponse, # type: ignore + object_=_response.json(), + ), + ) + return AsyncHttpResponse(response=_response, data=_data) + if _response.status_code == 422: + raise UnprocessableEntityError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) diff --git a/src/truefoundry_sdk/artifact_versions/client.py b/src/truefoundry_sdk/artifact_versions/client.py index 3f435486..2017edc1 100644 --- a/src/truefoundry_sdk/artifact_versions/client.py +++ b/src/truefoundry_sdk/artifact_versions/client.py @@ -46,13 +46,18 @@ def apply_tags( request_options: typing.Optional[RequestOptions] = None, ) -> EmptyResponse: """ + Apply tags to an artifact version. + Parameters ---------- artifact_version_id : str + ID of the artifact version to apply tags to tags : typing.Sequence[str] + List of tags to apply to the artifact version force : typing.Optional[bool] + Whether to overwrite existing tags if they conflict request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -60,7 +65,7 @@ def apply_tags( Returns ------- EmptyResponse - Successful Response + Empty response indicating successful tag application Examples -------- @@ -82,7 +87,7 @@ def apply_tags( def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> GetArtifactVersionResponse: """ - Get artifact version API + Get an artifact version by its ID. Parameters ---------- @@ -94,7 +99,7 @@ def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = Non Returns ------- GetArtifactVersionResponse - Successful Response + The artifact version data Examples -------- @@ -113,7 +118,7 @@ def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = Non def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> EmptyResponse: """ - Delete artifact versions API + Delete an artifact version by its ID. Parameters ---------- @@ -125,7 +130,7 @@ def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] = Returns ------- EmptyResponse - Successful Response + Empty response indicating successful deletion Examples -------- @@ -159,31 +164,42 @@ def list( request_options: typing.Optional[RequestOptions] = None, ) -> SyncPager[ArtifactVersion, ListArtifactVersionsResponse]: """ - List artifact version API + List artifact versions with optional filtering by tag, FQN, artifact ID, ML Repo, name, version, run IDs, or run steps. Parameters ---------- tag : typing.Optional[str] + Tag to filter artifact versions by fqn : typing.Optional[str] + Fully qualified name to filter artifact versions by (format: '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}' or '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}:{version}') artifact_id : typing.Optional[str] + ID of the artifact to filter versions by ml_repo_id : typing.Optional[str] + ID of the ML Repo to filter artifact versions by name : typing.Optional[str] + Name of the artifact to filter versions by version : typing.Optional[int] + Version number (positive integer) or 'latest' to filter by specific version run_ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] + List of run IDs to filter artifact versions by run_steps : typing.Optional[typing.Union[int, typing.Sequence[int]]] + List of run step numbers to filter artifact versions by offset : typing.Optional[int] + Number of artifact versions to skip for pagination limit : typing.Optional[int] + Maximum number of artifact versions to return include_internal_metadata : typing.Optional[bool] + Whether to include internal metadata in the response request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -191,7 +207,7 @@ def list( Returns ------- SyncPager[ArtifactVersion, ListArtifactVersionsResponse] - Successful Response + List of artifact versions matching the query with pagination information Examples -------- @@ -242,13 +258,18 @@ def get_signed_urls( request_options: typing.Optional[RequestOptions] = None, ) -> GetSignedUrLsResponse: """ + Get pre-signed URLs for reading or writing files in an artifact version. + Parameters ---------- id : str + ID of the artifact version to get signed URLs for paths : typing.Sequence[str] + List of relative file paths within the artifact version to get signed URLs for operation : Operation + Operation type for the signed URL (e.g., 'READ' or 'WRITE') request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -256,7 +277,7 @@ def get_signed_urls( Returns ------- GetSignedUrLsResponse - Successful Response + List of signed URLs for the requested file paths Examples -------- @@ -281,13 +302,18 @@ def create_multi_part_upload( self, *, id: str, path: str, num_parts: int, request_options: typing.Optional[RequestOptions] = None ) -> MultiPartUploadResponse: """ + Create a multipart upload for large files in an artifact version. + Parameters ---------- id : str + ID of the artifact version to upload files to path : str + Relative path within the artifact version where the file should be uploaded num_parts : int + Number of parts to split the upload into for multipart upload request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -295,7 +321,7 @@ def create_multi_part_upload( Returns ------- MultiPartUploadResponse - Successful Response + Multipart upload information including signed URLs for each part Examples -------- @@ -320,9 +346,12 @@ def stage( self, *, manifest: StageArtifactRequestManifest, request_options: typing.Optional[RequestOptions] = None ) -> StageArtifactResponse: """ + Stage an artifact version for upload, returning storage location and version ID. + Parameters ---------- manifest : StageArtifactRequestManifest + Manifest containing metadata for the artifact to be staged (model or generic artifact) request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -330,7 +359,7 @@ def stage( Returns ------- StageArtifactResponse - Successful Response + Staging information including version ID, storage root, and artifact ID Examples -------- @@ -362,15 +391,21 @@ def list_files( request_options: typing.Optional[RequestOptions] = None, ) -> SyncPager[FileInfo, ListFilesResponse]: """ + List files and directories in an artifact version. + Parameters ---------- id : str + ID of the artifact version to list files from path : typing.Optional[str] + Relative path within the artifact version to list files from (defaults to root) limit : typing.Optional[int] + Maximum number of files/directories to return page_token : typing.Optional[str] + Token to retrieve the next page of results request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -378,7 +413,7 @@ def list_files( Returns ------- SyncPager[FileInfo, ListFilesResponse] - Successful Response + List of files and directories with pagination information Examples -------- @@ -403,9 +438,12 @@ def list_files( def mark_stage_failure(self, *, id: str, request_options: typing.Optional[RequestOptions] = None) -> EmptyResponse: """ + Mark a staged artifact version as failed. + Parameters ---------- id : str + ID of the staged artifact version to mark as failed request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -413,7 +451,7 @@ def mark_stage_failure(self, *, id: str, request_options: typing.Optional[Reques Returns ------- EmptyResponse - Successful Response + Empty response indicating successful failure marking Examples -------- @@ -455,13 +493,18 @@ async def apply_tags( request_options: typing.Optional[RequestOptions] = None, ) -> EmptyResponse: """ + Apply tags to an artifact version. + Parameters ---------- artifact_version_id : str + ID of the artifact version to apply tags to tags : typing.Sequence[str] + List of tags to apply to the artifact version force : typing.Optional[bool] + Whether to overwrite existing tags if they conflict request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -469,7 +512,7 @@ async def apply_tags( Returns ------- EmptyResponse - Successful Response + Empty response indicating successful tag application Examples -------- @@ -501,7 +544,7 @@ async def get( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> GetArtifactVersionResponse: """ - Get artifact version API + Get an artifact version by its ID. Parameters ---------- @@ -513,7 +556,7 @@ async def get( Returns ------- GetArtifactVersionResponse - Successful Response + The artifact version data Examples -------- @@ -540,7 +583,7 @@ async def main() -> None: async def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> EmptyResponse: """ - Delete artifact versions API + Delete an artifact version by its ID. Parameters ---------- @@ -552,7 +595,7 @@ async def delete(self, id: str, *, request_options: typing.Optional[RequestOptio Returns ------- EmptyResponse - Successful Response + Empty response indicating successful deletion Examples -------- @@ -594,31 +637,42 @@ async def list( request_options: typing.Optional[RequestOptions] = None, ) -> AsyncPager[ArtifactVersion, ListArtifactVersionsResponse]: """ - List artifact version API + List artifact versions with optional filtering by tag, FQN, artifact ID, ML Repo, name, version, run IDs, or run steps. Parameters ---------- tag : typing.Optional[str] + Tag to filter artifact versions by fqn : typing.Optional[str] + Fully qualified name to filter artifact versions by (format: '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}' or '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}:{version}') artifact_id : typing.Optional[str] + ID of the artifact to filter versions by ml_repo_id : typing.Optional[str] + ID of the ML Repo to filter artifact versions by name : typing.Optional[str] + Name of the artifact to filter versions by version : typing.Optional[int] + Version number (positive integer) or 'latest' to filter by specific version run_ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] + List of run IDs to filter artifact versions by run_steps : typing.Optional[typing.Union[int, typing.Sequence[int]]] + List of run step numbers to filter artifact versions by offset : typing.Optional[int] + Number of artifact versions to skip for pagination limit : typing.Optional[int] + Maximum number of artifact versions to return include_internal_metadata : typing.Optional[bool] + Whether to include internal metadata in the response request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -626,7 +680,7 @@ async def list( Returns ------- AsyncPager[ArtifactVersion, ListArtifactVersionsResponse] - Successful Response + List of artifact versions matching the query with pagination information Examples -------- @@ -686,13 +740,18 @@ async def get_signed_urls( request_options: typing.Optional[RequestOptions] = None, ) -> GetSignedUrLsResponse: """ + Get pre-signed URLs for reading or writing files in an artifact version. + Parameters ---------- id : str + ID of the artifact version to get signed URLs for paths : typing.Sequence[str] + List of relative file paths within the artifact version to get signed URLs for operation : Operation + Operation type for the signed URL (e.g., 'READ' or 'WRITE') request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -700,7 +759,7 @@ async def get_signed_urls( Returns ------- GetSignedUrLsResponse - Successful Response + List of signed URLs for the requested file paths Examples -------- @@ -733,13 +792,18 @@ async def create_multi_part_upload( self, *, id: str, path: str, num_parts: int, request_options: typing.Optional[RequestOptions] = None ) -> MultiPartUploadResponse: """ + Create a multipart upload for large files in an artifact version. + Parameters ---------- id : str + ID of the artifact version to upload files to path : str + Relative path within the artifact version where the file should be uploaded num_parts : int + Number of parts to split the upload into for multipart upload request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -747,7 +811,7 @@ async def create_multi_part_upload( Returns ------- MultiPartUploadResponse - Successful Response + Multipart upload information including signed URLs for each part Examples -------- @@ -780,9 +844,12 @@ async def stage( self, *, manifest: StageArtifactRequestManifest, request_options: typing.Optional[RequestOptions] = None ) -> StageArtifactResponse: """ + Stage an artifact version for upload, returning storage location and version ID. + Parameters ---------- manifest : StageArtifactRequestManifest + Manifest containing metadata for the artifact to be staged (model or generic artifact) request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -790,7 +857,7 @@ async def stage( Returns ------- StageArtifactResponse - Successful Response + Staging information including version ID, storage root, and artifact ID Examples -------- @@ -834,15 +901,21 @@ async def list_files( request_options: typing.Optional[RequestOptions] = None, ) -> AsyncPager[FileInfo, ListFilesResponse]: """ + List files and directories in an artifact version. + Parameters ---------- id : str + ID of the artifact version to list files from path : typing.Optional[str] + Relative path within the artifact version to list files from (defaults to root) limit : typing.Optional[int] + Maximum number of files/directories to return page_token : typing.Optional[str] + Token to retrieve the next page of results request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -850,7 +923,7 @@ async def list_files( Returns ------- AsyncPager[FileInfo, ListFilesResponse] - Successful Response + List of files and directories with pagination information Examples -------- @@ -886,9 +959,12 @@ async def mark_stage_failure( self, *, id: str, request_options: typing.Optional[RequestOptions] = None ) -> EmptyResponse: """ + Mark a staged artifact version as failed. + Parameters ---------- id : str + ID of the staged artifact version to mark as failed request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -896,7 +972,7 @@ async def mark_stage_failure( Returns ------- EmptyResponse - Successful Response + Empty response indicating successful failure marking Examples -------- diff --git a/src/truefoundry_sdk/artifact_versions/raw_client.py b/src/truefoundry_sdk/artifact_versions/raw_client.py index 335f56fd..c8157acd 100644 --- a/src/truefoundry_sdk/artifact_versions/raw_client.py +++ b/src/truefoundry_sdk/artifact_versions/raw_client.py @@ -41,13 +41,18 @@ def apply_tags( request_options: typing.Optional[RequestOptions] = None, ) -> HttpResponse[EmptyResponse]: """ + Apply tags to an artifact version. + Parameters ---------- artifact_version_id : str + ID of the artifact version to apply tags to tags : typing.Sequence[str] + List of tags to apply to the artifact version force : typing.Optional[bool] + Whether to overwrite existing tags if they conflict request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -55,7 +60,7 @@ def apply_tags( Returns ------- HttpResponse[EmptyResponse] - Successful Response + Empty response indicating successful tag application """ _response = self._client_wrapper.httpx_client.request( "api/ml/v1/artifact-versions/tags", @@ -101,7 +106,7 @@ def get( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> HttpResponse[GetArtifactVersionResponse]: """ - Get artifact version API + Get an artifact version by its ID. Parameters ---------- @@ -113,7 +118,7 @@ def get( Returns ------- HttpResponse[GetArtifactVersionResponse] - Successful Response + The artifact version data """ _response = self._client_wrapper.httpx_client.request( f"api/ml/v1/artifact-versions/{jsonable_encoder(id)}", @@ -150,7 +155,7 @@ def delete( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> HttpResponse[EmptyResponse]: """ - Delete artifact versions API + Delete an artifact version by its ID. Parameters ---------- @@ -162,7 +167,7 @@ def delete( Returns ------- HttpResponse[EmptyResponse] - Successful Response + Empty response indicating successful deletion """ _response = self._client_wrapper.httpx_client.request( f"api/ml/v1/artifact-versions/{jsonable_encoder(id)}", @@ -212,31 +217,42 @@ def list( request_options: typing.Optional[RequestOptions] = None, ) -> SyncPager[ArtifactVersion, ListArtifactVersionsResponse]: """ - List artifact version API + List artifact versions with optional filtering by tag, FQN, artifact ID, ML Repo, name, version, run IDs, or run steps. Parameters ---------- tag : typing.Optional[str] + Tag to filter artifact versions by fqn : typing.Optional[str] + Fully qualified name to filter artifact versions by (format: '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}' or '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}:{version}') artifact_id : typing.Optional[str] + ID of the artifact to filter versions by ml_repo_id : typing.Optional[str] + ID of the ML Repo to filter artifact versions by name : typing.Optional[str] + Name of the artifact to filter versions by version : typing.Optional[int] + Version number (positive integer) or 'latest' to filter by specific version run_ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] + List of run IDs to filter artifact versions by run_steps : typing.Optional[typing.Union[int, typing.Sequence[int]]] + List of run step numbers to filter artifact versions by offset : typing.Optional[int] + Number of artifact versions to skip for pagination limit : typing.Optional[int] + Maximum number of artifact versions to return include_internal_metadata : typing.Optional[bool] + Whether to include internal metadata in the response request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -244,7 +260,7 @@ def list( Returns ------- SyncPager[ArtifactVersion, ListArtifactVersionsResponse] - Successful Response + List of artifact versions matching the query with pagination information """ offset = offset if offset is not None else 0 @@ -317,13 +333,18 @@ def get_signed_urls( request_options: typing.Optional[RequestOptions] = None, ) -> HttpResponse[GetSignedUrLsResponse]: """ + Get pre-signed URLs for reading or writing files in an artifact version. + Parameters ---------- id : str + ID of the artifact version to get signed URLs for paths : typing.Sequence[str] + List of relative file paths within the artifact version to get signed URLs for operation : Operation + Operation type for the signed URL (e.g., 'READ' or 'WRITE') request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -331,7 +352,7 @@ def get_signed_urls( Returns ------- HttpResponse[GetSignedUrLsResponse] - Successful Response + List of signed URLs for the requested file paths """ _response = self._client_wrapper.httpx_client.request( "api/ml/v1/artifact-versions/signed-urls", @@ -377,13 +398,18 @@ def create_multi_part_upload( self, *, id: str, path: str, num_parts: int, request_options: typing.Optional[RequestOptions] = None ) -> HttpResponse[MultiPartUploadResponse]: """ + Create a multipart upload for large files in an artifact version. + Parameters ---------- id : str + ID of the artifact version to upload files to path : str + Relative path within the artifact version where the file should be uploaded num_parts : int + Number of parts to split the upload into for multipart upload request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -391,7 +417,7 @@ def create_multi_part_upload( Returns ------- HttpResponse[MultiPartUploadResponse] - Successful Response + Multipart upload information including signed URLs for each part """ _response = self._client_wrapper.httpx_client.request( "api/ml/v1/artifact-versions/signed-urls/multipart", @@ -437,9 +463,12 @@ def stage( self, *, manifest: StageArtifactRequestManifest, request_options: typing.Optional[RequestOptions] = None ) -> HttpResponse[StageArtifactResponse]: """ + Stage an artifact version for upload, returning storage location and version ID. + Parameters ---------- manifest : StageArtifactRequestManifest + Manifest containing metadata for the artifact to be staged (model or generic artifact) request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -447,7 +476,7 @@ def stage( Returns ------- HttpResponse[StageArtifactResponse] - Successful Response + Staging information including version ID, storage root, and artifact ID """ _response = self._client_wrapper.httpx_client.request( "api/ml/v1/artifact-versions/stage", @@ -499,15 +528,21 @@ def list_files( request_options: typing.Optional[RequestOptions] = None, ) -> SyncPager[FileInfo, ListFilesResponse]: """ + List files and directories in an artifact version. + Parameters ---------- id : str + ID of the artifact version to list files from path : typing.Optional[str] + Relative path within the artifact version to list files from (defaults to root) limit : typing.Optional[int] + Maximum number of files/directories to return page_token : typing.Optional[str] + Token to retrieve the next page of results request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -515,7 +550,7 @@ def list_files( Returns ------- SyncPager[FileInfo, ListFilesResponse] - Successful Response + List of files and directories with pagination information """ _response = self._client_wrapper.httpx_client.request( "api/ml/v1/artifact-versions/files", @@ -575,9 +610,12 @@ def mark_stage_failure( self, *, id: str, request_options: typing.Optional[RequestOptions] = None ) -> HttpResponse[EmptyResponse]: """ + Mark a staged artifact version as failed. + Parameters ---------- id : str + ID of the staged artifact version to mark as failed request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -585,7 +623,7 @@ def mark_stage_failure( Returns ------- HttpResponse[EmptyResponse] - Successful Response + Empty response indicating successful failure marking """ _response = self._client_wrapper.httpx_client.request( "api/ml/v1/artifact-versions/mark-stage-failure", @@ -639,13 +677,18 @@ async def apply_tags( request_options: typing.Optional[RequestOptions] = None, ) -> AsyncHttpResponse[EmptyResponse]: """ + Apply tags to an artifact version. + Parameters ---------- artifact_version_id : str + ID of the artifact version to apply tags to tags : typing.Sequence[str] + List of tags to apply to the artifact version force : typing.Optional[bool] + Whether to overwrite existing tags if they conflict request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -653,7 +696,7 @@ async def apply_tags( Returns ------- AsyncHttpResponse[EmptyResponse] - Successful Response + Empty response indicating successful tag application """ _response = await self._client_wrapper.httpx_client.request( "api/ml/v1/artifact-versions/tags", @@ -699,7 +742,7 @@ async def get( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> AsyncHttpResponse[GetArtifactVersionResponse]: """ - Get artifact version API + Get an artifact version by its ID. Parameters ---------- @@ -711,7 +754,7 @@ async def get( Returns ------- AsyncHttpResponse[GetArtifactVersionResponse] - Successful Response + The artifact version data """ _response = await self._client_wrapper.httpx_client.request( f"api/ml/v1/artifact-versions/{jsonable_encoder(id)}", @@ -748,7 +791,7 @@ async def delete( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> AsyncHttpResponse[EmptyResponse]: """ - Delete artifact versions API + Delete an artifact version by its ID. Parameters ---------- @@ -760,7 +803,7 @@ async def delete( Returns ------- AsyncHttpResponse[EmptyResponse] - Successful Response + Empty response indicating successful deletion """ _response = await self._client_wrapper.httpx_client.request( f"api/ml/v1/artifact-versions/{jsonable_encoder(id)}", @@ -810,31 +853,42 @@ async def list( request_options: typing.Optional[RequestOptions] = None, ) -> AsyncPager[ArtifactVersion, ListArtifactVersionsResponse]: """ - List artifact version API + List artifact versions with optional filtering by tag, FQN, artifact ID, ML Repo, name, version, run IDs, or run steps. Parameters ---------- tag : typing.Optional[str] + Tag to filter artifact versions by fqn : typing.Optional[str] + Fully qualified name to filter artifact versions by (format: '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}' or '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}:{version}') artifact_id : typing.Optional[str] + ID of the artifact to filter versions by ml_repo_id : typing.Optional[str] + ID of the ML Repo to filter artifact versions by name : typing.Optional[str] + Name of the artifact to filter versions by version : typing.Optional[int] + Version number (positive integer) or 'latest' to filter by specific version run_ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] + List of run IDs to filter artifact versions by run_steps : typing.Optional[typing.Union[int, typing.Sequence[int]]] + List of run step numbers to filter artifact versions by offset : typing.Optional[int] + Number of artifact versions to skip for pagination limit : typing.Optional[int] + Maximum number of artifact versions to return include_internal_metadata : typing.Optional[bool] + Whether to include internal metadata in the response request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -842,7 +896,7 @@ async def list( Returns ------- AsyncPager[ArtifactVersion, ListArtifactVersionsResponse] - Successful Response + List of artifact versions matching the query with pagination information """ offset = offset if offset is not None else 0 @@ -918,13 +972,18 @@ async def get_signed_urls( request_options: typing.Optional[RequestOptions] = None, ) -> AsyncHttpResponse[GetSignedUrLsResponse]: """ + Get pre-signed URLs for reading or writing files in an artifact version. + Parameters ---------- id : str + ID of the artifact version to get signed URLs for paths : typing.Sequence[str] + List of relative file paths within the artifact version to get signed URLs for operation : Operation + Operation type for the signed URL (e.g., 'READ' or 'WRITE') request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -932,7 +991,7 @@ async def get_signed_urls( Returns ------- AsyncHttpResponse[GetSignedUrLsResponse] - Successful Response + List of signed URLs for the requested file paths """ _response = await self._client_wrapper.httpx_client.request( "api/ml/v1/artifact-versions/signed-urls", @@ -978,13 +1037,18 @@ async def create_multi_part_upload( self, *, id: str, path: str, num_parts: int, request_options: typing.Optional[RequestOptions] = None ) -> AsyncHttpResponse[MultiPartUploadResponse]: """ + Create a multipart upload for large files in an artifact version. + Parameters ---------- id : str + ID of the artifact version to upload files to path : str + Relative path within the artifact version where the file should be uploaded num_parts : int + Number of parts to split the upload into for multipart upload request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -992,7 +1056,7 @@ async def create_multi_part_upload( Returns ------- AsyncHttpResponse[MultiPartUploadResponse] - Successful Response + Multipart upload information including signed URLs for each part """ _response = await self._client_wrapper.httpx_client.request( "api/ml/v1/artifact-versions/signed-urls/multipart", @@ -1038,9 +1102,12 @@ async def stage( self, *, manifest: StageArtifactRequestManifest, request_options: typing.Optional[RequestOptions] = None ) -> AsyncHttpResponse[StageArtifactResponse]: """ + Stage an artifact version for upload, returning storage location and version ID. + Parameters ---------- manifest : StageArtifactRequestManifest + Manifest containing metadata for the artifact to be staged (model or generic artifact) request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -1048,7 +1115,7 @@ async def stage( Returns ------- AsyncHttpResponse[StageArtifactResponse] - Successful Response + Staging information including version ID, storage root, and artifact ID """ _response = await self._client_wrapper.httpx_client.request( "api/ml/v1/artifact-versions/stage", @@ -1100,15 +1167,21 @@ async def list_files( request_options: typing.Optional[RequestOptions] = None, ) -> AsyncPager[FileInfo, ListFilesResponse]: """ + List files and directories in an artifact version. + Parameters ---------- id : str + ID of the artifact version to list files from path : typing.Optional[str] + Relative path within the artifact version to list files from (defaults to root) limit : typing.Optional[int] + Maximum number of files/directories to return page_token : typing.Optional[str] + Token to retrieve the next page of results request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -1116,7 +1189,7 @@ async def list_files( Returns ------- AsyncPager[FileInfo, ListFilesResponse] - Successful Response + List of files and directories with pagination information """ _response = await self._client_wrapper.httpx_client.request( "api/ml/v1/artifact-versions/files", @@ -1179,9 +1252,12 @@ async def mark_stage_failure( self, *, id: str, request_options: typing.Optional[RequestOptions] = None ) -> AsyncHttpResponse[EmptyResponse]: """ + Mark a staged artifact version as failed. + Parameters ---------- id : str + ID of the staged artifact version to mark as failed request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -1189,7 +1265,7 @@ async def mark_stage_failure( Returns ------- AsyncHttpResponse[EmptyResponse] - Successful Response + Empty response indicating successful failure marking """ _response = await self._client_wrapper.httpx_client.request( "api/ml/v1/artifact-versions/mark-stage-failure", diff --git a/src/truefoundry_sdk/artifacts/client.py b/src/truefoundry_sdk/artifacts/client.py index 6540a335..ce8c584b 100644 --- a/src/truefoundry_sdk/artifacts/client.py +++ b/src/truefoundry_sdk/artifacts/client.py @@ -34,6 +34,8 @@ def with_raw_response(self) -> RawArtifactsClient: def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> GetArtifactResponse: """ + Get an artifact by its ID. + Parameters ---------- id : str @@ -44,7 +46,7 @@ def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = Non Returns ------- GetArtifactResponse - Successful Response + The artifact data Examples -------- @@ -63,6 +65,8 @@ def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = Non def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> EmptyResponse: """ + Delete an artifact by its ID. + Parameters ---------- id : str @@ -73,7 +77,7 @@ def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] = Returns ------- EmptyResponse - Successful Response + Empty response indicating successful deletion Examples -------- @@ -103,21 +107,30 @@ def list( request_options: typing.Optional[RequestOptions] = None, ) -> SyncPager[Artifact, ListArtifactsResponse]: """ + List artifacts with optional filtering by FQN, ML Repo, name, or run ID. + Parameters ---------- fqn : typing.Optional[str] + Fully qualified name to filter artifacts by (format: '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}') ml_repo_id : typing.Optional[str] + ID of the ML Repo to filter artifacts by name : typing.Optional[str] + Name of the artifact to filter by offset : typing.Optional[int] + Number of artifacts to skip for pagination limit : typing.Optional[int] + Maximum number of artifacts to return run_id : typing.Optional[str] + ID of the run to filter artifacts by include_empty_artifacts : typing.Optional[bool] + Whether to include artifacts that have no versions request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -125,7 +138,7 @@ def list( Returns ------- SyncPager[Artifact, ListArtifactsResponse] - Successful Response + List of artifacts matching the query with pagination information Examples -------- @@ -165,9 +178,12 @@ def create_or_update( self, *, manifest: ArtifactManifest, request_options: typing.Optional[RequestOptions] = None ) -> GetArtifactVersionResponse: """ + Create or update an artifact version. + Parameters ---------- manifest : ArtifactManifest + Manifest containing metadata for the artifact to apply request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -175,7 +191,7 @@ def create_or_update( Returns ------- GetArtifactVersionResponse - Successful Response + The created or updated artifact version Examples -------- @@ -219,6 +235,8 @@ def with_raw_response(self) -> AsyncRawArtifactsClient: async def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> GetArtifactResponse: """ + Get an artifact by its ID. + Parameters ---------- id : str @@ -229,7 +247,7 @@ async def get(self, id: str, *, request_options: typing.Optional[RequestOptions] Returns ------- GetArtifactResponse - Successful Response + The artifact data Examples -------- @@ -256,6 +274,8 @@ async def main() -> None: async def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> EmptyResponse: """ + Delete an artifact by its ID. + Parameters ---------- id : str @@ -266,7 +286,7 @@ async def delete(self, id: str, *, request_options: typing.Optional[RequestOptio Returns ------- EmptyResponse - Successful Response + Empty response indicating successful deletion Examples -------- @@ -304,21 +324,30 @@ async def list( request_options: typing.Optional[RequestOptions] = None, ) -> AsyncPager[Artifact, ListArtifactsResponse]: """ + List artifacts with optional filtering by FQN, ML Repo, name, or run ID. + Parameters ---------- fqn : typing.Optional[str] + Fully qualified name to filter artifacts by (format: '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}') ml_repo_id : typing.Optional[str] + ID of the ML Repo to filter artifacts by name : typing.Optional[str] + Name of the artifact to filter by offset : typing.Optional[int] + Number of artifacts to skip for pagination limit : typing.Optional[int] + Maximum number of artifacts to return run_id : typing.Optional[str] + ID of the run to filter artifacts by include_empty_artifacts : typing.Optional[bool] + Whether to include artifacts that have no versions request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -326,7 +355,7 @@ async def list( Returns ------- AsyncPager[Artifact, ListArtifactsResponse] - Successful Response + List of artifacts matching the query with pagination information Examples -------- @@ -375,9 +404,12 @@ async def create_or_update( self, *, manifest: ArtifactManifest, request_options: typing.Optional[RequestOptions] = None ) -> GetArtifactVersionResponse: """ + Create or update an artifact version. + Parameters ---------- manifest : ArtifactManifest + Manifest containing metadata for the artifact to apply request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -385,7 +417,7 @@ async def create_or_update( Returns ------- GetArtifactVersionResponse - Successful Response + The created or updated artifact version Examples -------- diff --git a/src/truefoundry_sdk/artifacts/raw_client.py b/src/truefoundry_sdk/artifacts/raw_client.py index 4b2b8b32..94f02f9e 100644 --- a/src/truefoundry_sdk/artifacts/raw_client.py +++ b/src/truefoundry_sdk/artifacts/raw_client.py @@ -31,6 +31,8 @@ def get( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> HttpResponse[GetArtifactResponse]: """ + Get an artifact by its ID. + Parameters ---------- id : str @@ -41,7 +43,7 @@ def get( Returns ------- HttpResponse[GetArtifactResponse] - Successful Response + The artifact data """ _response = self._client_wrapper.httpx_client.request( f"api/ml/v1/artifacts/{jsonable_encoder(id)}", @@ -78,6 +80,8 @@ def delete( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> HttpResponse[EmptyResponse]: """ + Delete an artifact by its ID. + Parameters ---------- id : str @@ -88,7 +92,7 @@ def delete( Returns ------- HttpResponse[EmptyResponse] - Successful Response + Empty response indicating successful deletion """ _response = self._client_wrapper.httpx_client.request( f"api/ml/v1/artifacts/{jsonable_encoder(id)}", @@ -134,21 +138,30 @@ def list( request_options: typing.Optional[RequestOptions] = None, ) -> SyncPager[Artifact, ListArtifactsResponse]: """ + List artifacts with optional filtering by FQN, ML Repo, name, or run ID. + Parameters ---------- fqn : typing.Optional[str] + Fully qualified name to filter artifacts by (format: '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}') ml_repo_id : typing.Optional[str] + ID of the ML Repo to filter artifacts by name : typing.Optional[str] + Name of the artifact to filter by offset : typing.Optional[int] + Number of artifacts to skip for pagination limit : typing.Optional[int] + Maximum number of artifacts to return run_id : typing.Optional[str] + ID of the run to filter artifacts by include_empty_artifacts : typing.Optional[bool] + Whether to include artifacts that have no versions request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -156,7 +169,7 @@ def list( Returns ------- SyncPager[Artifact, ListArtifactsResponse] - Successful Response + List of artifacts matching the query with pagination information """ offset = offset if offset is not None else 0 @@ -216,9 +229,12 @@ def create_or_update( self, *, manifest: ArtifactManifest, request_options: typing.Optional[RequestOptions] = None ) -> HttpResponse[GetArtifactVersionResponse]: """ + Create or update an artifact version. + Parameters ---------- manifest : ArtifactManifest + Manifest containing metadata for the artifact to apply request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -226,7 +242,7 @@ def create_or_update( Returns ------- HttpResponse[GetArtifactVersionResponse] - Successful Response + The created or updated artifact version """ _response = self._client_wrapper.httpx_client.request( "api/ml/v1/artifact-versions", @@ -277,6 +293,8 @@ async def get( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> AsyncHttpResponse[GetArtifactResponse]: """ + Get an artifact by its ID. + Parameters ---------- id : str @@ -287,7 +305,7 @@ async def get( Returns ------- AsyncHttpResponse[GetArtifactResponse] - Successful Response + The artifact data """ _response = await self._client_wrapper.httpx_client.request( f"api/ml/v1/artifacts/{jsonable_encoder(id)}", @@ -324,6 +342,8 @@ async def delete( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> AsyncHttpResponse[EmptyResponse]: """ + Delete an artifact by its ID. + Parameters ---------- id : str @@ -334,7 +354,7 @@ async def delete( Returns ------- AsyncHttpResponse[EmptyResponse] - Successful Response + Empty response indicating successful deletion """ _response = await self._client_wrapper.httpx_client.request( f"api/ml/v1/artifacts/{jsonable_encoder(id)}", @@ -380,21 +400,30 @@ async def list( request_options: typing.Optional[RequestOptions] = None, ) -> AsyncPager[Artifact, ListArtifactsResponse]: """ + List artifacts with optional filtering by FQN, ML Repo, name, or run ID. + Parameters ---------- fqn : typing.Optional[str] + Fully qualified name to filter artifacts by (format: '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}') ml_repo_id : typing.Optional[str] + ID of the ML Repo to filter artifacts by name : typing.Optional[str] + Name of the artifact to filter by offset : typing.Optional[int] + Number of artifacts to skip for pagination limit : typing.Optional[int] + Maximum number of artifacts to return run_id : typing.Optional[str] + ID of the run to filter artifacts by include_empty_artifacts : typing.Optional[bool] + Whether to include artifacts that have no versions request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -402,7 +431,7 @@ async def list( Returns ------- AsyncPager[Artifact, ListArtifactsResponse] - Successful Response + List of artifacts matching the query with pagination information """ offset = offset if offset is not None else 0 @@ -465,9 +494,12 @@ async def create_or_update( self, *, manifest: ArtifactManifest, request_options: typing.Optional[RequestOptions] = None ) -> AsyncHttpResponse[GetArtifactVersionResponse]: """ + Create or update an artifact version. + Parameters ---------- manifest : ArtifactManifest + Manifest containing metadata for the artifact to apply request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -475,7 +507,7 @@ async def create_or_update( Returns ------- AsyncHttpResponse[GetArtifactVersionResponse] - Successful Response + The created or updated artifact version """ _response = await self._client_wrapper.httpx_client.request( "api/ml/v1/artifact-versions", diff --git a/src/truefoundry_sdk/base_client.py b/src/truefoundry_sdk/base_client.py index bec32f63..cf825ea8 100644 --- a/src/truefoundry_sdk/base_client.py +++ b/src/truefoundry_sdk/base_client.py @@ -15,6 +15,8 @@ from .types.true_foundry_delete_request_manifest import TrueFoundryDeleteRequestManifest if typing.TYPE_CHECKING: + from .agent_skill_versions.client import AgentSkillVersionsClient, AsyncAgentSkillVersionsClient + from .agent_skills.client import AgentSkillsClient, AsyncAgentSkillsClient from .alerts.client import AlertsClient, AsyncAlertsClient from .application_versions.client import ApplicationVersionsClient, AsyncApplicationVersionsClient from .applications.client import ApplicationsClient, AsyncApplicationsClient @@ -109,10 +111,10 @@ def __init__( self._personal_access_tokens: typing.Optional[PersonalAccessTokensClient] = None self._virtual_accounts: typing.Optional[VirtualAccountsClient] = None self._clusters: typing.Optional[ClustersClient] = None - self._environments: typing.Optional[EnvironmentsClient] = None self._applications: typing.Optional[ApplicationsClient] = None self._application_versions: typing.Optional[ApplicationVersionsClient] = None self._jobs: typing.Optional[JobsClient] = None + self._environments: typing.Optional[EnvironmentsClient] = None self._workspaces: typing.Optional[WorkspacesClient] = None self._secrets: typing.Optional[SecretsClient] = None self._secret_groups: typing.Optional[SecretGroupsClient] = None @@ -127,6 +129,8 @@ def __init__( self._artifact_versions: typing.Optional[ArtifactVersionsClient] = None self._model_versions: typing.Optional[ModelVersionsClient] = None self._prompt_versions: typing.Optional[PromptVersionsClient] = None + self._agent_skills: typing.Optional[AgentSkillsClient] = None + self._agent_skill_versions: typing.Optional[AgentSkillVersionsClient] = None self._data_directories: typing.Optional[DataDirectoriesClient] = None @property @@ -280,14 +284,6 @@ def clusters(self): self._clusters = ClustersClient(client_wrapper=self._client_wrapper) return self._clusters - @property - def environments(self): - if self._environments is None: - from .environments.client import EnvironmentsClient # noqa: E402 - - self._environments = EnvironmentsClient(client_wrapper=self._client_wrapper) - return self._environments - @property def applications(self): if self._applications is None: @@ -312,6 +308,14 @@ def jobs(self): self._jobs = JobsClient(client_wrapper=self._client_wrapper) return self._jobs + @property + def environments(self): + if self._environments is None: + from .environments.client import EnvironmentsClient # noqa: E402 + + self._environments = EnvironmentsClient(client_wrapper=self._client_wrapper) + return self._environments + @property def workspaces(self): if self._workspaces is None: @@ -424,6 +428,22 @@ def prompt_versions(self): self._prompt_versions = PromptVersionsClient(client_wrapper=self._client_wrapper) return self._prompt_versions + @property + def agent_skills(self): + if self._agent_skills is None: + from .agent_skills.client import AgentSkillsClient # noqa: E402 + + self._agent_skills = AgentSkillsClient(client_wrapper=self._client_wrapper) + return self._agent_skills + + @property + def agent_skill_versions(self): + if self._agent_skill_versions is None: + from .agent_skill_versions.client import AgentSkillVersionsClient # noqa: E402 + + self._agent_skill_versions = AgentSkillVersionsClient(client_wrapper=self._client_wrapper) + return self._agent_skill_versions + @property def data_directories(self): if self._data_directories is None: @@ -498,10 +518,10 @@ def __init__( self._personal_access_tokens: typing.Optional[AsyncPersonalAccessTokensClient] = None self._virtual_accounts: typing.Optional[AsyncVirtualAccountsClient] = None self._clusters: typing.Optional[AsyncClustersClient] = None - self._environments: typing.Optional[AsyncEnvironmentsClient] = None self._applications: typing.Optional[AsyncApplicationsClient] = None self._application_versions: typing.Optional[AsyncApplicationVersionsClient] = None self._jobs: typing.Optional[AsyncJobsClient] = None + self._environments: typing.Optional[AsyncEnvironmentsClient] = None self._workspaces: typing.Optional[AsyncWorkspacesClient] = None self._secrets: typing.Optional[AsyncSecretsClient] = None self._secret_groups: typing.Optional[AsyncSecretGroupsClient] = None @@ -516,6 +536,8 @@ def __init__( self._artifact_versions: typing.Optional[AsyncArtifactVersionsClient] = None self._model_versions: typing.Optional[AsyncModelVersionsClient] = None self._prompt_versions: typing.Optional[AsyncPromptVersionsClient] = None + self._agent_skills: typing.Optional[AsyncAgentSkillsClient] = None + self._agent_skill_versions: typing.Optional[AsyncAgentSkillVersionsClient] = None self._data_directories: typing.Optional[AsyncDataDirectoriesClient] = None @property @@ -685,14 +707,6 @@ def clusters(self): self._clusters = AsyncClustersClient(client_wrapper=self._client_wrapper) return self._clusters - @property - def environments(self): - if self._environments is None: - from .environments.client import AsyncEnvironmentsClient # noqa: E402 - - self._environments = AsyncEnvironmentsClient(client_wrapper=self._client_wrapper) - return self._environments - @property def applications(self): if self._applications is None: @@ -717,6 +731,14 @@ def jobs(self): self._jobs = AsyncJobsClient(client_wrapper=self._client_wrapper) return self._jobs + @property + def environments(self): + if self._environments is None: + from .environments.client import AsyncEnvironmentsClient # noqa: E402 + + self._environments = AsyncEnvironmentsClient(client_wrapper=self._client_wrapper) + return self._environments + @property def workspaces(self): if self._workspaces is None: @@ -829,6 +851,22 @@ def prompt_versions(self): self._prompt_versions = AsyncPromptVersionsClient(client_wrapper=self._client_wrapper) return self._prompt_versions + @property + def agent_skills(self): + if self._agent_skills is None: + from .agent_skills.client import AsyncAgentSkillsClient # noqa: E402 + + self._agent_skills = AsyncAgentSkillsClient(client_wrapper=self._client_wrapper) + return self._agent_skills + + @property + def agent_skill_versions(self): + if self._agent_skill_versions is None: + from .agent_skill_versions.client import AsyncAgentSkillVersionsClient # noqa: E402 + + self._agent_skill_versions = AsyncAgentSkillVersionsClient(client_wrapper=self._client_wrapper) + return self._agent_skill_versions + @property def data_directories(self): if self._data_directories is None: diff --git a/src/truefoundry_sdk/data_directories/client.py b/src/truefoundry_sdk/data_directories/client.py index d3a58fce..f8473f8a 100644 --- a/src/truefoundry_sdk/data_directories/client.py +++ b/src/truefoundry_sdk/data_directories/client.py @@ -40,13 +40,6 @@ def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = Non """ Get a data directory by its ID. - Args: - id (str): The ID of the data directory to retrieve - user_info: Current authenticated user info - - Returns: - DataDirectoryResponse: Response containing the retrieved data directory - Parameters ---------- id : str @@ -57,7 +50,7 @@ def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = Non Returns ------- GetDataDirectoryResponse - Successful Response + The data directory data Examples -------- @@ -82,15 +75,7 @@ def delete( request_options: typing.Optional[RequestOptions] = None, ) -> EmptyResponse: """ - Delete a data directory and optionally its contents. - - Args: - id: Unique identifier of the data directory to delete - delete_contents: If True, also deletes the data directory's contents - user_info: Authenticated user information - - Returns: - EmptyResponse: Empty response indicating successful deletion + Delete a data directory, optionally including its contents. Parameters ---------- @@ -104,7 +89,7 @@ def delete( Returns ------- EmptyResponse - Successful Response + Empty response indicating successful deletion Examples -------- @@ -133,30 +118,24 @@ def list( request_options: typing.Optional[RequestOptions] = None, ) -> SyncPager[DataDirectory, ListDataDirectoriesResponse]: """ - List all data directories with optional filtering and pagination. - - Args: - filters: Query parameters for filtering and pagination - - ml_repo_id: Filter data directories by ml repo ID - - name: Optional filter data directories by name - - limit: Optional maximum number of data directories to return - - offset: Optional number of data directories to skip - user_info: Authenticated user information - - Returns: - ListDataDirectoriesResponse: List of data directories and pagination info + List data directories with optional filtering by FQN, ML Repo, or name. Parameters ---------- fqn : typing.Optional[str] + Fully qualified name to filter data directories by ml_repo_id : typing.Optional[str] + ID of the ML Repo to filter data directories by name : typing.Optional[str] + Name of the data directory to filter by limit : typing.Optional[int] + Maximum number of data directories to return offset : typing.Optional[int] + Number of data directories to skip for pagination request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -164,7 +143,7 @@ def list( Returns ------- SyncPager[DataDirectory, ListDataDirectoriesResponse] - Successful Response + List of data directories matching the query with pagination information Examples -------- @@ -195,9 +174,12 @@ def create_or_update( self, *, manifest: DataDirectoryManifest, request_options: typing.Optional[RequestOptions] = None ) -> GetDataDirectoryResponse: """ + Create or update a data directory. + Parameters ---------- manifest : DataDirectoryManifest + Manifest containing metadata for the data directory to apply request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -205,7 +187,7 @@ def create_or_update( Returns ------- GetDataDirectoryResponse - Successful Response + The created or updated data directory Examples -------- @@ -241,24 +223,21 @@ def list_files( request_options: typing.Optional[RequestOptions] = None, ) -> SyncPager[FileInfo, ListFilesResponse]: """ - List files in a dataset. - - Args: - request_dto: Request containing dataset ID, path, page token and limit - user_info: Authenticated user information - - Returns: - ListFilesResponse: Response containing files and pagination info + List files and directories in a data directory. Parameters ---------- id : str + ID of the artifact version to list files from path : typing.Optional[str] + Relative path within the artifact version to list files from (defaults to root) limit : typing.Optional[int] + Maximum number of files/directories to return page_token : typing.Optional[str] + Token to retrieve the next page of results request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -266,7 +245,7 @@ def list_files( Returns ------- SyncPager[FileInfo, ListFilesResponse] - Successful Response + List of files and directories with pagination information Examples -------- @@ -293,20 +272,15 @@ def delete_files( self, *, id: str, paths: typing.Sequence[str], request_options: typing.Optional[RequestOptions] = None ) -> EmptyResponse: """ - Delete files from the dataset. - - Args: - request_dto: Request containing dataset ID and paths - user_info: Authenticated user information - - Returns: - EmptyResponse: Empty response indicating successful deletion + Delete files from a data directory. Parameters ---------- id : str + ID of the artifact version to delete files from paths : typing.Sequence[str] + List of relative file paths within the artifact version to delete request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -314,7 +288,7 @@ def delete_files( Returns ------- EmptyResponse - Successful Response + Empty response indicating successful deletion Examples -------- @@ -341,22 +315,18 @@ def get_signed_urls( request_options: typing.Optional[RequestOptions] = None, ) -> GetSignedUrLsResponse: """ - Get signed URLs for a dataset. - - Args: - request_dto: Request containing dataset ID, paths and operation - user_info: Authenticated user information - - Returns: - GetSignedURLsResponse: Response containing signed URLs + Get pre-signed URLs for reading or writing files in a data directory. Parameters ---------- id : str + ID of the artifact version to get signed URLs for paths : typing.Sequence[str] + List of relative file paths within the artifact version to get signed URLs for operation : Operation + Operation type for the signed URL (e.g., 'READ' or 'WRITE') request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -364,7 +334,7 @@ def get_signed_urls( Returns ------- GetSignedUrLsResponse - Successful Response + List of signed URLs for the requested file paths Examples -------- @@ -389,22 +359,18 @@ def create_multipart_upload( self, *, id: str, path: str, num_parts: int, request_options: typing.Optional[RequestOptions] = None ) -> MultiPartUploadResponse: """ - Create a multipart upload for a dataset - - Args: - request_dto: Request containing dataset ID, path and number of parts - user_info: Authenticated user information - - Returns: - MultiPartUploadResponse: Response containing multipart upload info + Create a multipart upload for large files in a data directory. Parameters ---------- id : str + ID of the artifact version to upload files to path : str + Relative path within the artifact version where the file should be uploaded num_parts : int + Number of parts to split the upload into for multipart upload request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -412,7 +378,7 @@ def create_multipart_upload( Returns ------- MultiPartUploadResponse - Successful Response + Multipart upload information including signed URLs for each part Examples -------- @@ -455,13 +421,6 @@ async def get( """ Get a data directory by its ID. - Args: - id (str): The ID of the data directory to retrieve - user_info: Current authenticated user info - - Returns: - DataDirectoryResponse: Response containing the retrieved data directory - Parameters ---------- id : str @@ -472,7 +431,7 @@ async def get( Returns ------- GetDataDirectoryResponse - Successful Response + The data directory data Examples -------- @@ -505,15 +464,7 @@ async def delete( request_options: typing.Optional[RequestOptions] = None, ) -> EmptyResponse: """ - Delete a data directory and optionally its contents. - - Args: - id: Unique identifier of the data directory to delete - delete_contents: If True, also deletes the data directory's contents - user_info: Authenticated user information - - Returns: - EmptyResponse: Empty response indicating successful deletion + Delete a data directory, optionally including its contents. Parameters ---------- @@ -527,7 +478,7 @@ async def delete( Returns ------- EmptyResponse - Successful Response + Empty response indicating successful deletion Examples -------- @@ -564,30 +515,24 @@ async def list( request_options: typing.Optional[RequestOptions] = None, ) -> AsyncPager[DataDirectory, ListDataDirectoriesResponse]: """ - List all data directories with optional filtering and pagination. - - Args: - filters: Query parameters for filtering and pagination - - ml_repo_id: Filter data directories by ml repo ID - - name: Optional filter data directories by name - - limit: Optional maximum number of data directories to return - - offset: Optional number of data directories to skip - user_info: Authenticated user information - - Returns: - ListDataDirectoriesResponse: List of data directories and pagination info + List data directories with optional filtering by FQN, ML Repo, or name. Parameters ---------- fqn : typing.Optional[str] + Fully qualified name to filter data directories by ml_repo_id : typing.Optional[str] + ID of the ML Repo to filter data directories by name : typing.Optional[str] + Name of the data directory to filter by limit : typing.Optional[int] + Maximum number of data directories to return offset : typing.Optional[int] + Number of data directories to skip for pagination request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -595,7 +540,7 @@ async def list( Returns ------- AsyncPager[DataDirectory, ListDataDirectoriesResponse] - Successful Response + List of data directories matching the query with pagination information Examples -------- @@ -635,9 +580,12 @@ async def create_or_update( self, *, manifest: DataDirectoryManifest, request_options: typing.Optional[RequestOptions] = None ) -> GetDataDirectoryResponse: """ + Create or update a data directory. + Parameters ---------- manifest : DataDirectoryManifest + Manifest containing metadata for the data directory to apply request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -645,7 +593,7 @@ async def create_or_update( Returns ------- GetDataDirectoryResponse - Successful Response + The created or updated data directory Examples -------- @@ -689,24 +637,21 @@ async def list_files( request_options: typing.Optional[RequestOptions] = None, ) -> AsyncPager[FileInfo, ListFilesResponse]: """ - List files in a dataset. - - Args: - request_dto: Request containing dataset ID, path, page token and limit - user_info: Authenticated user information - - Returns: - ListFilesResponse: Response containing files and pagination info + List files and directories in a data directory. Parameters ---------- id : str + ID of the artifact version to list files from path : typing.Optional[str] + Relative path within the artifact version to list files from (defaults to root) limit : typing.Optional[int] + Maximum number of files/directories to return page_token : typing.Optional[str] + Token to retrieve the next page of results request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -714,7 +659,7 @@ async def list_files( Returns ------- AsyncPager[FileInfo, ListFilesResponse] - Successful Response + List of files and directories with pagination information Examples -------- @@ -750,20 +695,15 @@ async def delete_files( self, *, id: str, paths: typing.Sequence[str], request_options: typing.Optional[RequestOptions] = None ) -> EmptyResponse: """ - Delete files from the dataset. - - Args: - request_dto: Request containing dataset ID and paths - user_info: Authenticated user information - - Returns: - EmptyResponse: Empty response indicating successful deletion + Delete files from a data directory. Parameters ---------- id : str + ID of the artifact version to delete files from paths : typing.Sequence[str] + List of relative file paths within the artifact version to delete request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -771,7 +711,7 @@ async def delete_files( Returns ------- EmptyResponse - Successful Response + Empty response indicating successful deletion Examples -------- @@ -806,22 +746,18 @@ async def get_signed_urls( request_options: typing.Optional[RequestOptions] = None, ) -> GetSignedUrLsResponse: """ - Get signed URLs for a dataset. - - Args: - request_dto: Request containing dataset ID, paths and operation - user_info: Authenticated user information - - Returns: - GetSignedURLsResponse: Response containing signed URLs + Get pre-signed URLs for reading or writing files in a data directory. Parameters ---------- id : str + ID of the artifact version to get signed URLs for paths : typing.Sequence[str] + List of relative file paths within the artifact version to get signed URLs for operation : Operation + Operation type for the signed URL (e.g., 'READ' or 'WRITE') request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -829,7 +765,7 @@ async def get_signed_urls( Returns ------- GetSignedUrLsResponse - Successful Response + List of signed URLs for the requested file paths Examples -------- @@ -862,22 +798,18 @@ async def create_multipart_upload( self, *, id: str, path: str, num_parts: int, request_options: typing.Optional[RequestOptions] = None ) -> MultiPartUploadResponse: """ - Create a multipart upload for a dataset - - Args: - request_dto: Request containing dataset ID, path and number of parts - user_info: Authenticated user information - - Returns: - MultiPartUploadResponse: Response containing multipart upload info + Create a multipart upload for large files in a data directory. Parameters ---------- id : str + ID of the artifact version to upload files to path : str + Relative path within the artifact version where the file should be uploaded num_parts : int + Number of parts to split the upload into for multipart upload request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -885,7 +817,7 @@ async def create_multipart_upload( Returns ------- MultiPartUploadResponse - Successful Response + Multipart upload information including signed URLs for each part Examples -------- diff --git a/src/truefoundry_sdk/data_directories/raw_client.py b/src/truefoundry_sdk/data_directories/raw_client.py index 13c03d74..267e3bbb 100644 --- a/src/truefoundry_sdk/data_directories/raw_client.py +++ b/src/truefoundry_sdk/data_directories/raw_client.py @@ -37,13 +37,6 @@ def get( """ Get a data directory by its ID. - Args: - id (str): The ID of the data directory to retrieve - user_info: Current authenticated user info - - Returns: - DataDirectoryResponse: Response containing the retrieved data directory - Parameters ---------- id : str @@ -54,7 +47,7 @@ def get( Returns ------- HttpResponse[GetDataDirectoryResponse] - Successful Response + The data directory data """ _response = self._client_wrapper.httpx_client.request( f"api/ml/v1/data-directories/{jsonable_encoder(id)}", @@ -95,15 +88,7 @@ def delete( request_options: typing.Optional[RequestOptions] = None, ) -> HttpResponse[EmptyResponse]: """ - Delete a data directory and optionally its contents. - - Args: - id: Unique identifier of the data directory to delete - delete_contents: If True, also deletes the data directory's contents - user_info: Authenticated user information - - Returns: - EmptyResponse: Empty response indicating successful deletion + Delete a data directory, optionally including its contents. Parameters ---------- @@ -117,7 +102,7 @@ def delete( Returns ------- HttpResponse[EmptyResponse] - Successful Response + Empty response indicating successful deletion """ _response = self._client_wrapper.httpx_client.request( f"api/ml/v1/data-directories/{jsonable_encoder(id)}", @@ -164,30 +149,24 @@ def list( request_options: typing.Optional[RequestOptions] = None, ) -> SyncPager[DataDirectory, ListDataDirectoriesResponse]: """ - List all data directories with optional filtering and pagination. - - Args: - filters: Query parameters for filtering and pagination - - ml_repo_id: Filter data directories by ml repo ID - - name: Optional filter data directories by name - - limit: Optional maximum number of data directories to return - - offset: Optional number of data directories to skip - user_info: Authenticated user information - - Returns: - ListDataDirectoriesResponse: List of data directories and pagination info + List data directories with optional filtering by FQN, ML Repo, or name. Parameters ---------- fqn : typing.Optional[str] + Fully qualified name to filter data directories by ml_repo_id : typing.Optional[str] + ID of the ML Repo to filter data directories by name : typing.Optional[str] + Name of the data directory to filter by limit : typing.Optional[int] + Maximum number of data directories to return offset : typing.Optional[int] + Number of data directories to skip for pagination request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -195,7 +174,7 @@ def list( Returns ------- SyncPager[DataDirectory, ListDataDirectoriesResponse] - Successful Response + List of data directories matching the query with pagination information """ offset = offset if offset is not None else 0 @@ -251,9 +230,12 @@ def create_or_update( self, *, manifest: DataDirectoryManifest, request_options: typing.Optional[RequestOptions] = None ) -> HttpResponse[GetDataDirectoryResponse]: """ + Create or update a data directory. + Parameters ---------- manifest : DataDirectoryManifest + Manifest containing metadata for the data directory to apply request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -261,7 +243,7 @@ def create_or_update( Returns ------- HttpResponse[GetDataDirectoryResponse] - Successful Response + The created or updated data directory """ _response = self._client_wrapper.httpx_client.request( "api/ml/v1/data-directories", @@ -313,24 +295,21 @@ def list_files( request_options: typing.Optional[RequestOptions] = None, ) -> SyncPager[FileInfo, ListFilesResponse]: """ - List files in a dataset. - - Args: - request_dto: Request containing dataset ID, path, page token and limit - user_info: Authenticated user information - - Returns: - ListFilesResponse: Response containing files and pagination info + List files and directories in a data directory. Parameters ---------- id : str + ID of the artifact version to list files from path : typing.Optional[str] + Relative path within the artifact version to list files from (defaults to root) limit : typing.Optional[int] + Maximum number of files/directories to return page_token : typing.Optional[str] + Token to retrieve the next page of results request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -338,7 +317,7 @@ def list_files( Returns ------- SyncPager[FileInfo, ListFilesResponse] - Successful Response + List of files and directories with pagination information """ _response = self._client_wrapper.httpx_client.request( "api/ml/v1/data-directories/files", @@ -398,20 +377,15 @@ def delete_files( self, *, id: str, paths: typing.Sequence[str], request_options: typing.Optional[RequestOptions] = None ) -> HttpResponse[EmptyResponse]: """ - Delete files from the dataset. - - Args: - request_dto: Request containing dataset ID and paths - user_info: Authenticated user information - - Returns: - EmptyResponse: Empty response indicating successful deletion + Delete files from a data directory. Parameters ---------- id : str + ID of the artifact version to delete files from paths : typing.Sequence[str] + List of relative file paths within the artifact version to delete request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -419,7 +393,7 @@ def delete_files( Returns ------- HttpResponse[EmptyResponse] - Successful Response + Empty response indicating successful deletion """ _response = self._client_wrapper.httpx_client.request( "api/ml/v1/data-directories/files", @@ -469,22 +443,18 @@ def get_signed_urls( request_options: typing.Optional[RequestOptions] = None, ) -> HttpResponse[GetSignedUrLsResponse]: """ - Get signed URLs for a dataset. - - Args: - request_dto: Request containing dataset ID, paths and operation - user_info: Authenticated user information - - Returns: - GetSignedURLsResponse: Response containing signed URLs + Get pre-signed URLs for reading or writing files in a data directory. Parameters ---------- id : str + ID of the artifact version to get signed URLs for paths : typing.Sequence[str] + List of relative file paths within the artifact version to get signed URLs for operation : Operation + Operation type for the signed URL (e.g., 'READ' or 'WRITE') request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -492,7 +462,7 @@ def get_signed_urls( Returns ------- HttpResponse[GetSignedUrLsResponse] - Successful Response + List of signed URLs for the requested file paths """ _response = self._client_wrapper.httpx_client.request( "api/ml/v1/data-directories/signed-urls", @@ -538,22 +508,18 @@ def create_multipart_upload( self, *, id: str, path: str, num_parts: int, request_options: typing.Optional[RequestOptions] = None ) -> HttpResponse[MultiPartUploadResponse]: """ - Create a multipart upload for a dataset - - Args: - request_dto: Request containing dataset ID, path and number of parts - user_info: Authenticated user information - - Returns: - MultiPartUploadResponse: Response containing multipart upload info + Create a multipart upload for large files in a data directory. Parameters ---------- id : str + ID of the artifact version to upload files to path : str + Relative path within the artifact version where the file should be uploaded num_parts : int + Number of parts to split the upload into for multipart upload request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -561,7 +527,7 @@ def create_multipart_upload( Returns ------- HttpResponse[MultiPartUploadResponse] - Successful Response + Multipart upload information including signed URLs for each part """ _response = self._client_wrapper.httpx_client.request( "api/ml/v1/data-directories/signed-urls/multipart", @@ -614,13 +580,6 @@ async def get( """ Get a data directory by its ID. - Args: - id (str): The ID of the data directory to retrieve - user_info: Current authenticated user info - - Returns: - DataDirectoryResponse: Response containing the retrieved data directory - Parameters ---------- id : str @@ -631,7 +590,7 @@ async def get( Returns ------- AsyncHttpResponse[GetDataDirectoryResponse] - Successful Response + The data directory data """ _response = await self._client_wrapper.httpx_client.request( f"api/ml/v1/data-directories/{jsonable_encoder(id)}", @@ -672,15 +631,7 @@ async def delete( request_options: typing.Optional[RequestOptions] = None, ) -> AsyncHttpResponse[EmptyResponse]: """ - Delete a data directory and optionally its contents. - - Args: - id: Unique identifier of the data directory to delete - delete_contents: If True, also deletes the data directory's contents - user_info: Authenticated user information - - Returns: - EmptyResponse: Empty response indicating successful deletion + Delete a data directory, optionally including its contents. Parameters ---------- @@ -694,7 +645,7 @@ async def delete( Returns ------- AsyncHttpResponse[EmptyResponse] - Successful Response + Empty response indicating successful deletion """ _response = await self._client_wrapper.httpx_client.request( f"api/ml/v1/data-directories/{jsonable_encoder(id)}", @@ -741,30 +692,24 @@ async def list( request_options: typing.Optional[RequestOptions] = None, ) -> AsyncPager[DataDirectory, ListDataDirectoriesResponse]: """ - List all data directories with optional filtering and pagination. - - Args: - filters: Query parameters for filtering and pagination - - ml_repo_id: Filter data directories by ml repo ID - - name: Optional filter data directories by name - - limit: Optional maximum number of data directories to return - - offset: Optional number of data directories to skip - user_info: Authenticated user information - - Returns: - ListDataDirectoriesResponse: List of data directories and pagination info + List data directories with optional filtering by FQN, ML Repo, or name. Parameters ---------- fqn : typing.Optional[str] + Fully qualified name to filter data directories by ml_repo_id : typing.Optional[str] + ID of the ML Repo to filter data directories by name : typing.Optional[str] + Name of the data directory to filter by limit : typing.Optional[int] + Maximum number of data directories to return offset : typing.Optional[int] + Number of data directories to skip for pagination request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -772,7 +717,7 @@ async def list( Returns ------- AsyncPager[DataDirectory, ListDataDirectoriesResponse] - Successful Response + List of data directories matching the query with pagination information """ offset = offset if offset is not None else 0 @@ -831,9 +776,12 @@ async def create_or_update( self, *, manifest: DataDirectoryManifest, request_options: typing.Optional[RequestOptions] = None ) -> AsyncHttpResponse[GetDataDirectoryResponse]: """ + Create or update a data directory. + Parameters ---------- manifest : DataDirectoryManifest + Manifest containing metadata for the data directory to apply request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -841,7 +789,7 @@ async def create_or_update( Returns ------- AsyncHttpResponse[GetDataDirectoryResponse] - Successful Response + The created or updated data directory """ _response = await self._client_wrapper.httpx_client.request( "api/ml/v1/data-directories", @@ -893,24 +841,21 @@ async def list_files( request_options: typing.Optional[RequestOptions] = None, ) -> AsyncPager[FileInfo, ListFilesResponse]: """ - List files in a dataset. - - Args: - request_dto: Request containing dataset ID, path, page token and limit - user_info: Authenticated user information - - Returns: - ListFilesResponse: Response containing files and pagination info + List files and directories in a data directory. Parameters ---------- id : str + ID of the artifact version to list files from path : typing.Optional[str] + Relative path within the artifact version to list files from (defaults to root) limit : typing.Optional[int] + Maximum number of files/directories to return page_token : typing.Optional[str] + Token to retrieve the next page of results request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -918,7 +863,7 @@ async def list_files( Returns ------- AsyncPager[FileInfo, ListFilesResponse] - Successful Response + List of files and directories with pagination information """ _response = await self._client_wrapper.httpx_client.request( "api/ml/v1/data-directories/files", @@ -981,20 +926,15 @@ async def delete_files( self, *, id: str, paths: typing.Sequence[str], request_options: typing.Optional[RequestOptions] = None ) -> AsyncHttpResponse[EmptyResponse]: """ - Delete files from the dataset. - - Args: - request_dto: Request containing dataset ID and paths - user_info: Authenticated user information - - Returns: - EmptyResponse: Empty response indicating successful deletion + Delete files from a data directory. Parameters ---------- id : str + ID of the artifact version to delete files from paths : typing.Sequence[str] + List of relative file paths within the artifact version to delete request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -1002,7 +942,7 @@ async def delete_files( Returns ------- AsyncHttpResponse[EmptyResponse] - Successful Response + Empty response indicating successful deletion """ _response = await self._client_wrapper.httpx_client.request( "api/ml/v1/data-directories/files", @@ -1052,22 +992,18 @@ async def get_signed_urls( request_options: typing.Optional[RequestOptions] = None, ) -> AsyncHttpResponse[GetSignedUrLsResponse]: """ - Get signed URLs for a dataset. - - Args: - request_dto: Request containing dataset ID, paths and operation - user_info: Authenticated user information - - Returns: - GetSignedURLsResponse: Response containing signed URLs + Get pre-signed URLs for reading or writing files in a data directory. Parameters ---------- id : str + ID of the artifact version to get signed URLs for paths : typing.Sequence[str] + List of relative file paths within the artifact version to get signed URLs for operation : Operation + Operation type for the signed URL (e.g., 'READ' or 'WRITE') request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -1075,7 +1011,7 @@ async def get_signed_urls( Returns ------- AsyncHttpResponse[GetSignedUrLsResponse] - Successful Response + List of signed URLs for the requested file paths """ _response = await self._client_wrapper.httpx_client.request( "api/ml/v1/data-directories/signed-urls", @@ -1121,22 +1057,18 @@ async def create_multipart_upload( self, *, id: str, path: str, num_parts: int, request_options: typing.Optional[RequestOptions] = None ) -> AsyncHttpResponse[MultiPartUploadResponse]: """ - Create a multipart upload for a dataset - - Args: - request_dto: Request containing dataset ID, path and number of parts - user_info: Authenticated user information - - Returns: - MultiPartUploadResponse: Response containing multipart upload info + Create a multipart upload for large files in a data directory. Parameters ---------- id : str + ID of the artifact version to upload files to path : str + Relative path within the artifact version where the file should be uploaded num_parts : int + Number of parts to split the upload into for multipart upload request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -1144,7 +1076,7 @@ async def create_multipart_upload( Returns ------- AsyncHttpResponse[MultiPartUploadResponse] - Successful Response + Multipart upload information including signed URLs for each part """ _response = await self._client_wrapper.httpx_client.request( "api/ml/v1/data-directories/signed-urls/multipart", diff --git a/src/truefoundry_sdk/internal/__init__.py b/src/truefoundry_sdk/internal/__init__.py index ff0779df..b0722e58 100644 --- a/src/truefoundry_sdk/internal/__init__.py +++ b/src/truefoundry_sdk/internal/__init__.py @@ -21,7 +21,6 @@ workflows, ) from .ai_gateway import AiGatewayGetGatewayConfigRequestType - from .docker_registries import DockerRegistriesCreateRepositoryResponse, DockerRegistriesGetCredentialsResponse from .metrics import MetricsGetChartsRequestFilterEntity from .ml import ApplyMlEntityRequestManifest, DeleteMlEntityRequestManifest from .workflows import WorkflowsExecuteWorkflowResponse @@ -29,8 +28,6 @@ "AiGatewayGetGatewayConfigRequestType": ".ai_gateway", "ApplyMlEntityRequestManifest": ".ml", "DeleteMlEntityRequestManifest": ".ml", - "DockerRegistriesCreateRepositoryResponse": ".docker_registries", - "DockerRegistriesGetCredentialsResponse": ".docker_registries", "MetricsGetChartsRequestFilterEntity": ".metrics", "WorkflowsExecuteWorkflowResponse": ".workflows", "ai_gateway": ".ai_gateway", @@ -73,8 +70,6 @@ def __dir__(): "AiGatewayGetGatewayConfigRequestType", "ApplyMlEntityRequestManifest", "DeleteMlEntityRequestManifest", - "DockerRegistriesCreateRepositoryResponse", - "DockerRegistriesGetCredentialsResponse", "MetricsGetChartsRequestFilterEntity", "WorkflowsExecuteWorkflowResponse", "ai_gateway", diff --git a/src/truefoundry_sdk/internal/artifact_versions/client.py b/src/truefoundry_sdk/internal/artifact_versions/client.py index d79328ec..78f07044 100644 --- a/src/truefoundry_sdk/internal/artifact_versions/client.py +++ b/src/truefoundry_sdk/internal/artifact_versions/client.py @@ -43,33 +43,45 @@ def list( request_options: typing.Optional[RequestOptions] = None, ) -> SyncPager[InternalListArtifactVersionsResponseDataItem, InternalListArtifactVersionsResponse]: """ - List artifact version API + List artifact versions with internal metadata, optionally including model versions. Parameters ---------- tag : typing.Optional[str] + Tag to filter artifact versions by fqn : typing.Optional[str] + Fully qualified name to filter artifact versions by (format: '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}' or '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}:{version}') artifact_id : typing.Optional[str] + ID of the artifact to filter versions by ml_repo_id : typing.Optional[str] + ID of the ML Repo to filter artifact versions by name : typing.Optional[str] + Name of the artifact to filter versions by version : typing.Optional[int] + Version number (positive integer) or 'latest' to filter by specific version run_ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] + List of run IDs to filter artifact versions by run_steps : typing.Optional[typing.Union[int, typing.Sequence[int]]] + List of run step numbers to filter artifact versions by offset : typing.Optional[int] + Number of artifact versions to skip for pagination limit : typing.Optional[int] + Maximum number of artifact versions to return include_internal_metadata : typing.Optional[bool] + Whether to include internal metadata in the response include_model_versions : typing.Optional[bool] + Whether to include model versions in the results (internal use only) request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -77,7 +89,7 @@ def list( Returns ------- SyncPager[InternalListArtifactVersionsResponseDataItem, InternalListArtifactVersionsResponse] - Successful Response + List of artifact versions with internal metadata and pagination information Examples -------- @@ -155,33 +167,45 @@ async def list( request_options: typing.Optional[RequestOptions] = None, ) -> AsyncPager[InternalListArtifactVersionsResponseDataItem, InternalListArtifactVersionsResponse]: """ - List artifact version API + List artifact versions with internal metadata, optionally including model versions. Parameters ---------- tag : typing.Optional[str] + Tag to filter artifact versions by fqn : typing.Optional[str] + Fully qualified name to filter artifact versions by (format: '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}' or '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}:{version}') artifact_id : typing.Optional[str] + ID of the artifact to filter versions by ml_repo_id : typing.Optional[str] + ID of the ML Repo to filter artifact versions by name : typing.Optional[str] + Name of the artifact to filter versions by version : typing.Optional[int] + Version number (positive integer) or 'latest' to filter by specific version run_ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] + List of run IDs to filter artifact versions by run_steps : typing.Optional[typing.Union[int, typing.Sequence[int]]] + List of run step numbers to filter artifact versions by offset : typing.Optional[int] + Number of artifact versions to skip for pagination limit : typing.Optional[int] + Maximum number of artifact versions to return include_internal_metadata : typing.Optional[bool] + Whether to include internal metadata in the response include_model_versions : typing.Optional[bool] + Whether to include model versions in the results (internal use only) request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -189,7 +213,7 @@ async def list( Returns ------- AsyncPager[InternalListArtifactVersionsResponseDataItem, InternalListArtifactVersionsResponse] - Successful Response + List of artifact versions with internal metadata and pagination information Examples -------- diff --git a/src/truefoundry_sdk/internal/artifact_versions/raw_client.py b/src/truefoundry_sdk/internal/artifact_versions/raw_client.py index 56f5859c..71e2a5b5 100644 --- a/src/truefoundry_sdk/internal/artifact_versions/raw_client.py +++ b/src/truefoundry_sdk/internal/artifact_versions/raw_client.py @@ -35,33 +35,45 @@ def list( request_options: typing.Optional[RequestOptions] = None, ) -> SyncPager[InternalListArtifactVersionsResponseDataItem, InternalListArtifactVersionsResponse]: """ - List artifact version API + List artifact versions with internal metadata, optionally including model versions. Parameters ---------- tag : typing.Optional[str] + Tag to filter artifact versions by fqn : typing.Optional[str] + Fully qualified name to filter artifact versions by (format: '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}' or '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}:{version}') artifact_id : typing.Optional[str] + ID of the artifact to filter versions by ml_repo_id : typing.Optional[str] + ID of the ML Repo to filter artifact versions by name : typing.Optional[str] + Name of the artifact to filter versions by version : typing.Optional[int] + Version number (positive integer) or 'latest' to filter by specific version run_ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] + List of run IDs to filter artifact versions by run_steps : typing.Optional[typing.Union[int, typing.Sequence[int]]] + List of run step numbers to filter artifact versions by offset : typing.Optional[int] + Number of artifact versions to skip for pagination limit : typing.Optional[int] + Maximum number of artifact versions to return include_internal_metadata : typing.Optional[bool] + Whether to include internal metadata in the response include_model_versions : typing.Optional[bool] + Whether to include model versions in the results (internal use only) request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -69,7 +81,7 @@ def list( Returns ------- SyncPager[InternalListArtifactVersionsResponseDataItem, InternalListArtifactVersionsResponse] - Successful Response + List of artifact versions with internal metadata and pagination information """ offset = offset if offset is not None else 0 @@ -158,33 +170,45 @@ async def list( request_options: typing.Optional[RequestOptions] = None, ) -> AsyncPager[InternalListArtifactVersionsResponseDataItem, InternalListArtifactVersionsResponse]: """ - List artifact version API + List artifact versions with internal metadata, optionally including model versions. Parameters ---------- tag : typing.Optional[str] + Tag to filter artifact versions by fqn : typing.Optional[str] + Fully qualified name to filter artifact versions by (format: '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}' or '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}:{version}') artifact_id : typing.Optional[str] + ID of the artifact to filter versions by ml_repo_id : typing.Optional[str] + ID of the ML Repo to filter artifact versions by name : typing.Optional[str] + Name of the artifact to filter versions by version : typing.Optional[int] + Version number (positive integer) or 'latest' to filter by specific version run_ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] + List of run IDs to filter artifact versions by run_steps : typing.Optional[typing.Union[int, typing.Sequence[int]]] + List of run step numbers to filter artifact versions by offset : typing.Optional[int] + Number of artifact versions to skip for pagination limit : typing.Optional[int] + Maximum number of artifact versions to return include_internal_metadata : typing.Optional[bool] + Whether to include internal metadata in the response include_model_versions : typing.Optional[bool] + Whether to include model versions in the results (internal use only) request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -192,7 +216,7 @@ async def list( Returns ------- AsyncPager[InternalListArtifactVersionsResponseDataItem, InternalListArtifactVersionsResponse] - Successful Response + List of artifact versions with internal metadata and pagination information """ offset = offset if offset is not None else 0 diff --git a/src/truefoundry_sdk/internal/docker_registries/__init__.py b/src/truefoundry_sdk/internal/docker_registries/__init__.py index 5d663781..5cde0202 100644 --- a/src/truefoundry_sdk/internal/docker_registries/__init__.py +++ b/src/truefoundry_sdk/internal/docker_registries/__init__.py @@ -2,36 +2,3 @@ # isort: skip_file -import typing -from importlib import import_module - -if typing.TYPE_CHECKING: - from .types import DockerRegistriesCreateRepositoryResponse, DockerRegistriesGetCredentialsResponse -_dynamic_imports: typing.Dict[str, str] = { - "DockerRegistriesCreateRepositoryResponse": ".types", - "DockerRegistriesGetCredentialsResponse": ".types", -} - - -def __getattr__(attr_name: str) -> typing.Any: - module_name = _dynamic_imports.get(attr_name) - if module_name is None: - raise AttributeError(f"No {attr_name} found in _dynamic_imports for module name -> {__name__}") - try: - module = import_module(module_name, __package__) - if module_name == f".{attr_name}": - return module - else: - return getattr(module, attr_name) - except ImportError as e: - raise ImportError(f"Failed to import {attr_name} from {module_name}: {e}") from e - except AttributeError as e: - raise AttributeError(f"Failed to get {attr_name} from {module_name}: {e}") from e - - -def __dir__(): - lazy_attrs = list(_dynamic_imports.keys()) - return sorted(lazy_attrs) - - -__all__ = ["DockerRegistriesCreateRepositoryResponse", "DockerRegistriesGetCredentialsResponse"] diff --git a/src/truefoundry_sdk/internal/docker_registries/client.py b/src/truefoundry_sdk/internal/docker_registries/client.py index b96f1594..5e7c0924 100644 --- a/src/truefoundry_sdk/internal/docker_registries/client.py +++ b/src/truefoundry_sdk/internal/docker_registries/client.py @@ -4,9 +4,9 @@ from ...core.client_wrapper import AsyncClientWrapper, SyncClientWrapper from ...core.request_options import RequestOptions +from ...types.create_docker_repository_response import CreateDockerRepositoryResponse +from ...types.get_docker_registry_credentials_response import GetDockerRegistryCredentialsResponse from .raw_client import AsyncRawDockerRegistriesClient, RawDockerRegistriesClient -from .types.docker_registries_create_repository_response import DockerRegistriesCreateRepositoryResponse -from .types.docker_registries_get_credentials_response import DockerRegistriesGetCredentialsResponse # this is used as the default value for optional parameters OMIT = typing.cast(typing.Any, ...) @@ -34,7 +34,7 @@ def create_repository( application_name: str, workspace_fqn: str, request_options: typing.Optional[RequestOptions] = None, - ) -> DockerRegistriesCreateRepositoryResponse: + ) -> CreateDockerRepositoryResponse: """ Create a docker repository in the provided workspace. @@ -54,7 +54,7 @@ def create_repository( Returns ------- - DockerRegistriesCreateRepositoryResponse + CreateDockerRepositoryResponse Returns the Repository name. Examples @@ -82,7 +82,7 @@ def get_credentials( fqn: typing.Optional[str] = None, cluster_id: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None, - ) -> DockerRegistriesGetCredentialsResponse: + ) -> GetDockerRegistryCredentialsResponse: """ Get docker registry credentials for building and pushing an image. @@ -99,7 +99,7 @@ def get_credentials( Returns ------- - DockerRegistriesGetCredentialsResponse + GetDockerRegistryCredentialsResponse Returns the docker registry credentials. Examples @@ -141,7 +141,7 @@ async def create_repository( application_name: str, workspace_fqn: str, request_options: typing.Optional[RequestOptions] = None, - ) -> DockerRegistriesCreateRepositoryResponse: + ) -> CreateDockerRepositoryResponse: """ Create a docker repository in the provided workspace. @@ -161,7 +161,7 @@ async def create_repository( Returns ------- - DockerRegistriesCreateRepositoryResponse + CreateDockerRepositoryResponse Returns the Repository name. Examples @@ -197,7 +197,7 @@ async def get_credentials( fqn: typing.Optional[str] = None, cluster_id: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None, - ) -> DockerRegistriesGetCredentialsResponse: + ) -> GetDockerRegistryCredentialsResponse: """ Get docker registry credentials for building and pushing an image. @@ -214,7 +214,7 @@ async def get_credentials( Returns ------- - DockerRegistriesGetCredentialsResponse + GetDockerRegistryCredentialsResponse Returns the docker registry credentials. Examples diff --git a/src/truefoundry_sdk/internal/docker_registries/raw_client.py b/src/truefoundry_sdk/internal/docker_registries/raw_client.py index fba97a3a..b6d1f3dc 100644 --- a/src/truefoundry_sdk/internal/docker_registries/raw_client.py +++ b/src/truefoundry_sdk/internal/docker_registries/raw_client.py @@ -9,8 +9,8 @@ from ...core.pydantic_utilities import parse_obj_as from ...core.request_options import RequestOptions from ...errors.not_found_error import NotFoundError -from .types.docker_registries_create_repository_response import DockerRegistriesCreateRepositoryResponse -from .types.docker_registries_get_credentials_response import DockerRegistriesGetCredentialsResponse +from ...types.create_docker_repository_response import CreateDockerRepositoryResponse +from ...types.get_docker_registry_credentials_response import GetDockerRegistryCredentialsResponse # this is used as the default value for optional parameters OMIT = typing.cast(typing.Any, ...) @@ -27,7 +27,7 @@ def create_repository( application_name: str, workspace_fqn: str, request_options: typing.Optional[RequestOptions] = None, - ) -> HttpResponse[DockerRegistriesCreateRepositoryResponse]: + ) -> HttpResponse[CreateDockerRepositoryResponse]: """ Create a docker repository in the provided workspace. @@ -47,7 +47,7 @@ def create_repository( Returns ------- - HttpResponse[DockerRegistriesCreateRepositoryResponse] + HttpResponse[CreateDockerRepositoryResponse] Returns the Repository name. """ _response = self._client_wrapper.httpx_client.request( @@ -67,9 +67,9 @@ def create_repository( try: if 200 <= _response.status_code < 300: _data = typing.cast( - DockerRegistriesCreateRepositoryResponse, + CreateDockerRepositoryResponse, parse_obj_as( - type_=DockerRegistriesCreateRepositoryResponse, # type: ignore + type_=CreateDockerRepositoryResponse, # type: ignore object_=_response.json(), ), ) @@ -96,7 +96,7 @@ def get_credentials( fqn: typing.Optional[str] = None, cluster_id: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None, - ) -> HttpResponse[DockerRegistriesGetCredentialsResponse]: + ) -> HttpResponse[GetDockerRegistryCredentialsResponse]: """ Get docker registry credentials for building and pushing an image. @@ -113,7 +113,7 @@ def get_credentials( Returns ------- - HttpResponse[DockerRegistriesGetCredentialsResponse] + HttpResponse[GetDockerRegistryCredentialsResponse] Returns the docker registry credentials. """ _response = self._client_wrapper.httpx_client.request( @@ -128,9 +128,9 @@ def get_credentials( try: if 200 <= _response.status_code < 300: _data = typing.cast( - DockerRegistriesGetCredentialsResponse, + GetDockerRegistryCredentialsResponse, parse_obj_as( - type_=DockerRegistriesGetCredentialsResponse, # type: ignore + type_=GetDockerRegistryCredentialsResponse, # type: ignore object_=_response.json(), ), ) @@ -152,7 +152,7 @@ async def create_repository( application_name: str, workspace_fqn: str, request_options: typing.Optional[RequestOptions] = None, - ) -> AsyncHttpResponse[DockerRegistriesCreateRepositoryResponse]: + ) -> AsyncHttpResponse[CreateDockerRepositoryResponse]: """ Create a docker repository in the provided workspace. @@ -172,7 +172,7 @@ async def create_repository( Returns ------- - AsyncHttpResponse[DockerRegistriesCreateRepositoryResponse] + AsyncHttpResponse[CreateDockerRepositoryResponse] Returns the Repository name. """ _response = await self._client_wrapper.httpx_client.request( @@ -192,9 +192,9 @@ async def create_repository( try: if 200 <= _response.status_code < 300: _data = typing.cast( - DockerRegistriesCreateRepositoryResponse, + CreateDockerRepositoryResponse, parse_obj_as( - type_=DockerRegistriesCreateRepositoryResponse, # type: ignore + type_=CreateDockerRepositoryResponse, # type: ignore object_=_response.json(), ), ) @@ -221,7 +221,7 @@ async def get_credentials( fqn: typing.Optional[str] = None, cluster_id: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None, - ) -> AsyncHttpResponse[DockerRegistriesGetCredentialsResponse]: + ) -> AsyncHttpResponse[GetDockerRegistryCredentialsResponse]: """ Get docker registry credentials for building and pushing an image. @@ -238,7 +238,7 @@ async def get_credentials( Returns ------- - AsyncHttpResponse[DockerRegistriesGetCredentialsResponse] + AsyncHttpResponse[GetDockerRegistryCredentialsResponse] Returns the docker registry credentials. """ _response = await self._client_wrapper.httpx_client.request( @@ -253,9 +253,9 @@ async def get_credentials( try: if 200 <= _response.status_code < 300: _data = typing.cast( - DockerRegistriesGetCredentialsResponse, + GetDockerRegistryCredentialsResponse, parse_obj_as( - type_=DockerRegistriesGetCredentialsResponse, # type: ignore + type_=GetDockerRegistryCredentialsResponse, # type: ignore object_=_response.json(), ), ) diff --git a/src/truefoundry_sdk/internal/docker_registries/types/__init__.py b/src/truefoundry_sdk/internal/docker_registries/types/__init__.py deleted file mode 100644 index 985a750e..00000000 --- a/src/truefoundry_sdk/internal/docker_registries/types/__init__.py +++ /dev/null @@ -1,38 +0,0 @@ -# This file was auto-generated by Fern from our API Definition. - -# isort: skip_file - -import typing -from importlib import import_module - -if typing.TYPE_CHECKING: - from .docker_registries_create_repository_response import DockerRegistriesCreateRepositoryResponse - from .docker_registries_get_credentials_response import DockerRegistriesGetCredentialsResponse -_dynamic_imports: typing.Dict[str, str] = { - "DockerRegistriesCreateRepositoryResponse": ".docker_registries_create_repository_response", - "DockerRegistriesGetCredentialsResponse": ".docker_registries_get_credentials_response", -} - - -def __getattr__(attr_name: str) -> typing.Any: - module_name = _dynamic_imports.get(attr_name) - if module_name is None: - raise AttributeError(f"No {attr_name} found in _dynamic_imports for module name -> {__name__}") - try: - module = import_module(module_name, __package__) - if module_name == f".{attr_name}": - return module - else: - return getattr(module, attr_name) - except ImportError as e: - raise ImportError(f"Failed to import {attr_name} from {module_name}: {e}") from e - except AttributeError as e: - raise AttributeError(f"Failed to get {attr_name} from {module_name}: {e}") from e - - -def __dir__(): - lazy_attrs = list(_dynamic_imports.keys()) - return sorted(lazy_attrs) - - -__all__ = ["DockerRegistriesCreateRepositoryResponse", "DockerRegistriesGetCredentialsResponse"] diff --git a/src/truefoundry_sdk/internal/docker_registries/types/docker_registries_get_credentials_response.py b/src/truefoundry_sdk/internal/docker_registries/types/docker_registries_get_credentials_response.py deleted file mode 100644 index 002717a9..00000000 --- a/src/truefoundry_sdk/internal/docker_registries/types/docker_registries_get_credentials_response.py +++ /dev/null @@ -1,40 +0,0 @@ -# This file was auto-generated by Fern from our API Definition. - -import typing - -import pydantic -import typing_extensions -from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel -from ....core.serialization import FieldMetadata - - -class DockerRegistriesGetCredentialsResponse(UniversalBaseModel): - fqn: typing.Optional[str] = pydantic.Field(default=None) - """ - Docker registry FQN - """ - - registry_url: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="registryUrl")] = ( - pydantic.Field(alias="registryUrl", default=None) - ) - """ - Docker registry URL - """ - - username: typing.Optional[str] = pydantic.Field(default=None) - """ - Username - """ - - password: typing.Optional[str] = pydantic.Field(default=None) - """ - Password - """ - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 - else: - - class Config: - smart_union = True - extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/internal/ml/client.py b/src/truefoundry_sdk/internal/ml/client.py index 5158ce6f..03fa418d 100644 --- a/src/truefoundry_sdk/internal/ml/client.py +++ b/src/truefoundry_sdk/internal/ml/client.py @@ -33,9 +33,12 @@ def apply( self, *, manifest: ApplyMlEntityRequestManifest, request_options: typing.Optional[RequestOptions] = None ) -> ApplyMlEntityResponse: """ + Create or update an ML entity (model, prompt, artifact, or data directory). + Parameters ---------- manifest : ApplyMlEntityRequestManifest + Manifest containing metadata for the ML entity to apply (model, prompt, artifact, agent skill, or data directory) request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -43,7 +46,7 @@ def apply( Returns ------- ApplyMlEntityResponse - Successful Response + The created or updated ML entity Examples -------- @@ -69,9 +72,12 @@ def delete( self, *, manifest: DeleteMlEntityRequestManifest, request_options: typing.Optional[RequestOptions] = None ) -> EmptyResponse: """ + Delete an ML entity (model, prompt, artifact, agent skill, data directory, or ML Repo) by manifest. + Parameters ---------- manifest : DeleteMlEntityRequestManifest + Manifest identifying the ML entity to delete (model, prompt, artifact, agent skill, data directory, or ML Repo) request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -79,7 +85,7 @@ def delete( Returns ------- EmptyResponse - Successful Response + Empty response indicating successful deletion Examples -------- @@ -121,9 +127,12 @@ async def apply( self, *, manifest: ApplyMlEntityRequestManifest, request_options: typing.Optional[RequestOptions] = None ) -> ApplyMlEntityResponse: """ + Create or update an ML entity (model, prompt, artifact, or data directory). + Parameters ---------- manifest : ApplyMlEntityRequestManifest + Manifest containing metadata for the ML entity to apply (model, prompt, artifact, agent skill, or data directory) request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -131,7 +140,7 @@ async def apply( Returns ------- ApplyMlEntityResponse - Successful Response + The created or updated ML entity Examples -------- @@ -169,9 +178,12 @@ async def delete( self, *, manifest: DeleteMlEntityRequestManifest, request_options: typing.Optional[RequestOptions] = None ) -> EmptyResponse: """ + Delete an ML entity (model, prompt, artifact, agent skill, data directory, or ML Repo) by manifest. + Parameters ---------- manifest : DeleteMlEntityRequestManifest + Manifest identifying the ML entity to delete (model, prompt, artifact, agent skill, data directory, or ML Repo) request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -179,7 +191,7 @@ async def delete( Returns ------- EmptyResponse - Successful Response + Empty response indicating successful deletion Examples -------- diff --git a/src/truefoundry_sdk/internal/ml/raw_client.py b/src/truefoundry_sdk/internal/ml/raw_client.py index c855e797..7c1ad610 100644 --- a/src/truefoundry_sdk/internal/ml/raw_client.py +++ b/src/truefoundry_sdk/internal/ml/raw_client.py @@ -27,9 +27,12 @@ def apply( self, *, manifest: ApplyMlEntityRequestManifest, request_options: typing.Optional[RequestOptions] = None ) -> HttpResponse[ApplyMlEntityResponse]: """ + Create or update an ML entity (model, prompt, artifact, or data directory). + Parameters ---------- manifest : ApplyMlEntityRequestManifest + Manifest containing metadata for the ML entity to apply (model, prompt, artifact, agent skill, or data directory) request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -37,7 +40,7 @@ def apply( Returns ------- HttpResponse[ApplyMlEntityResponse] - Successful Response + The created or updated ML entity """ _response = self._client_wrapper.httpx_client.request( "api/ml/v1/apply", @@ -83,9 +86,12 @@ def delete( self, *, manifest: DeleteMlEntityRequestManifest, request_options: typing.Optional[RequestOptions] = None ) -> HttpResponse[EmptyResponse]: """ + Delete an ML entity (model, prompt, artifact, agent skill, data directory, or ML Repo) by manifest. + Parameters ---------- manifest : DeleteMlEntityRequestManifest + Manifest identifying the ML entity to delete (model, prompt, artifact, agent skill, data directory, or ML Repo) request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -93,7 +99,7 @@ def delete( Returns ------- HttpResponse[EmptyResponse] - Successful Response + Empty response indicating successful deletion """ _response = self._client_wrapper.httpx_client.request( "api/ml/v1/delete", @@ -144,9 +150,12 @@ async def apply( self, *, manifest: ApplyMlEntityRequestManifest, request_options: typing.Optional[RequestOptions] = None ) -> AsyncHttpResponse[ApplyMlEntityResponse]: """ + Create or update an ML entity (model, prompt, artifact, or data directory). + Parameters ---------- manifest : ApplyMlEntityRequestManifest + Manifest containing metadata for the ML entity to apply (model, prompt, artifact, agent skill, or data directory) request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -154,7 +163,7 @@ async def apply( Returns ------- AsyncHttpResponse[ApplyMlEntityResponse] - Successful Response + The created or updated ML entity """ _response = await self._client_wrapper.httpx_client.request( "api/ml/v1/apply", @@ -200,9 +209,12 @@ async def delete( self, *, manifest: DeleteMlEntityRequestManifest, request_options: typing.Optional[RequestOptions] = None ) -> AsyncHttpResponse[EmptyResponse]: """ + Delete an ML entity (model, prompt, artifact, agent skill, data directory, or ML Repo) by manifest. + Parameters ---------- manifest : DeleteMlEntityRequestManifest + Manifest identifying the ML entity to delete (model, prompt, artifact, agent skill, data directory, or ML Repo) request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -210,7 +222,7 @@ async def delete( Returns ------- AsyncHttpResponse[EmptyResponse] - Successful Response + Empty response indicating successful deletion """ _response = await self._client_wrapper.httpx_client.request( "api/ml/v1/delete", diff --git a/src/truefoundry_sdk/internal/ml/types/apply_ml_entity_request_manifest.py b/src/truefoundry_sdk/internal/ml/types/apply_ml_entity_request_manifest.py index a880b6b2..a3a06ac0 100644 --- a/src/truefoundry_sdk/internal/ml/types/apply_ml_entity_request_manifest.py +++ b/src/truefoundry_sdk/internal/ml/types/apply_ml_entity_request_manifest.py @@ -2,9 +2,12 @@ import typing +from ....types.agent_skill_manifest import AgentSkillManifest from ....types.artifact_manifest import ArtifactManifest from ....types.chat_prompt_manifest import ChatPromptManifest from ....types.data_directory_manifest import DataDirectoryManifest from ....types.model_manifest import ModelManifest -ApplyMlEntityRequestManifest = typing.Union[ModelManifest, ChatPromptManifest, ArtifactManifest, DataDirectoryManifest] +ApplyMlEntityRequestManifest = typing.Union[ + ModelManifest, ChatPromptManifest, ArtifactManifest, AgentSkillManifest, DataDirectoryManifest +] diff --git a/src/truefoundry_sdk/internal/ml/types/delete_ml_entity_request_manifest.py b/src/truefoundry_sdk/internal/ml/types/delete_ml_entity_request_manifest.py index 76f0f09b..fbf3baa6 100644 --- a/src/truefoundry_sdk/internal/ml/types/delete_ml_entity_request_manifest.py +++ b/src/truefoundry_sdk/internal/ml/types/delete_ml_entity_request_manifest.py @@ -2,6 +2,7 @@ import typing +from ....types.agent_skill_manifest import AgentSkillManifest from ....types.artifact_manifest import ArtifactManifest from ....types.chat_prompt_manifest import ChatPromptManifest from ....types.data_directory_manifest import DataDirectoryManifest @@ -9,5 +10,5 @@ from ....types.model_manifest import ModelManifest DeleteMlEntityRequestManifest = typing.Union[ - ModelManifest, ChatPromptManifest, ArtifactManifest, DataDirectoryManifest, MlRepoManifest + ModelManifest, ChatPromptManifest, ArtifactManifest, AgentSkillManifest, DataDirectoryManifest, MlRepoManifest ] diff --git a/src/truefoundry_sdk/internal/workflows/types/workflows_execute_workflow_response.py b/src/truefoundry_sdk/internal/workflows/types/workflows_execute_workflow_response.py index 73238ca3..438fbed8 100644 --- a/src/truefoundry_sdk/internal/workflows/types/workflows_execute_workflow_response.py +++ b/src/truefoundry_sdk/internal/workflows/types/workflows_execute_workflow_response.py @@ -9,12 +9,11 @@ class WorkflowsExecuteWorkflowResponse(UniversalBaseModel): - execution_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="executionName")] = ( - pydantic.Field(alias="executionName", default=None) - ) - """ - The name of the execution - """ + execution_name: typing_extensions.Annotated[ + typing.Optional[str], + FieldMetadata(alias="executionName"), + pydantic.Field(alias="executionName", description="The name of the execution"), + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/ml_repos/client.py b/src/truefoundry_sdk/ml_repos/client.py index 3e8deca9..bc25b27b 100644 --- a/src/truefoundry_sdk/ml_repos/client.py +++ b/src/truefoundry_sdk/ml_repos/client.py @@ -32,7 +32,11 @@ def with_raw_response(self) -> RawMlReposClient: return self._raw_client def create_or_update( - self, *, manifest: MlRepoManifest, request_options: typing.Optional[RequestOptions] = None + self, + *, + manifest: MlRepoManifest, + dry_run: typing.Optional[bool] = False, + request_options: typing.Optional[RequestOptions] = None, ) -> GetMlRepoResponse: """ Creates or updates an MLRepo entity based on the provided manifest. @@ -42,6 +46,9 @@ def create_or_update( manifest : MlRepoManifest MLRepo manifest + dry_run : typing.Optional[bool] + Validate the manifest and collaborators without persisting changes or updating artifact location in the database + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -71,18 +78,14 @@ def create_or_update( ), ) """ - _response = self._raw_client.create_or_update(manifest=manifest, request_options=request_options) + _response = self._raw_client.create_or_update( + manifest=manifest, dry_run=dry_run, request_options=request_options + ) return _response.data def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> GetMlRepoResponse: """ - Get a ml repo by id - Args: - id: Unique identifier of the ml repo to get - user_info: Authenticated user information - - Returns: - GetMLRepoResponse: The ml repo + Get an ML Repo by its ID. Parameters ---------- @@ -94,7 +97,7 @@ def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = Non Returns ------- GetMlRepoResponse - Successful Response + The ML Repo data Examples -------- @@ -113,13 +116,7 @@ def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = Non def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> EmptyResponse: """ - Delete a ml repo - Args: - id: Unique identifier of the ml repo to delete - user_info: Authenticated user information - - Returns: - EmptyResponse: Empty response indicating successful deletion + Delete an ML Repo by its ID. Parameters ---------- @@ -131,7 +128,7 @@ def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] = Returns ------- EmptyResponse - Successful Response + Empty response indicating successful deletion Examples -------- @@ -157,21 +154,18 @@ def list( request_options: typing.Optional[RequestOptions] = None, ) -> SyncPager[MlRepo, ListMlReposResponse]: """ - List ml repos - Args: - filters: Filters for the ml repos - user_info: Authenticated user information - - Returns: - ListMLReposResponse: List of ml repos + List ML Repos with optional filtering by name. Parameters ---------- name : typing.Optional[str] + Name of the ML Repo to filter by limit : typing.Optional[int] + Maximum number of ML Repos to return offset : typing.Optional[int] + Number of ML Repos to skip for pagination request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -179,7 +173,7 @@ def list( Returns ------- SyncPager[MlRepo, ListMlReposResponse] - Successful Response + List of ML Repos matching the query with pagination information Examples -------- @@ -219,7 +213,11 @@ def with_raw_response(self) -> AsyncRawMlReposClient: return self._raw_client async def create_or_update( - self, *, manifest: MlRepoManifest, request_options: typing.Optional[RequestOptions] = None + self, + *, + manifest: MlRepoManifest, + dry_run: typing.Optional[bool] = False, + request_options: typing.Optional[RequestOptions] = None, ) -> GetMlRepoResponse: """ Creates or updates an MLRepo entity based on the provided manifest. @@ -229,6 +227,9 @@ async def create_or_update( manifest : MlRepoManifest MLRepo manifest + dry_run : typing.Optional[bool] + Validate the manifest and collaborators without persisting changes or updating artifact location in the database + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -266,18 +267,14 @@ async def main() -> None: asyncio.run(main()) """ - _response = await self._raw_client.create_or_update(manifest=manifest, request_options=request_options) + _response = await self._raw_client.create_or_update( + manifest=manifest, dry_run=dry_run, request_options=request_options + ) return _response.data async def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> GetMlRepoResponse: """ - Get a ml repo by id - Args: - id: Unique identifier of the ml repo to get - user_info: Authenticated user information - - Returns: - GetMLRepoResponse: The ml repo + Get an ML Repo by its ID. Parameters ---------- @@ -289,7 +286,7 @@ async def get(self, id: str, *, request_options: typing.Optional[RequestOptions] Returns ------- GetMlRepoResponse - Successful Response + The ML Repo data Examples -------- @@ -316,13 +313,7 @@ async def main() -> None: async def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> EmptyResponse: """ - Delete a ml repo - Args: - id: Unique identifier of the ml repo to delete - user_info: Authenticated user information - - Returns: - EmptyResponse: Empty response indicating successful deletion + Delete an ML Repo by its ID. Parameters ---------- @@ -334,7 +325,7 @@ async def delete(self, id: str, *, request_options: typing.Optional[RequestOptio Returns ------- EmptyResponse - Successful Response + Empty response indicating successful deletion Examples -------- @@ -368,21 +359,18 @@ async def list( request_options: typing.Optional[RequestOptions] = None, ) -> AsyncPager[MlRepo, ListMlReposResponse]: """ - List ml repos - Args: - filters: Filters for the ml repos - user_info: Authenticated user information - - Returns: - ListMLReposResponse: List of ml repos + List ML Repos with optional filtering by name. Parameters ---------- name : typing.Optional[str] + Name of the ML Repo to filter by limit : typing.Optional[int] + Maximum number of ML Repos to return offset : typing.Optional[int] + Number of ML Repos to skip for pagination request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -390,7 +378,7 @@ async def list( Returns ------- AsyncPager[MlRepo, ListMlReposResponse] - Successful Response + List of ML Repos matching the query with pagination information Examples -------- diff --git a/src/truefoundry_sdk/ml_repos/raw_client.py b/src/truefoundry_sdk/ml_repos/raw_client.py index c63fafe9..194a8c48 100644 --- a/src/truefoundry_sdk/ml_repos/raw_client.py +++ b/src/truefoundry_sdk/ml_repos/raw_client.py @@ -31,7 +31,11 @@ def __init__(self, *, client_wrapper: SyncClientWrapper): self._client_wrapper = client_wrapper def create_or_update( - self, *, manifest: MlRepoManifest, request_options: typing.Optional[RequestOptions] = None + self, + *, + manifest: MlRepoManifest, + dry_run: typing.Optional[bool] = False, + request_options: typing.Optional[RequestOptions] = None, ) -> HttpResponse[GetMlRepoResponse]: """ Creates or updates an MLRepo entity based on the provided manifest. @@ -41,6 +45,9 @@ def create_or_update( manifest : MlRepoManifest MLRepo manifest + dry_run : typing.Optional[bool] + Validate the manifest and collaborators without persisting changes or updating artifact location in the database + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -56,6 +63,7 @@ def create_or_update( "manifest": convert_and_respect_annotation_metadata( object_=manifest, annotation=MlRepoManifest, direction="write" ), + "dryRun": dry_run, }, headers={ "content-type": "application/json", @@ -126,13 +134,7 @@ def get( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> HttpResponse[GetMlRepoResponse]: """ - Get a ml repo by id - Args: - id: Unique identifier of the ml repo to get - user_info: Authenticated user information - - Returns: - GetMLRepoResponse: The ml repo + Get an ML Repo by its ID. Parameters ---------- @@ -144,7 +146,7 @@ def get( Returns ------- HttpResponse[GetMlRepoResponse] - Successful Response + The ML Repo data """ _response = self._client_wrapper.httpx_client.request( f"api/ml/v1/ml-repos/{jsonable_encoder(id)}", @@ -181,13 +183,7 @@ def delete( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> HttpResponse[EmptyResponse]: """ - Delete a ml repo - Args: - id: Unique identifier of the ml repo to delete - user_info: Authenticated user information - - Returns: - EmptyResponse: Empty response indicating successful deletion + Delete an ML Repo by its ID. Parameters ---------- @@ -199,7 +195,7 @@ def delete( Returns ------- HttpResponse[EmptyResponse] - Successful Response + Empty response indicating successful deletion """ _response = self._client_wrapper.httpx_client.request( f"api/ml/v1/ml-repos/{jsonable_encoder(id)}", @@ -241,21 +237,18 @@ def list( request_options: typing.Optional[RequestOptions] = None, ) -> SyncPager[MlRepo, ListMlReposResponse]: """ - List ml repos - Args: - filters: Filters for the ml repos - user_info: Authenticated user information - - Returns: - ListMLReposResponse: List of ml repos + List ML Repos with optional filtering by name. Parameters ---------- name : typing.Optional[str] + Name of the ML Repo to filter by limit : typing.Optional[int] + Maximum number of ML Repos to return offset : typing.Optional[int] + Number of ML Repos to skip for pagination request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -263,7 +256,7 @@ def list( Returns ------- SyncPager[MlRepo, ListMlReposResponse] - Successful Response + List of ML Repos matching the query with pagination information """ offset = offset if offset is not None else 0 @@ -317,7 +310,11 @@ def __init__(self, *, client_wrapper: AsyncClientWrapper): self._client_wrapper = client_wrapper async def create_or_update( - self, *, manifest: MlRepoManifest, request_options: typing.Optional[RequestOptions] = None + self, + *, + manifest: MlRepoManifest, + dry_run: typing.Optional[bool] = False, + request_options: typing.Optional[RequestOptions] = None, ) -> AsyncHttpResponse[GetMlRepoResponse]: """ Creates or updates an MLRepo entity based on the provided manifest. @@ -327,6 +324,9 @@ async def create_or_update( manifest : MlRepoManifest MLRepo manifest + dry_run : typing.Optional[bool] + Validate the manifest and collaborators without persisting changes or updating artifact location in the database + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -342,6 +342,7 @@ async def create_or_update( "manifest": convert_and_respect_annotation_metadata( object_=manifest, annotation=MlRepoManifest, direction="write" ), + "dryRun": dry_run, }, headers={ "content-type": "application/json", @@ -412,13 +413,7 @@ async def get( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> AsyncHttpResponse[GetMlRepoResponse]: """ - Get a ml repo by id - Args: - id: Unique identifier of the ml repo to get - user_info: Authenticated user information - - Returns: - GetMLRepoResponse: The ml repo + Get an ML Repo by its ID. Parameters ---------- @@ -430,7 +425,7 @@ async def get( Returns ------- AsyncHttpResponse[GetMlRepoResponse] - Successful Response + The ML Repo data """ _response = await self._client_wrapper.httpx_client.request( f"api/ml/v1/ml-repos/{jsonable_encoder(id)}", @@ -467,13 +462,7 @@ async def delete( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> AsyncHttpResponse[EmptyResponse]: """ - Delete a ml repo - Args: - id: Unique identifier of the ml repo to delete - user_info: Authenticated user information - - Returns: - EmptyResponse: Empty response indicating successful deletion + Delete an ML Repo by its ID. Parameters ---------- @@ -485,7 +474,7 @@ async def delete( Returns ------- AsyncHttpResponse[EmptyResponse] - Successful Response + Empty response indicating successful deletion """ _response = await self._client_wrapper.httpx_client.request( f"api/ml/v1/ml-repos/{jsonable_encoder(id)}", @@ -527,21 +516,18 @@ async def list( request_options: typing.Optional[RequestOptions] = None, ) -> AsyncPager[MlRepo, ListMlReposResponse]: """ - List ml repos - Args: - filters: Filters for the ml repos - user_info: Authenticated user information - - Returns: - ListMLReposResponse: List of ml repos + List ML Repos with optional filtering by name. Parameters ---------- name : typing.Optional[str] + Name of the ML Repo to filter by limit : typing.Optional[int] + Maximum number of ML Repos to return offset : typing.Optional[int] + Number of ML Repos to skip for pagination request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -549,7 +535,7 @@ async def list( Returns ------- AsyncPager[MlRepo, ListMlReposResponse] - Successful Response + List of ML Repos matching the query with pagination information """ offset = offset if offset is not None else 0 diff --git a/src/truefoundry_sdk/model_versions/client.py b/src/truefoundry_sdk/model_versions/client.py index 3fe771ca..c51d4000 100644 --- a/src/truefoundry_sdk/model_versions/client.py +++ b/src/truefoundry_sdk/model_versions/client.py @@ -39,13 +39,18 @@ def apply_tags( request_options: typing.Optional[RequestOptions] = None, ) -> EmptyResponse: """ + Apply tags to a model version. + Parameters ---------- model_version_id : str + ID of the model version to apply tags to tags : typing.Sequence[str] + List of tags to apply to the model version force : typing.Optional[bool] + Whether to overwrite existing tags if they conflict request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -53,7 +58,7 @@ def apply_tags( Returns ------- EmptyResponse - Successful Response + Empty response indicating successful tag application Examples -------- @@ -75,7 +80,7 @@ def apply_tags( def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> GetModelVersionResponse: """ - Get model version API + Get a model version by its ID. Parameters ---------- @@ -87,7 +92,7 @@ def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = Non Returns ------- GetModelVersionResponse - Successful Response + The model version data Examples -------- @@ -106,7 +111,7 @@ def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = Non def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> EmptyResponse: """ - Delete model versions API + Delete a model version by its ID. Parameters ---------- @@ -118,7 +123,7 @@ def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] = Returns ------- EmptyResponse - Successful Response + Empty response indicating successful deletion Examples -------- @@ -152,31 +157,42 @@ def list( request_options: typing.Optional[RequestOptions] = None, ) -> SyncPager[ModelVersion, ListModelVersionsResponse]: """ - List model version API + List model versions with optional filtering by tag, FQN, model ID, ML Repo, name, version, run IDs, or run steps. Parameters ---------- tag : typing.Optional[str] + Tag to filter model versions by fqn : typing.Optional[str] + Fully qualified name to filter model versions by (format: 'model:{tenant_name}/{ml_repo_name}/{model_name}' or 'model:{tenant_name}/{ml_repo_name}/{model_name}:{version}') model_id : typing.Optional[str] + ID of the model to filter versions by ml_repo_id : typing.Optional[str] + ID of the ML Repo to filter model versions by name : typing.Optional[str] + Name of the model to filter versions by version : typing.Optional[int] + Version number (positive integer) or 'latest' to filter by specific version run_ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] + List of run IDs to filter model versions by run_steps : typing.Optional[typing.Union[int, typing.Sequence[int]]] + List of run step numbers to filter model versions by offset : typing.Optional[int] + Number of model versions to skip for pagination limit : typing.Optional[int] + Maximum number of model versions to return include_internal_metadata : typing.Optional[bool] + Whether to include internal metadata in the response request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -184,7 +200,7 @@ def list( Returns ------- SyncPager[ModelVersion, ListModelVersionsResponse] - Successful Response + List of model versions matching the query with pagination information Examples -------- @@ -251,13 +267,18 @@ async def apply_tags( request_options: typing.Optional[RequestOptions] = None, ) -> EmptyResponse: """ + Apply tags to a model version. + Parameters ---------- model_version_id : str + ID of the model version to apply tags to tags : typing.Sequence[str] + List of tags to apply to the model version force : typing.Optional[bool] + Whether to overwrite existing tags if they conflict request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -265,7 +286,7 @@ async def apply_tags( Returns ------- EmptyResponse - Successful Response + Empty response indicating successful tag application Examples -------- @@ -295,7 +316,7 @@ async def main() -> None: async def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> GetModelVersionResponse: """ - Get model version API + Get a model version by its ID. Parameters ---------- @@ -307,7 +328,7 @@ async def get(self, id: str, *, request_options: typing.Optional[RequestOptions] Returns ------- GetModelVersionResponse - Successful Response + The model version data Examples -------- @@ -334,7 +355,7 @@ async def main() -> None: async def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> EmptyResponse: """ - Delete model versions API + Delete a model version by its ID. Parameters ---------- @@ -346,7 +367,7 @@ async def delete(self, id: str, *, request_options: typing.Optional[RequestOptio Returns ------- EmptyResponse - Successful Response + Empty response indicating successful deletion Examples -------- @@ -388,31 +409,42 @@ async def list( request_options: typing.Optional[RequestOptions] = None, ) -> AsyncPager[ModelVersion, ListModelVersionsResponse]: """ - List model version API + List model versions with optional filtering by tag, FQN, model ID, ML Repo, name, version, run IDs, or run steps. Parameters ---------- tag : typing.Optional[str] + Tag to filter model versions by fqn : typing.Optional[str] + Fully qualified name to filter model versions by (format: 'model:{tenant_name}/{ml_repo_name}/{model_name}' or 'model:{tenant_name}/{ml_repo_name}/{model_name}:{version}') model_id : typing.Optional[str] + ID of the model to filter versions by ml_repo_id : typing.Optional[str] + ID of the ML Repo to filter model versions by name : typing.Optional[str] + Name of the model to filter versions by version : typing.Optional[int] + Version number (positive integer) or 'latest' to filter by specific version run_ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] + List of run IDs to filter model versions by run_steps : typing.Optional[typing.Union[int, typing.Sequence[int]]] + List of run step numbers to filter model versions by offset : typing.Optional[int] + Number of model versions to skip for pagination limit : typing.Optional[int] + Maximum number of model versions to return include_internal_metadata : typing.Optional[bool] + Whether to include internal metadata in the response request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -420,7 +452,7 @@ async def list( Returns ------- AsyncPager[ModelVersion, ListModelVersionsResponse] - Successful Response + List of model versions matching the query with pagination information Examples -------- diff --git a/src/truefoundry_sdk/model_versions/raw_client.py b/src/truefoundry_sdk/model_versions/raw_client.py index 2fa4d564..57598932 100644 --- a/src/truefoundry_sdk/model_versions/raw_client.py +++ b/src/truefoundry_sdk/model_versions/raw_client.py @@ -33,13 +33,18 @@ def apply_tags( request_options: typing.Optional[RequestOptions] = None, ) -> HttpResponse[EmptyResponse]: """ + Apply tags to a model version. + Parameters ---------- model_version_id : str + ID of the model version to apply tags to tags : typing.Sequence[str] + List of tags to apply to the model version force : typing.Optional[bool] + Whether to overwrite existing tags if they conflict request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -47,7 +52,7 @@ def apply_tags( Returns ------- HttpResponse[EmptyResponse] - Successful Response + Empty response indicating successful tag application """ _response = self._client_wrapper.httpx_client.request( "api/ml/v1/model-versions/tags", @@ -93,7 +98,7 @@ def get( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> HttpResponse[GetModelVersionResponse]: """ - Get model version API + Get a model version by its ID. Parameters ---------- @@ -105,7 +110,7 @@ def get( Returns ------- HttpResponse[GetModelVersionResponse] - Successful Response + The model version data """ _response = self._client_wrapper.httpx_client.request( f"api/ml/v1/model-versions/{jsonable_encoder(id)}", @@ -142,7 +147,7 @@ def delete( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> HttpResponse[EmptyResponse]: """ - Delete model versions API + Delete a model version by its ID. Parameters ---------- @@ -154,7 +159,7 @@ def delete( Returns ------- HttpResponse[EmptyResponse] - Successful Response + Empty response indicating successful deletion """ _response = self._client_wrapper.httpx_client.request( f"api/ml/v1/model-versions/{jsonable_encoder(id)}", @@ -204,31 +209,42 @@ def list( request_options: typing.Optional[RequestOptions] = None, ) -> SyncPager[ModelVersion, ListModelVersionsResponse]: """ - List model version API + List model versions with optional filtering by tag, FQN, model ID, ML Repo, name, version, run IDs, or run steps. Parameters ---------- tag : typing.Optional[str] + Tag to filter model versions by fqn : typing.Optional[str] + Fully qualified name to filter model versions by (format: 'model:{tenant_name}/{ml_repo_name}/{model_name}' or 'model:{tenant_name}/{ml_repo_name}/{model_name}:{version}') model_id : typing.Optional[str] + ID of the model to filter versions by ml_repo_id : typing.Optional[str] + ID of the ML Repo to filter model versions by name : typing.Optional[str] + Name of the model to filter versions by version : typing.Optional[int] + Version number (positive integer) or 'latest' to filter by specific version run_ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] + List of run IDs to filter model versions by run_steps : typing.Optional[typing.Union[int, typing.Sequence[int]]] + List of run step numbers to filter model versions by offset : typing.Optional[int] + Number of model versions to skip for pagination limit : typing.Optional[int] + Maximum number of model versions to return include_internal_metadata : typing.Optional[bool] + Whether to include internal metadata in the response request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -236,7 +252,7 @@ def list( Returns ------- SyncPager[ModelVersion, ListModelVersionsResponse] - Successful Response + List of model versions matching the query with pagination information """ offset = offset if offset is not None else 0 @@ -314,13 +330,18 @@ async def apply_tags( request_options: typing.Optional[RequestOptions] = None, ) -> AsyncHttpResponse[EmptyResponse]: """ + Apply tags to a model version. + Parameters ---------- model_version_id : str + ID of the model version to apply tags to tags : typing.Sequence[str] + List of tags to apply to the model version force : typing.Optional[bool] + Whether to overwrite existing tags if they conflict request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -328,7 +349,7 @@ async def apply_tags( Returns ------- AsyncHttpResponse[EmptyResponse] - Successful Response + Empty response indicating successful tag application """ _response = await self._client_wrapper.httpx_client.request( "api/ml/v1/model-versions/tags", @@ -374,7 +395,7 @@ async def get( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> AsyncHttpResponse[GetModelVersionResponse]: """ - Get model version API + Get a model version by its ID. Parameters ---------- @@ -386,7 +407,7 @@ async def get( Returns ------- AsyncHttpResponse[GetModelVersionResponse] - Successful Response + The model version data """ _response = await self._client_wrapper.httpx_client.request( f"api/ml/v1/model-versions/{jsonable_encoder(id)}", @@ -423,7 +444,7 @@ async def delete( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> AsyncHttpResponse[EmptyResponse]: """ - Delete model versions API + Delete a model version by its ID. Parameters ---------- @@ -435,7 +456,7 @@ async def delete( Returns ------- AsyncHttpResponse[EmptyResponse] - Successful Response + Empty response indicating successful deletion """ _response = await self._client_wrapper.httpx_client.request( f"api/ml/v1/model-versions/{jsonable_encoder(id)}", @@ -485,31 +506,42 @@ async def list( request_options: typing.Optional[RequestOptions] = None, ) -> AsyncPager[ModelVersion, ListModelVersionsResponse]: """ - List model version API + List model versions with optional filtering by tag, FQN, model ID, ML Repo, name, version, run IDs, or run steps. Parameters ---------- tag : typing.Optional[str] + Tag to filter model versions by fqn : typing.Optional[str] + Fully qualified name to filter model versions by (format: 'model:{tenant_name}/{ml_repo_name}/{model_name}' or 'model:{tenant_name}/{ml_repo_name}/{model_name}:{version}') model_id : typing.Optional[str] + ID of the model to filter versions by ml_repo_id : typing.Optional[str] + ID of the ML Repo to filter model versions by name : typing.Optional[str] + Name of the model to filter versions by version : typing.Optional[int] + Version number (positive integer) or 'latest' to filter by specific version run_ids : typing.Optional[typing.Union[str, typing.Sequence[str]]] + List of run IDs to filter model versions by run_steps : typing.Optional[typing.Union[int, typing.Sequence[int]]] + List of run step numbers to filter model versions by offset : typing.Optional[int] + Number of model versions to skip for pagination limit : typing.Optional[int] + Maximum number of model versions to return include_internal_metadata : typing.Optional[bool] + Whether to include internal metadata in the response request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -517,7 +549,7 @@ async def list( Returns ------- AsyncPager[ModelVersion, ListModelVersionsResponse] - Successful Response + List of model versions matching the query with pagination information """ offset = offset if offset is not None else 0 diff --git a/src/truefoundry_sdk/models/client.py b/src/truefoundry_sdk/models/client.py index fd75b966..e8832131 100644 --- a/src/truefoundry_sdk/models/client.py +++ b/src/truefoundry_sdk/models/client.py @@ -34,6 +34,8 @@ def with_raw_response(self) -> RawModelsClient: def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> GetModelResponse: """ + Get a model by its ID. + Parameters ---------- id : str @@ -44,7 +46,7 @@ def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = Non Returns ------- GetModelResponse - Successful Response + The model data Examples -------- @@ -63,6 +65,8 @@ def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = Non def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> EmptyResponse: """ + Delete a model by its ID. + Parameters ---------- id : str @@ -73,7 +77,7 @@ def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] = Returns ------- EmptyResponse - Successful Response + Empty response indicating successful deletion Examples -------- @@ -103,21 +107,30 @@ def list( request_options: typing.Optional[RequestOptions] = None, ) -> SyncPager[Model, ListModelsResponse]: """ + List models with optional filtering by FQN, ML Repo, name, or run ID. + Parameters ---------- fqn : typing.Optional[str] + Fully qualified name to filter models by (format: 'model:{tenant_name}/{ml_repo_name}/{model_name}') ml_repo_id : typing.Optional[str] + ID of the ML Repo to filter models by name : typing.Optional[str] + Name of the model to filter by offset : typing.Optional[int] + Number of models to skip for pagination limit : typing.Optional[int] + Maximum number of models to return run_id : typing.Optional[str] + ID of the run to filter models by include_empty_models : typing.Optional[bool] + Whether to include models that have no versions request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -125,7 +138,7 @@ def list( Returns ------- SyncPager[Model, ListModelsResponse] - Successful Response + List of models matching the query with pagination information Examples -------- @@ -165,9 +178,12 @@ def create_or_update( self, *, manifest: ModelManifest, request_options: typing.Optional[RequestOptions] = None ) -> GetModelVersionResponse: """ + Create or update a model version. + Parameters ---------- manifest : ModelManifest + Manifest containing metadata for the model to apply request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -175,7 +191,7 @@ def create_or_update( Returns ------- GetModelVersionResponse - Successful Response + The created or updated model version Examples -------- @@ -215,6 +231,8 @@ def with_raw_response(self) -> AsyncRawModelsClient: async def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> GetModelResponse: """ + Get a model by its ID. + Parameters ---------- id : str @@ -225,7 +243,7 @@ async def get(self, id: str, *, request_options: typing.Optional[RequestOptions] Returns ------- GetModelResponse - Successful Response + The model data Examples -------- @@ -252,6 +270,8 @@ async def main() -> None: async def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> EmptyResponse: """ + Delete a model by its ID. + Parameters ---------- id : str @@ -262,7 +282,7 @@ async def delete(self, id: str, *, request_options: typing.Optional[RequestOptio Returns ------- EmptyResponse - Successful Response + Empty response indicating successful deletion Examples -------- @@ -300,21 +320,30 @@ async def list( request_options: typing.Optional[RequestOptions] = None, ) -> AsyncPager[Model, ListModelsResponse]: """ + List models with optional filtering by FQN, ML Repo, name, or run ID. + Parameters ---------- fqn : typing.Optional[str] + Fully qualified name to filter models by (format: 'model:{tenant_name}/{ml_repo_name}/{model_name}') ml_repo_id : typing.Optional[str] + ID of the ML Repo to filter models by name : typing.Optional[str] + Name of the model to filter by offset : typing.Optional[int] + Number of models to skip for pagination limit : typing.Optional[int] + Maximum number of models to return run_id : typing.Optional[str] + ID of the run to filter models by include_empty_models : typing.Optional[bool] + Whether to include models that have no versions request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -322,7 +351,7 @@ async def list( Returns ------- AsyncPager[Model, ListModelsResponse] - Successful Response + List of models matching the query with pagination information Examples -------- @@ -371,9 +400,12 @@ async def create_or_update( self, *, manifest: ModelManifest, request_options: typing.Optional[RequestOptions] = None ) -> GetModelVersionResponse: """ + Create or update a model version. + Parameters ---------- manifest : ModelManifest + Manifest containing metadata for the model to apply request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -381,7 +413,7 @@ async def create_or_update( Returns ------- GetModelVersionResponse - Successful Response + The created or updated model version Examples -------- diff --git a/src/truefoundry_sdk/models/raw_client.py b/src/truefoundry_sdk/models/raw_client.py index 96efc07c..63d808dd 100644 --- a/src/truefoundry_sdk/models/raw_client.py +++ b/src/truefoundry_sdk/models/raw_client.py @@ -31,6 +31,8 @@ def get( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> HttpResponse[GetModelResponse]: """ + Get a model by its ID. + Parameters ---------- id : str @@ -41,7 +43,7 @@ def get( Returns ------- HttpResponse[GetModelResponse] - Successful Response + The model data """ _response = self._client_wrapper.httpx_client.request( f"api/ml/v1/models/{jsonable_encoder(id)}", @@ -78,6 +80,8 @@ def delete( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> HttpResponse[EmptyResponse]: """ + Delete a model by its ID. + Parameters ---------- id : str @@ -88,7 +92,7 @@ def delete( Returns ------- HttpResponse[EmptyResponse] - Successful Response + Empty response indicating successful deletion """ _response = self._client_wrapper.httpx_client.request( f"api/ml/v1/models/{jsonable_encoder(id)}", @@ -134,21 +138,30 @@ def list( request_options: typing.Optional[RequestOptions] = None, ) -> SyncPager[Model, ListModelsResponse]: """ + List models with optional filtering by FQN, ML Repo, name, or run ID. + Parameters ---------- fqn : typing.Optional[str] + Fully qualified name to filter models by (format: 'model:{tenant_name}/{ml_repo_name}/{model_name}') ml_repo_id : typing.Optional[str] + ID of the ML Repo to filter models by name : typing.Optional[str] + Name of the model to filter by offset : typing.Optional[int] + Number of models to skip for pagination limit : typing.Optional[int] + Maximum number of models to return run_id : typing.Optional[str] + ID of the run to filter models by include_empty_models : typing.Optional[bool] + Whether to include models that have no versions request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -156,7 +169,7 @@ def list( Returns ------- SyncPager[Model, ListModelsResponse] - Successful Response + List of models matching the query with pagination information """ offset = offset if offset is not None else 0 @@ -216,9 +229,12 @@ def create_or_update( self, *, manifest: ModelManifest, request_options: typing.Optional[RequestOptions] = None ) -> HttpResponse[GetModelVersionResponse]: """ + Create or update a model version. + Parameters ---------- manifest : ModelManifest + Manifest containing metadata for the model to apply request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -226,7 +242,7 @@ def create_or_update( Returns ------- HttpResponse[GetModelVersionResponse] - Successful Response + The created or updated model version """ _response = self._client_wrapper.httpx_client.request( "api/ml/v1/model-versions", @@ -277,6 +293,8 @@ async def get( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> AsyncHttpResponse[GetModelResponse]: """ + Get a model by its ID. + Parameters ---------- id : str @@ -287,7 +305,7 @@ async def get( Returns ------- AsyncHttpResponse[GetModelResponse] - Successful Response + The model data """ _response = await self._client_wrapper.httpx_client.request( f"api/ml/v1/models/{jsonable_encoder(id)}", @@ -324,6 +342,8 @@ async def delete( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> AsyncHttpResponse[EmptyResponse]: """ + Delete a model by its ID. + Parameters ---------- id : str @@ -334,7 +354,7 @@ async def delete( Returns ------- AsyncHttpResponse[EmptyResponse] - Successful Response + Empty response indicating successful deletion """ _response = await self._client_wrapper.httpx_client.request( f"api/ml/v1/models/{jsonable_encoder(id)}", @@ -380,21 +400,30 @@ async def list( request_options: typing.Optional[RequestOptions] = None, ) -> AsyncPager[Model, ListModelsResponse]: """ + List models with optional filtering by FQN, ML Repo, name, or run ID. + Parameters ---------- fqn : typing.Optional[str] + Fully qualified name to filter models by (format: 'model:{tenant_name}/{ml_repo_name}/{model_name}') ml_repo_id : typing.Optional[str] + ID of the ML Repo to filter models by name : typing.Optional[str] + Name of the model to filter by offset : typing.Optional[int] + Number of models to skip for pagination limit : typing.Optional[int] + Maximum number of models to return run_id : typing.Optional[str] + ID of the run to filter models by include_empty_models : typing.Optional[bool] + Whether to include models that have no versions request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -402,7 +431,7 @@ async def list( Returns ------- AsyncPager[Model, ListModelsResponse] - Successful Response + List of models matching the query with pagination information """ offset = offset if offset is not None else 0 @@ -465,9 +494,12 @@ async def create_or_update( self, *, manifest: ModelManifest, request_options: typing.Optional[RequestOptions] = None ) -> AsyncHttpResponse[GetModelVersionResponse]: """ + Create or update a model version. + Parameters ---------- manifest : ModelManifest + Manifest containing metadata for the model to apply request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -475,7 +507,7 @@ async def create_or_update( Returns ------- AsyncHttpResponse[GetModelVersionResponse] - Successful Response + The created or updated model version """ _response = await self._client_wrapper.httpx_client.request( "api/ml/v1/model-versions", diff --git a/src/truefoundry_sdk/personal_access_tokens/client.py b/src/truefoundry_sdk/personal_access_tokens/client.py index 65ed5a09..06e61b99 100644 --- a/src/truefoundry_sdk/personal_access_tokens/client.py +++ b/src/truefoundry_sdk/personal_access_tokens/client.py @@ -37,6 +37,7 @@ def list( *, limit: typing.Optional[int] = 100, offset: typing.Optional[int] = 0, + name_search_query: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None, ) -> SyncPager[VirtualAccount, ListPersonalAccessTokenResponse]: """ @@ -50,6 +51,9 @@ def list( offset : typing.Optional[int] Number of items to skip + name_search_query : typing.Optional[str] + Return personal access tokens with names that contain this string + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -69,6 +73,7 @@ def list( response = client.personal_access_tokens.list( limit=10, offset=0, + name_search_query="nameSearchQuery", ) for item in response: yield item @@ -76,7 +81,9 @@ def list( for page in response.iter_pages(): yield page """ - return self._raw_client.list(limit=limit, offset=offset, request_options=request_options) + return self._raw_client.list( + limit=limit, offset=offset, name_search_query=name_search_query, request_options=request_options + ) def create( self, @@ -247,6 +254,7 @@ async def list( *, limit: typing.Optional[int] = 100, offset: typing.Optional[int] = 0, + name_search_query: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None, ) -> AsyncPager[VirtualAccount, ListPersonalAccessTokenResponse]: """ @@ -260,6 +268,9 @@ async def list( offset : typing.Optional[int] Number of items to skip + name_search_query : typing.Optional[str] + Return personal access tokens with names that contain this string + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -284,6 +295,7 @@ async def main() -> None: response = await client.personal_access_tokens.list( limit=10, offset=0, + name_search_query="nameSearchQuery", ) async for item in response: yield item @@ -295,7 +307,9 @@ async def main() -> None: asyncio.run(main()) """ - return await self._raw_client.list(limit=limit, offset=offset, request_options=request_options) + return await self._raw_client.list( + limit=limit, offset=offset, name_search_query=name_search_query, request_options=request_options + ) async def create( self, diff --git a/src/truefoundry_sdk/personal_access_tokens/raw_client.py b/src/truefoundry_sdk/personal_access_tokens/raw_client.py index 5d9707bc..39d85efe 100644 --- a/src/truefoundry_sdk/personal_access_tokens/raw_client.py +++ b/src/truefoundry_sdk/personal_access_tokens/raw_client.py @@ -34,6 +34,7 @@ def list( *, limit: typing.Optional[int] = 100, offset: typing.Optional[int] = 0, + name_search_query: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None, ) -> SyncPager[VirtualAccount, ListPersonalAccessTokenResponse]: """ @@ -47,6 +48,9 @@ def list( offset : typing.Optional[int] Number of items to skip + name_search_query : typing.Optional[str] + Return personal access tokens with names that contain this string + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -63,6 +67,7 @@ def list( params={ "limit": limit, "offset": offset, + "nameSearchQuery": name_search_query, }, request_options=request_options, ) @@ -80,6 +85,7 @@ def list( _get_next = lambda: self.list( limit=limit, offset=offset + len(_items or []), + name_search_query=name_search_query, request_options=request_options, ) return SyncPager(has_next=_has_next, items=_items, get_next=_get_next, response=_parsed_response) @@ -335,6 +341,7 @@ async def list( *, limit: typing.Optional[int] = 100, offset: typing.Optional[int] = 0, + name_search_query: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None, ) -> AsyncPager[VirtualAccount, ListPersonalAccessTokenResponse]: """ @@ -348,6 +355,9 @@ async def list( offset : typing.Optional[int] Number of items to skip + name_search_query : typing.Optional[str] + Return personal access tokens with names that contain this string + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -364,6 +374,7 @@ async def list( params={ "limit": limit, "offset": offset, + "nameSearchQuery": name_search_query, }, request_options=request_options, ) @@ -383,6 +394,7 @@ async def _get_next(): return await self.list( limit=limit, offset=offset + len(_items or []), + name_search_query=name_search_query, request_options=request_options, ) diff --git a/src/truefoundry_sdk/prompt_versions/client.py b/src/truefoundry_sdk/prompt_versions/client.py index 8f28a448..f1a44543 100644 --- a/src/truefoundry_sdk/prompt_versions/client.py +++ b/src/truefoundry_sdk/prompt_versions/client.py @@ -39,13 +39,18 @@ def apply_tags( request_options: typing.Optional[RequestOptions] = None, ) -> EmptyResponse: """ + Apply tags to a prompt version. + Parameters ---------- prompt_version_id : str + ID of the prompt version to apply tags to tags : typing.Sequence[str] + List of tags to apply to the prompt version force : typing.Optional[bool] + Whether to overwrite existing tags if they conflict request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -53,7 +58,7 @@ def apply_tags( Returns ------- EmptyResponse - Successful Response + Empty response indicating successful tag application Examples -------- @@ -75,7 +80,7 @@ def apply_tags( def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> GetPromptVersionResponse: """ - Get prompt version API + Get a prompt version by its ID. Parameters ---------- @@ -87,7 +92,7 @@ def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = Non Returns ------- GetPromptVersionResponse - Successful Response + The prompt version data Examples -------- @@ -106,7 +111,7 @@ def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = Non def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> EmptyResponse: """ - Delete prompt versions API + Delete a prompt version by its ID. Parameters ---------- @@ -118,7 +123,7 @@ def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] = Returns ------- EmptyResponse - Successful Response + Empty response indicating successful deletion Examples -------- @@ -149,25 +154,33 @@ def list( request_options: typing.Optional[RequestOptions] = None, ) -> SyncPager[PromptVersion, ListPromptVersionsResponse]: """ - List prompt version API + List prompt versions with optional filtering by tag, FQN, prompt ID, ML Repo, name, or version. Parameters ---------- tag : typing.Optional[str] + Tag to filter prompt versions by fqn : typing.Optional[str] + Fully qualified name to filter prompt versions by (format: 'chat_prompt:{tenant_name}/{ml_repo_name}/{prompt_name}' or 'chat_prompt:{tenant_name}/{ml_repo_name}/{prompt_name}:{version}') prompt_id : typing.Optional[str] + ID of the prompt to filter versions by ml_repo_id : typing.Optional[str] + ID of the ML Repo to filter prompt versions by name : typing.Optional[str] + Name of the prompt to filter versions by version : typing.Optional[int] + Version number (positive integer) or 'latest' to filter by specific version offset : typing.Optional[int] + Number of prompt versions to skip for pagination limit : typing.Optional[int] + Maximum number of prompt versions to return request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -175,7 +188,7 @@ def list( Returns ------- SyncPager[PromptVersion, ListPromptVersionsResponse] - Successful Response + List of prompt versions matching the query with pagination information Examples -------- @@ -238,13 +251,18 @@ async def apply_tags( request_options: typing.Optional[RequestOptions] = None, ) -> EmptyResponse: """ + Apply tags to a prompt version. + Parameters ---------- prompt_version_id : str + ID of the prompt version to apply tags to tags : typing.Sequence[str] + List of tags to apply to the prompt version force : typing.Optional[bool] + Whether to overwrite existing tags if they conflict request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -252,7 +270,7 @@ async def apply_tags( Returns ------- EmptyResponse - Successful Response + Empty response indicating successful tag application Examples -------- @@ -284,7 +302,7 @@ async def get( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> GetPromptVersionResponse: """ - Get prompt version API + Get a prompt version by its ID. Parameters ---------- @@ -296,7 +314,7 @@ async def get( Returns ------- GetPromptVersionResponse - Successful Response + The prompt version data Examples -------- @@ -323,7 +341,7 @@ async def main() -> None: async def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> EmptyResponse: """ - Delete prompt versions API + Delete a prompt version by its ID. Parameters ---------- @@ -335,7 +353,7 @@ async def delete(self, id: str, *, request_options: typing.Optional[RequestOptio Returns ------- EmptyResponse - Successful Response + Empty response indicating successful deletion Examples -------- @@ -374,25 +392,33 @@ async def list( request_options: typing.Optional[RequestOptions] = None, ) -> AsyncPager[PromptVersion, ListPromptVersionsResponse]: """ - List prompt version API + List prompt versions with optional filtering by tag, FQN, prompt ID, ML Repo, name, or version. Parameters ---------- tag : typing.Optional[str] + Tag to filter prompt versions by fqn : typing.Optional[str] + Fully qualified name to filter prompt versions by (format: 'chat_prompt:{tenant_name}/{ml_repo_name}/{prompt_name}' or 'chat_prompt:{tenant_name}/{ml_repo_name}/{prompt_name}:{version}') prompt_id : typing.Optional[str] + ID of the prompt to filter versions by ml_repo_id : typing.Optional[str] + ID of the ML Repo to filter prompt versions by name : typing.Optional[str] + Name of the prompt to filter versions by version : typing.Optional[int] + Version number (positive integer) or 'latest' to filter by specific version offset : typing.Optional[int] + Number of prompt versions to skip for pagination limit : typing.Optional[int] + Maximum number of prompt versions to return request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -400,7 +426,7 @@ async def list( Returns ------- AsyncPager[PromptVersion, ListPromptVersionsResponse] - Successful Response + List of prompt versions matching the query with pagination information Examples -------- diff --git a/src/truefoundry_sdk/prompt_versions/raw_client.py b/src/truefoundry_sdk/prompt_versions/raw_client.py index 41606c88..b3ea68a7 100644 --- a/src/truefoundry_sdk/prompt_versions/raw_client.py +++ b/src/truefoundry_sdk/prompt_versions/raw_client.py @@ -33,13 +33,18 @@ def apply_tags( request_options: typing.Optional[RequestOptions] = None, ) -> HttpResponse[EmptyResponse]: """ + Apply tags to a prompt version. + Parameters ---------- prompt_version_id : str + ID of the prompt version to apply tags to tags : typing.Sequence[str] + List of tags to apply to the prompt version force : typing.Optional[bool] + Whether to overwrite existing tags if they conflict request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -47,7 +52,7 @@ def apply_tags( Returns ------- HttpResponse[EmptyResponse] - Successful Response + Empty response indicating successful tag application """ _response = self._client_wrapper.httpx_client.request( "api/ml/v1/prompt-versions/tags", @@ -93,7 +98,7 @@ def get( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> HttpResponse[GetPromptVersionResponse]: """ - Get prompt version API + Get a prompt version by its ID. Parameters ---------- @@ -105,7 +110,7 @@ def get( Returns ------- HttpResponse[GetPromptVersionResponse] - Successful Response + The prompt version data """ _response = self._client_wrapper.httpx_client.request( f"api/ml/v1/prompt-versions/{jsonable_encoder(id)}", @@ -142,7 +147,7 @@ def delete( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> HttpResponse[EmptyResponse]: """ - Delete prompt versions API + Delete a prompt version by its ID. Parameters ---------- @@ -154,7 +159,7 @@ def delete( Returns ------- HttpResponse[EmptyResponse] - Successful Response + Empty response indicating successful deletion """ _response = self._client_wrapper.httpx_client.request( f"api/ml/v1/prompt-versions/{jsonable_encoder(id)}", @@ -201,25 +206,33 @@ def list( request_options: typing.Optional[RequestOptions] = None, ) -> SyncPager[PromptVersion, ListPromptVersionsResponse]: """ - List prompt version API + List prompt versions with optional filtering by tag, FQN, prompt ID, ML Repo, name, or version. Parameters ---------- tag : typing.Optional[str] + Tag to filter prompt versions by fqn : typing.Optional[str] + Fully qualified name to filter prompt versions by (format: 'chat_prompt:{tenant_name}/{ml_repo_name}/{prompt_name}' or 'chat_prompt:{tenant_name}/{ml_repo_name}/{prompt_name}:{version}') prompt_id : typing.Optional[str] + ID of the prompt to filter versions by ml_repo_id : typing.Optional[str] + ID of the ML Repo to filter prompt versions by name : typing.Optional[str] + Name of the prompt to filter versions by version : typing.Optional[int] + Version number (positive integer) or 'latest' to filter by specific version offset : typing.Optional[int] + Number of prompt versions to skip for pagination limit : typing.Optional[int] + Maximum number of prompt versions to return request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -227,7 +240,7 @@ def list( Returns ------- SyncPager[PromptVersion, ListPromptVersionsResponse] - Successful Response + List of prompt versions matching the query with pagination information """ offset = offset if offset is not None else 0 @@ -299,13 +312,18 @@ async def apply_tags( request_options: typing.Optional[RequestOptions] = None, ) -> AsyncHttpResponse[EmptyResponse]: """ + Apply tags to a prompt version. + Parameters ---------- prompt_version_id : str + ID of the prompt version to apply tags to tags : typing.Sequence[str] + List of tags to apply to the prompt version force : typing.Optional[bool] + Whether to overwrite existing tags if they conflict request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -313,7 +331,7 @@ async def apply_tags( Returns ------- AsyncHttpResponse[EmptyResponse] - Successful Response + Empty response indicating successful tag application """ _response = await self._client_wrapper.httpx_client.request( "api/ml/v1/prompt-versions/tags", @@ -359,7 +377,7 @@ async def get( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> AsyncHttpResponse[GetPromptVersionResponse]: """ - Get prompt version API + Get a prompt version by its ID. Parameters ---------- @@ -371,7 +389,7 @@ async def get( Returns ------- AsyncHttpResponse[GetPromptVersionResponse] - Successful Response + The prompt version data """ _response = await self._client_wrapper.httpx_client.request( f"api/ml/v1/prompt-versions/{jsonable_encoder(id)}", @@ -408,7 +426,7 @@ async def delete( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> AsyncHttpResponse[EmptyResponse]: """ - Delete prompt versions API + Delete a prompt version by its ID. Parameters ---------- @@ -420,7 +438,7 @@ async def delete( Returns ------- AsyncHttpResponse[EmptyResponse] - Successful Response + Empty response indicating successful deletion """ _response = await self._client_wrapper.httpx_client.request( f"api/ml/v1/prompt-versions/{jsonable_encoder(id)}", @@ -467,25 +485,33 @@ async def list( request_options: typing.Optional[RequestOptions] = None, ) -> AsyncPager[PromptVersion, ListPromptVersionsResponse]: """ - List prompt version API + List prompt versions with optional filtering by tag, FQN, prompt ID, ML Repo, name, or version. Parameters ---------- tag : typing.Optional[str] + Tag to filter prompt versions by fqn : typing.Optional[str] + Fully qualified name to filter prompt versions by (format: 'chat_prompt:{tenant_name}/{ml_repo_name}/{prompt_name}' or 'chat_prompt:{tenant_name}/{ml_repo_name}/{prompt_name}:{version}') prompt_id : typing.Optional[str] + ID of the prompt to filter versions by ml_repo_id : typing.Optional[str] + ID of the ML Repo to filter prompt versions by name : typing.Optional[str] + Name of the prompt to filter versions by version : typing.Optional[int] + Version number (positive integer) or 'latest' to filter by specific version offset : typing.Optional[int] + Number of prompt versions to skip for pagination limit : typing.Optional[int] + Maximum number of prompt versions to return request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -493,7 +519,7 @@ async def list( Returns ------- AsyncPager[PromptVersion, ListPromptVersionsResponse] - Successful Response + List of prompt versions matching the query with pagination information """ offset = offset if offset is not None else 0 diff --git a/src/truefoundry_sdk/prompts/client.py b/src/truefoundry_sdk/prompts/client.py index 5df81f3e..c87ac14b 100644 --- a/src/truefoundry_sdk/prompts/client.py +++ b/src/truefoundry_sdk/prompts/client.py @@ -34,6 +34,8 @@ def with_raw_response(self) -> RawPromptsClient: def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> GetPromptResponse: """ + Get a prompt by its ID. + Parameters ---------- id : str @@ -44,7 +46,7 @@ def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = Non Returns ------- GetPromptResponse - Successful Response + The prompt data Examples -------- @@ -63,6 +65,8 @@ def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = Non def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> EmptyResponse: """ + Delete a prompt by its ID. + Parameters ---------- id : str @@ -73,7 +77,7 @@ def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] = Returns ------- EmptyResponse - Successful Response + Empty response indicating successful deletion Examples -------- @@ -102,19 +106,27 @@ def list( request_options: typing.Optional[RequestOptions] = None, ) -> SyncPager[Prompt, ListPromptsResponse]: """ + List prompts with optional filtering by FQN, ML Repo, or name. + Parameters ---------- fqn : typing.Optional[str] + Fully qualified name to filter prompts by (format: 'chat_prompt:{tenant_name}/{ml_repo_name}/{prompt_name}') ml_repo_id : typing.Optional[str] + ID of the ML Repo to filter prompts by name : typing.Optional[str] + Name of the prompt to filter by offset : typing.Optional[int] + Number of prompts to skip for pagination limit : typing.Optional[int] + Maximum number of prompts to return include_empty_prompts : typing.Optional[bool] + Whether to include prompts that have no versions request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -122,7 +134,7 @@ def list( Returns ------- SyncPager[Prompt, ListPromptsResponse] - Successful Response + List of prompts matching the query with pagination information Examples -------- @@ -160,9 +172,12 @@ def create_or_update( self, *, manifest: ChatPromptManifest, request_options: typing.Optional[RequestOptions] = None ) -> GetPromptVersionResponse: """ + Create or update a prompt version. + Parameters ---------- manifest : ChatPromptManifest + Manifest containing metadata for the prompt to apply request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -170,7 +185,7 @@ def create_or_update( Returns ------- GetPromptVersionResponse - Successful Response + The created or updated prompt version Examples -------- @@ -214,6 +229,8 @@ def with_raw_response(self) -> AsyncRawPromptsClient: async def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> GetPromptResponse: """ + Get a prompt by its ID. + Parameters ---------- id : str @@ -224,7 +241,7 @@ async def get(self, id: str, *, request_options: typing.Optional[RequestOptions] Returns ------- GetPromptResponse - Successful Response + The prompt data Examples -------- @@ -251,6 +268,8 @@ async def main() -> None: async def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> EmptyResponse: """ + Delete a prompt by its ID. + Parameters ---------- id : str @@ -261,7 +280,7 @@ async def delete(self, id: str, *, request_options: typing.Optional[RequestOptio Returns ------- EmptyResponse - Successful Response + Empty response indicating successful deletion Examples -------- @@ -298,19 +317,27 @@ async def list( request_options: typing.Optional[RequestOptions] = None, ) -> AsyncPager[Prompt, ListPromptsResponse]: """ + List prompts with optional filtering by FQN, ML Repo, or name. + Parameters ---------- fqn : typing.Optional[str] + Fully qualified name to filter prompts by (format: 'chat_prompt:{tenant_name}/{ml_repo_name}/{prompt_name}') ml_repo_id : typing.Optional[str] + ID of the ML Repo to filter prompts by name : typing.Optional[str] + Name of the prompt to filter by offset : typing.Optional[int] + Number of prompts to skip for pagination limit : typing.Optional[int] + Maximum number of prompts to return include_empty_prompts : typing.Optional[bool] + Whether to include prompts that have no versions request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -318,7 +345,7 @@ async def list( Returns ------- AsyncPager[Prompt, ListPromptsResponse] - Successful Response + List of prompts matching the query with pagination information Examples -------- @@ -365,9 +392,12 @@ async def create_or_update( self, *, manifest: ChatPromptManifest, request_options: typing.Optional[RequestOptions] = None ) -> GetPromptVersionResponse: """ + Create or update a prompt version. + Parameters ---------- manifest : ChatPromptManifest + Manifest containing metadata for the prompt to apply request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -375,7 +405,7 @@ async def create_or_update( Returns ------- GetPromptVersionResponse - Successful Response + The created or updated prompt version Examples -------- diff --git a/src/truefoundry_sdk/prompts/raw_client.py b/src/truefoundry_sdk/prompts/raw_client.py index eabef155..5dce0cd9 100644 --- a/src/truefoundry_sdk/prompts/raw_client.py +++ b/src/truefoundry_sdk/prompts/raw_client.py @@ -31,6 +31,8 @@ def get( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> HttpResponse[GetPromptResponse]: """ + Get a prompt by its ID. + Parameters ---------- id : str @@ -41,7 +43,7 @@ def get( Returns ------- HttpResponse[GetPromptResponse] - Successful Response + The prompt data """ _response = self._client_wrapper.httpx_client.request( f"api/ml/v1/prompts/{jsonable_encoder(id)}", @@ -78,6 +80,8 @@ def delete( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> HttpResponse[EmptyResponse]: """ + Delete a prompt by its ID. + Parameters ---------- id : str @@ -88,7 +92,7 @@ def delete( Returns ------- HttpResponse[EmptyResponse] - Successful Response + Empty response indicating successful deletion """ _response = self._client_wrapper.httpx_client.request( f"api/ml/v1/prompts/{jsonable_encoder(id)}", @@ -133,19 +137,27 @@ def list( request_options: typing.Optional[RequestOptions] = None, ) -> SyncPager[Prompt, ListPromptsResponse]: """ + List prompts with optional filtering by FQN, ML Repo, or name. + Parameters ---------- fqn : typing.Optional[str] + Fully qualified name to filter prompts by (format: 'chat_prompt:{tenant_name}/{ml_repo_name}/{prompt_name}') ml_repo_id : typing.Optional[str] + ID of the ML Repo to filter prompts by name : typing.Optional[str] + Name of the prompt to filter by offset : typing.Optional[int] + Number of prompts to skip for pagination limit : typing.Optional[int] + Maximum number of prompts to return include_empty_prompts : typing.Optional[bool] + Whether to include prompts that have no versions request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -153,7 +165,7 @@ def list( Returns ------- SyncPager[Prompt, ListPromptsResponse] - Successful Response + List of prompts matching the query with pagination information """ offset = offset if offset is not None else 0 @@ -211,9 +223,12 @@ def create_or_update( self, *, manifest: ChatPromptManifest, request_options: typing.Optional[RequestOptions] = None ) -> HttpResponse[GetPromptVersionResponse]: """ + Create or update a prompt version. + Parameters ---------- manifest : ChatPromptManifest + Manifest containing metadata for the prompt to apply request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -221,7 +236,7 @@ def create_or_update( Returns ------- HttpResponse[GetPromptVersionResponse] - Successful Response + The created or updated prompt version """ _response = self._client_wrapper.httpx_client.request( "api/ml/v1/prompt-versions", @@ -272,6 +287,8 @@ async def get( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> AsyncHttpResponse[GetPromptResponse]: """ + Get a prompt by its ID. + Parameters ---------- id : str @@ -282,7 +299,7 @@ async def get( Returns ------- AsyncHttpResponse[GetPromptResponse] - Successful Response + The prompt data """ _response = await self._client_wrapper.httpx_client.request( f"api/ml/v1/prompts/{jsonable_encoder(id)}", @@ -319,6 +336,8 @@ async def delete( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> AsyncHttpResponse[EmptyResponse]: """ + Delete a prompt by its ID. + Parameters ---------- id : str @@ -329,7 +348,7 @@ async def delete( Returns ------- AsyncHttpResponse[EmptyResponse] - Successful Response + Empty response indicating successful deletion """ _response = await self._client_wrapper.httpx_client.request( f"api/ml/v1/prompts/{jsonable_encoder(id)}", @@ -374,19 +393,27 @@ async def list( request_options: typing.Optional[RequestOptions] = None, ) -> AsyncPager[Prompt, ListPromptsResponse]: """ + List prompts with optional filtering by FQN, ML Repo, or name. + Parameters ---------- fqn : typing.Optional[str] + Fully qualified name to filter prompts by (format: 'chat_prompt:{tenant_name}/{ml_repo_name}/{prompt_name}') ml_repo_id : typing.Optional[str] + ID of the ML Repo to filter prompts by name : typing.Optional[str] + Name of the prompt to filter by offset : typing.Optional[int] + Number of prompts to skip for pagination limit : typing.Optional[int] + Maximum number of prompts to return include_empty_prompts : typing.Optional[bool] + Whether to include prompts that have no versions request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -394,7 +421,7 @@ async def list( Returns ------- AsyncPager[Prompt, ListPromptsResponse] - Successful Response + List of prompts matching the query with pagination information """ offset = offset if offset is not None else 0 @@ -455,9 +482,12 @@ async def create_or_update( self, *, manifest: ChatPromptManifest, request_options: typing.Optional[RequestOptions] = None ) -> AsyncHttpResponse[GetPromptVersionResponse]: """ + Create or update a prompt version. + Parameters ---------- manifest : ChatPromptManifest + Manifest containing metadata for the prompt to apply request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -465,7 +495,7 @@ async def create_or_update( Returns ------- AsyncHttpResponse[GetPromptVersionResponse] - Successful Response + The created or updated prompt version """ _response = await self._client_wrapper.httpx_client.request( "api/ml/v1/prompt-versions", diff --git a/src/truefoundry_sdk/secret_groups/client.py b/src/truefoundry_sdk/secret_groups/client.py index bcb0cb85..ec363496 100644 --- a/src/truefoundry_sdk/secret_groups/client.py +++ b/src/truefoundry_sdk/secret_groups/client.py @@ -146,7 +146,11 @@ def create( return _response.data def create_or_update( - self, *, manifest: SecretGroupManifest, request_options: typing.Optional[RequestOptions] = None + self, + *, + manifest: SecretGroupManifest, + dry_run: typing.Optional[bool] = False, + request_options: typing.Optional[RequestOptions] = None, ) -> GetSecretGroupResponse: """ Creates a new secret group or updates an existing one based on the provided manifest. @@ -156,6 +160,9 @@ def create_or_update( manifest : SecretGroupManifest Secret Group Manifest + dry_run : typing.Optional[bool] + Validate the manifest and collaborators without persisting or updating authorizations and secret groups + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -185,7 +192,9 @@ def create_or_update( ), ) """ - _response = self._raw_client.create_or_update(manifest=manifest, request_options=request_options) + _response = self._raw_client.create_or_update( + manifest=manifest, dry_run=dry_run, request_options=request_options + ) return _response.data def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> GetSecretGroupResponse: @@ -443,7 +452,11 @@ async def main() -> None: return _response.data async def create_or_update( - self, *, manifest: SecretGroupManifest, request_options: typing.Optional[RequestOptions] = None + self, + *, + manifest: SecretGroupManifest, + dry_run: typing.Optional[bool] = False, + request_options: typing.Optional[RequestOptions] = None, ) -> GetSecretGroupResponse: """ Creates a new secret group or updates an existing one based on the provided manifest. @@ -453,6 +466,9 @@ async def create_or_update( manifest : SecretGroupManifest Secret Group Manifest + dry_run : typing.Optional[bool] + Validate the manifest and collaborators without persisting or updating authorizations and secret groups + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -490,7 +506,9 @@ async def main() -> None: asyncio.run(main()) """ - _response = await self._raw_client.create_or_update(manifest=manifest, request_options=request_options) + _response = await self._raw_client.create_or_update( + manifest=manifest, dry_run=dry_run, request_options=request_options + ) return _response.data async def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> GetSecretGroupResponse: diff --git a/src/truefoundry_sdk/secret_groups/raw_client.py b/src/truefoundry_sdk/secret_groups/raw_client.py index 6b0b2b22..463af059 100644 --- a/src/truefoundry_sdk/secret_groups/raw_client.py +++ b/src/truefoundry_sdk/secret_groups/raw_client.py @@ -189,7 +189,11 @@ def create( raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) def create_or_update( - self, *, manifest: SecretGroupManifest, request_options: typing.Optional[RequestOptions] = None + self, + *, + manifest: SecretGroupManifest, + dry_run: typing.Optional[bool] = False, + request_options: typing.Optional[RequestOptions] = None, ) -> HttpResponse[GetSecretGroupResponse]: """ Creates a new secret group or updates an existing one based on the provided manifest. @@ -199,6 +203,9 @@ def create_or_update( manifest : SecretGroupManifest Secret Group Manifest + dry_run : typing.Optional[bool] + Validate the manifest and collaborators without persisting or updating authorizations and secret groups + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -214,6 +221,7 @@ def create_or_update( "manifest": convert_and_respect_annotation_metadata( object_=manifest, annotation=SecretGroupManifest, direction="write" ), + "dryRun": dry_run, }, headers={ "content-type": "application/json", @@ -674,7 +682,11 @@ async def create( raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) async def create_or_update( - self, *, manifest: SecretGroupManifest, request_options: typing.Optional[RequestOptions] = None + self, + *, + manifest: SecretGroupManifest, + dry_run: typing.Optional[bool] = False, + request_options: typing.Optional[RequestOptions] = None, ) -> AsyncHttpResponse[GetSecretGroupResponse]: """ Creates a new secret group or updates an existing one based on the provided manifest. @@ -684,6 +696,9 @@ async def create_or_update( manifest : SecretGroupManifest Secret Group Manifest + dry_run : typing.Optional[bool] + Validate the manifest and collaborators without persisting or updating authorizations and secret groups + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -699,6 +714,7 @@ async def create_or_update( "manifest": convert_and_respect_annotation_metadata( object_=manifest, annotation=SecretGroupManifest, direction="write" ), + "dryRun": dry_run, }, headers={ "content-type": "application/json", diff --git a/src/truefoundry_sdk/teams/client.py b/src/truefoundry_sdk/teams/client.py index 62c40096..ac9092e9 100644 --- a/src/truefoundry_sdk/teams/client.py +++ b/src/truefoundry_sdk/teams/client.py @@ -6,6 +6,7 @@ from ..core.pagination import AsyncPager, SyncPager from ..core.request_options import RequestOptions from ..types.delete_team_response import DeleteTeamResponse +from ..types.get_team_permissions_response import GetTeamPermissionsResponse from ..types.get_team_response import GetTeamResponse from ..types.list_teams_response import ListTeamsResponse from ..types.team import Team @@ -194,6 +195,40 @@ def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] = _response = self._raw_client.delete(id, request_options=request_options) return _response.data + def get_permissions( + self, id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> GetTeamPermissionsResponse: + """ + Get all role bindings associated with a team. + + Parameters + ---------- + id : str + Team Id + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + GetTeamPermissionsResponse + Returns role bindings for the team. + + Examples + -------- + from truefoundry_sdk import TrueFoundry + + client = TrueFoundry( + api_key="YOUR_API_KEY", + base_url="https://yourhost.com/path/to/api", + ) + client.teams.get_permissions( + id="id", + ) + """ + _response = self._raw_client.get_permissions(id, request_options=request_options) + return _response.data + class AsyncTeamsClient: def __init__(self, *, client_wrapper: AsyncClientWrapper): @@ -404,3 +439,45 @@ async def main() -> None: """ _response = await self._raw_client.delete(id, request_options=request_options) return _response.data + + async def get_permissions( + self, id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> GetTeamPermissionsResponse: + """ + Get all role bindings associated with a team. + + Parameters + ---------- + id : str + Team Id + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + GetTeamPermissionsResponse + Returns role bindings for the team. + + Examples + -------- + import asyncio + + from truefoundry_sdk import AsyncTrueFoundry + + client = AsyncTrueFoundry( + api_key="YOUR_API_KEY", + base_url="https://yourhost.com/path/to/api", + ) + + + async def main() -> None: + await client.teams.get_permissions( + id="id", + ) + + + asyncio.run(main()) + """ + _response = await self._raw_client.get_permissions(id, request_options=request_options) + return _response.data diff --git a/src/truefoundry_sdk/teams/raw_client.py b/src/truefoundry_sdk/teams/raw_client.py index 590549ff..2f32a8a8 100644 --- a/src/truefoundry_sdk/teams/raw_client.py +++ b/src/truefoundry_sdk/teams/raw_client.py @@ -12,9 +12,11 @@ from ..core.request_options import RequestOptions from ..core.serialization import convert_and_respect_annotation_metadata from ..errors.conflict_error import ConflictError +from ..errors.forbidden_error import ForbiddenError from ..errors.not_found_error import NotFoundError from ..errors.unprocessable_entity_error import UnprocessableEntityError from ..types.delete_team_response import DeleteTeamResponse +from ..types.get_team_permissions_response import GetTeamPermissionsResponse from ..types.get_team_response import GetTeamResponse from ..types.http_error import HttpError from ..types.list_teams_response import ListTeamsResponse @@ -282,6 +284,67 @@ def delete( raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + def get_permissions( + self, id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> HttpResponse[GetTeamPermissionsResponse]: + """ + Get all role bindings associated with a team. + + Parameters + ---------- + id : str + Team Id + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + HttpResponse[GetTeamPermissionsResponse] + Returns role bindings for the team. + """ + _response = self._client_wrapper.httpx_client.request( + f"api/svc/v1/teams/{jsonable_encoder(id)}/permissions", + method="GET", + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + GetTeamPermissionsResponse, + parse_obj_as( + type_=GetTeamPermissionsResponse, # type: ignore + object_=_response.json(), + ), + ) + return HttpResponse(response=_response, data=_data) + if _response.status_code == 403: + raise ForbiddenError( + headers=dict(_response.headers), + body=typing.cast( + HttpError, + parse_obj_as( + type_=HttpError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + class AsyncRawTeamsClient: def __init__(self, *, client_wrapper: AsyncClientWrapper): @@ -543,3 +606,64 @@ async def delete( except JSONDecodeError: raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + + async def get_permissions( + self, id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> AsyncHttpResponse[GetTeamPermissionsResponse]: + """ + Get all role bindings associated with a team. + + Parameters + ---------- + id : str + Team Id + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AsyncHttpResponse[GetTeamPermissionsResponse] + Returns role bindings for the team. + """ + _response = await self._client_wrapper.httpx_client.request( + f"api/svc/v1/teams/{jsonable_encoder(id)}/permissions", + method="GET", + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + GetTeamPermissionsResponse, + parse_obj_as( + type_=GetTeamPermissionsResponse, # type: ignore + object_=_response.json(), + ), + ) + return AsyncHttpResponse(response=_response, data=_data) + if _response.status_code == 403: + raise ForbiddenError( + headers=dict(_response.headers), + body=typing.cast( + HttpError, + parse_obj_as( + type_=HttpError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) diff --git a/src/truefoundry_sdk/types/__init__.py b/src/truefoundry_sdk/types/__init__.py index d50bd68b..502302e3 100644 --- a/src/truefoundry_sdk/types/__init__.py +++ b/src/truefoundry_sdk/types/__init__.py @@ -9,6 +9,7 @@ from .resources import Resources from .resources_devices_item import ResourcesDevicesItem from .resources_node import ResourcesNode + from .a2a_framework import A2AFramework from .account import Account from .account_info import AccountInfo from .activate_user_response import ActivateUserResponse @@ -16,14 +17,23 @@ from .addon_component import AddonComponent from .addon_component_name import AddonComponentName from .addon_component_status import AddonComponentStatus + from .agent_framework import AgentFramework from .agent_manifest import AgentManifest from .agent_skill import AgentSkill + from .agent_skill_manifest import AgentSkillManifest + from .agent_skill_manifest_source import AgentSkillManifestSource + from .agent_skill_source_blob_storage import AgentSkillSourceBlobStorage + from .agent_skill_source_inline import AgentSkillSourceInline + from .agent_skill_version import AgentSkillVersion from .agent_source import AgentSource from .ai21integrations import Ai21Integrations from .ai21key_auth import Ai21KeyAuth from .ai21model import Ai21Model from .ai21provider_account import Ai21ProviderAccount from .ai_features_settings import AiFeaturesSettings + from .akto_guardrail_config import AktoGuardrailConfig + from .akto_guardrail_config_config import AktoGuardrailConfigConfig + from .akto_token_auth import AktoTokenAuth from .alert import Alert from .alert_config import AlertConfig from .alert_config_resource import AlertConfigResource @@ -116,7 +126,6 @@ from .azure_o_auth import AzureOAuth from .azure_open_ai_model import AzureOpenAiModel from .azure_open_ai_model_deployment_type import AzureOpenAiModelDeploymentType - from .azure_open_ai_model_region import AzureOpenAiModelRegion from .azure_open_ai_provider_account import AzureOpenAiProviderAccount from .azure_open_ai_provider_account_auth_data import AzureOpenAiProviderAccountAuthData from .azure_pii_category import AzurePiiCategory @@ -136,11 +145,16 @@ from .base_autoscaling import BaseAutoscaling from .base_o_auth2login import BaseOAuth2Login from .base_o_auth2login_jwt_source import BaseOAuth2LoginJwtSource + from .base_remote_agent import BaseRemoteAgent from .base_service import BaseService from .base_service_image import BaseServiceImage from .base_service_mounts_item import BaseServiceMountsItem from .base_workbench_input import BaseWorkbenchInput from .base_workbench_input_mounts_item import BaseWorkbenchInputMountsItem + from .baseten_integrations import BasetenIntegrations + from .baseten_key_auth import BasetenKeyAuth + from .baseten_model import BasetenModel + from .baseten_provider_account import BasetenProviderAccount from .basic_auth_creds import BasicAuthCreds from .bedrock_model import BedrockModel from .bitbucket_integration import BitbucketIntegration @@ -205,22 +219,33 @@ from .container_task_config_mounts_item import ContainerTaskConfigMountsItem from .core_nats_output_config import CoreNatsOutputConfig from .cpu_utilization_metric import CpuUtilizationMetric + from .create_docker_repository_response import CreateDockerRepositoryResponse from .create_multi_part_upload_request import CreateMultiPartUploadRequest from .create_personal_access_token_response import CreatePersonalAccessTokenResponse from .cron_metric import CronMetric + from .custom_agent_server_auth import CustomAgentServerAuth from .custom_basic_auth import CustomBasicAuth from .custom_bearer_auth import CustomBearerAuth from .custom_blob_storage import CustomBlobStorage + from .custom_endpoint import CustomEndpoint + from .custom_endpoint_auth_data import CustomEndpointAuthData + from .custom_endpoint_integrations import CustomEndpointIntegrations + from .custom_endpoint_provider_account import CustomEndpointProviderAccount + from .custom_endpoint_provider_account_auth_data import CustomEndpointProviderAccountAuthData + from .custom_framework import CustomFramework from .custom_guardrail_config import CustomGuardrailConfig from .custom_guardrail_config_auth_data import CustomGuardrailConfigAuthData from .custom_guardrail_config_config import CustomGuardrailConfigConfig from .custom_guardrail_config_operation import CustomGuardrailConfigOperation from .custom_guardrail_config_target import CustomGuardrailConfigTarget + from .custom_header_auth import CustomHeaderAuth from .custom_helm_repo import CustomHelmRepo from .custom_integrations import CustomIntegrations from .custom_jwt_auth_integration import CustomJwtAuthIntegration from .custom_provider_account import CustomProviderAccount from .custom_regex_pattern import CustomRegexPattern + from .custom_server_header_auth import CustomServerHeaderAuth + from .custom_server_passthrough import CustomServerPassthrough from .custom_tls_settings import CustomTlsSettings from .custom_username_password_artifacts_registry import CustomUsernamePasswordArtifactsRegistry from .data_access_rule import DataAccessRule @@ -230,6 +255,8 @@ from .data_directory_manifest_source import DataDirectoryManifestSource from .databricks_api_key_auth import DatabricksApiKeyAuth from .databricks_integrations import DatabricksIntegrations + from .databricks_job_task_config import DatabricksJobTaskConfig + from .databricks_job_task_config_image import DatabricksJobTaskConfigImage from .databricks_model import DatabricksModel from .databricks_provider_account import DatabricksProviderAccount from .databricks_provider_account_auth_data import DatabricksProviderAccountAuthData @@ -341,6 +368,7 @@ from .gateway_metadata_rule import GatewayMetadataRule from .gateway_metadata_when import GatewayMetadataWhen from .gateway_otel_config import GatewayOtelConfig + from .gateway_otel_config_otel_metrics_exporter_config import GatewayOtelConfigOtelMetricsExporterConfig from .gateway_otel_config_otel_traces_exporter_config import GatewayOtelConfigOtelTracesExporterConfig from .gateway_request_metadata_filter import GatewayRequestMetadataFilter from .gateway_request_metadata_filter_operator import GatewayRequestMetadataFilterOperator @@ -357,6 +385,9 @@ from .gcp_region import GcpRegion from .gcp_tpu import GcpTpu from .gemini_model import GeminiModel + from .generic_secret_store_integration import GenericSecretStoreIntegration + from .get_agent_skill_response import GetAgentSkillResponse + from .get_agent_skill_version_response import GetAgentSkillVersionResponse from .get_alerts_response import GetAlertsResponse from .get_application_deployment_response import GetApplicationDeploymentResponse from .get_application_response import GetApplicationResponse @@ -367,6 +398,7 @@ from .get_charts_response import GetChartsResponse from .get_cluster_response import GetClusterResponse from .get_data_directory_response import GetDataDirectoryResponse + from .get_docker_registry_credentials_response import GetDockerRegistryCredentialsResponse from .get_environment_response import GetEnvironmentResponse from .get_events_response import GetEventsResponse from .get_job_run_response import GetJobRunResponse @@ -382,8 +414,10 @@ from .get_signed_ur_ls_request import GetSignedUrLsRequest from .get_signed_ur_ls_response import GetSignedUrLsResponse from .get_suggested_deployment_endpoint_response import GetSuggestedDeploymentEndpointResponse + from .get_team_permissions_response import GetTeamPermissionsResponse from .get_team_response import GetTeamResponse from .get_token_for_virtual_account_response import GetTokenForVirtualAccountResponse + from .get_user_permissions_response import GetUserPermissionsResponse from .get_user_resources_response import GetUserResourcesResponse from .get_user_response import GetUserResponse from .get_user_teams_response import GetUserTeamsResponse @@ -403,6 +437,7 @@ from .google_model_armor_guardrail_config import GoogleModelArmorGuardrailConfig from .google_model_armor_guardrail_config_auth_data import GoogleModelArmorGuardrailConfigAuthData from .google_model_armor_guardrail_config_config import GoogleModelArmorGuardrailConfigConfig + from .google_model_armor_guardrail_config_operation import GoogleModelArmorGuardrailConfigOperation from .google_model_armor_key_file_auth import GoogleModelArmorKeyFileAuth from .google_model_armor_key_file_auth_key_file_content import GoogleModelArmorKeyFileAuthKeyFileContent from .google_vertex_provider_account import GoogleVertexProviderAccount @@ -425,12 +460,15 @@ from .guardrails_rule import GuardrailsRule from .guardrails_when import GuardrailsWhen from .h2o_framework import H2OFramework + from .hashicorp_app_role_auth import HashicorpAppRoleAuth from .hashicorp_integrations import HashicorpIntegrations from .hashicorp_provider_account import HashicorpProviderAccount from .hashicorp_token_auth import HashicorpTokenAuth from .hashicorp_vault_integration import HashicorpVaultIntegration + from .hashicorp_vault_integration_auth_data import HashicorpVaultIntegrationAuthData from .header_match import HeaderMatch from .header_routing_config import HeaderRoutingConfig + from .headers_override import HeadersOverride from .health_probe import HealthProbe from .helm import Helm from .helm_repo import HelmRepo @@ -494,8 +532,11 @@ from .latency_based_load_balance_target import LatencyBasedLoadBalanceTarget from .latency_based_load_balancing import LatencyBasedLoadBalancing from .latency_based_load_balancing_rule import LatencyBasedLoadBalancingRule + from .legacy_agent_manifest import LegacyAgentManifest from .library_name import LibraryName from .light_gbm_framework import LightGbmFramework + from .list_agent_skill_versions_response import ListAgentSkillVersionsResponse + from .list_agent_skills_response import ListAgentSkillsResponse from .list_application_deployments_response import ListApplicationDeploymentsResponse from .list_applications_response import ListApplicationsResponse from .list_artifact_versions_response import ListArtifactVersionsResponse @@ -540,13 +581,17 @@ from .logs_sorting_direction import LogsSortingDirection from .manual import Manual from .mcp_server_auth import McpServerAuth + from .mcp_server_env_auth import McpServerEnvAuth + from .mcp_server_env_auth_auth_level import McpServerEnvAuthAuthLevel from .mcp_server_header_auth import McpServerHeaderAuth + from .mcp_server_header_auth_auth_level import McpServerHeaderAuthAuthLevel from .mcp_server_header_override_auth import McpServerHeaderOverrideAuth from .mcp_server_integration import McpServerIntegration from .mcp_server_integration_transport import McpServerIntegrationTransport from .mcp_server_integrations import McpServerIntegrations from .mcp_server_manifest import McpServerManifest from .mcp_server_o_auth2 import McpServerOAuth2 + from .mcp_server_o_auth2grant_type import McpServerOAuth2GrantType from .mcp_server_o_auth2jwt_source import McpServerOAuth2JwtSource from .mcp_server_passthrough import McpServerPassthrough from .mcp_server_provider_account import McpServerProviderAccount @@ -556,6 +601,9 @@ from .mcp_server_with_url import McpServerWithUrl from .mcp_tool import McpTool from .mcp_tool_setting import McpToolSetting + from .mcp_tool_target import McpToolTarget + from .mcp_tools_operator import McpToolsOperator + from .mcp_tools_operator_condition import McpToolsOperatorCondition from .metadata import Metadata from .metric import Metric from .mime_type import MimeType @@ -616,12 +664,6 @@ from .open_ai_model import OpenAiModel from .open_ai_moderations_guardrail_config import OpenAiModerationsGuardrailConfig from .open_ai_moderations_guardrail_config_config import OpenAiModerationsGuardrailConfigConfig - from .open_ai_moderations_guardrail_config_config_category_thresholds_value import ( - OpenAiModerationsGuardrailConfigConfigCategoryThresholdsValue, - ) - from .open_ai_moderations_guardrail_config_config_category_thresholds_value_harassment import ( - OpenAiModerationsGuardrailConfigConfigCategoryThresholdsValueHarassment, - ) from .open_api_spec_source import OpenApiSpecSource from .open_apimcp_server_manifest import OpenApimcpServerManifest from .open_apimcp_tool_setting import OpenApimcpToolSetting @@ -633,10 +675,15 @@ from .openai_api_key_auth import OpenaiApiKeyAuth from .openai_provider_account import OpenaiProviderAccount from .operation import Operation - from .otel_exporter_grpc_config import OtelExporterGrpcConfig - from .otel_exporter_http_config import OtelExporterHttpConfig - from .otel_exporter_http_config_encoding import OtelExporterHttpConfigEncoding - from .otel_exporter_span_attribute_filter import OtelExporterSpanAttributeFilter + from .otel_exporter_grpc_config_base import OtelExporterGrpcConfigBase + from .otel_exporter_http_config_base import OtelExporterHttpConfigBase + from .otel_exporter_http_config_base_encoding import OtelExporterHttpConfigBaseEncoding + from .otel_metrics_exporter_grpc_config import OtelMetricsExporterGrpcConfig + from .otel_metrics_exporter_http_config import OtelMetricsExporterHttpConfig + from .otel_traces_exporter_common_config import OtelTracesExporterCommonConfig + from .otel_traces_exporter_grpc_config import OtelTracesExporterGrpcConfig + from .otel_traces_exporter_http_config import OtelTracesExporterHttpConfig + from .otel_traces_exporter_span_attribute_filter import OtelTracesExporterSpanAttributeFilter from .own_data_access_rule import OwnDataAccessRule from .owned_by import OwnedBy from .paddle_framework import PaddleFramework @@ -711,10 +758,6 @@ from .private_pricing_tier import PrivatePricingTier from .prometheus_alert_rule import PrometheusAlertRule from .prompt import Prompt - from .prompt_foo_guard_type import PromptFooGuardType - from .prompt_foo_guardrail_config import PromptFooGuardrailConfig - from .prompt_foo_guardrail_config_config import PromptFooGuardrailConfigConfig - from .prompt_foo_guardrail_config_operation import PromptFooGuardrailConfigOperation from .prompt_source import PromptSource from .prompt_version import PromptVersion from .provider_accounts import ProviderAccounts @@ -743,16 +786,26 @@ from .regex_guardrail_config_config import RegexGuardrailConfigConfig from .regex_guardrail_config_operation import RegexGuardrailConfigOperation from .register_users_response import RegisterUsersResponse + from .remote_agent import RemoteAgent from .remote_mcp_server_manifest import RemoteMcpServerManifest from .remote_source import RemoteSource from .remote_spec_source import RemoteSpecSource + from .response_format_json_object import ResponseFormatJsonObject + from .response_format_json_schema import ResponseFormatJsonSchema + from .response_format_json_schema_json_schema import ResponseFormatJsonSchemaJsonSchema + from .response_format_text import ResponseFormatText from .retry_config import RetryConfig from .revoke_all_personal_access_token_response import RevokeAllPersonalAccessTokenResponse + from .role_binding_manifest import RoleBindingManifest + from .role_binding_permission import RoleBindingPermission + from .role_binding_subject import RoleBindingSubject + from .role_binding_subject_type import RoleBindingSubjectType from .role_manifest import RoleManifest from .role_with_resource import RoleWithResource from .role_with_resource_resource_type import RoleWithResourceResourceType from .rolling import Rolling from .rps_metric import RpsMetric + from .sagemaker_assumed_role_based_auth import SagemakerAssumedRoleBasedAuth from .sagemaker_model import SagemakerModel from .samba_nova_integrations import SambaNovaIntegrations from .samba_nova_key_auth import SambaNovaKeyAuth @@ -771,6 +824,7 @@ from .secret_mount import SecretMount from .secret_store_config import SecretStoreConfig from .secret_version import SecretVersion + from .self_hosted_agent import SelfHostedAgent from .self_hosted_model import SelfHostedModel from .self_hosted_model_auth_data import SelfHostedModelAuthData from .self_hosted_model_integrations import SelfHostedModelIntegrations @@ -844,12 +898,17 @@ from .stage_artifact_response import StageArtifactResponse from .static_volume_config import StaticVolumeConfig from .stats_models_framework import StatsModelsFramework + from .stdio_mcp_server_manifest import StdioMcpServerManifest + from .sticky_routing import StickyRouting + from .sticky_session_identifier import StickySessionIdentifier + from .sticky_session_identifier_source import StickySessionIdentifierSource from .string_data_mount import StringDataMount from .sub_agent import SubAgent from .subject import Subject from .subject_clause import SubjectClause from .subject_condition_group import SubjectConditionGroup from .subject_condition_group_operator import SubjectConditionGroupOperator + from .subject_permission import SubjectPermission from .subject_type import SubjectType from .sync_token_in_secret_store_info import SyncTokenInSecretStoreInfo from .sync_virtual_account_token_response import SyncVirtualAccountTokenResponse @@ -891,6 +950,22 @@ from .tracing_project_storage_config import TracingProjectStorageConfig from .transformers_framework import TransformersFramework from .trigger_job_run_response import TriggerJobRunResponse + from .troj_ai_client_id_auth import TrojAiClientIdAuth + from .troj_ai_guardrail_config import TrojAiGuardrailConfig + from .troj_ai_guardrail_config_config import TrojAiGuardrailConfigConfig + from .troj_ai_guardrail_config_operation import TrojAiGuardrailConfigOperation + from .true_foundry_agent_manifest import TrueFoundryAgentManifest + from .true_foundry_agent_manifest_model_params import TrueFoundryAgentManifestModelParams + from .true_foundry_agent_manifest_model_params_reasoning_effort import ( + TrueFoundryAgentManifestModelParamsReasoningEffort, + ) + from .true_foundry_agent_manifest_response_format import TrueFoundryAgentManifestResponseFormat + from .true_foundry_agent_manifest_sandbox import TrueFoundryAgentManifestSandbox + from .true_foundry_agent_mcp_server import TrueFoundryAgentMcpServer + from .true_foundry_agent_mcp_tool import TrueFoundryAgentMcpTool + from .true_foundry_agent_skill import TrueFoundryAgentSkill + from .true_foundry_agent_user_message import TrueFoundryAgentUserMessage + from .true_foundry_agent_variable import TrueFoundryAgentVariable from .true_foundry_apply_request_manifest import TrueFoundryApplyRequestManifest from .true_foundry_apply_response import TrueFoundryApplyResponse from .true_foundry_apply_response_action import TrueFoundryApplyResponseAction @@ -917,6 +992,7 @@ from .user_metadata import UserMetadata from .user_metadata_tenant_role_managed_by import UserMetadataTenantRoleManagedBy from .user_resource import UserResource + from .user_team_info import UserTeamInfo from .uv import Uv from .validation_error import ValidationError from .validation_error_loc_item import ValidationErrorLocItem @@ -961,6 +1037,7 @@ from .xg_boost_model_schema import XgBoostModelSchema from .xg_boost_serialization_format import XgBoostSerializationFormat _dynamic_imports: typing.Dict[str, str] = { + "A2AFramework": ".a2a_framework", "Account": ".account", "AccountInfo": ".account_info", "ActivateUserResponse": ".activate_user_response", @@ -968,14 +1045,23 @@ "AddonComponent": ".addon_component", "AddonComponentName": ".addon_component_name", "AddonComponentStatus": ".addon_component_status", + "AgentFramework": ".agent_framework", "AgentManifest": ".agent_manifest", "AgentSkill": ".agent_skill", + "AgentSkillManifest": ".agent_skill_manifest", + "AgentSkillManifestSource": ".agent_skill_manifest_source", + "AgentSkillSourceBlobStorage": ".agent_skill_source_blob_storage", + "AgentSkillSourceInline": ".agent_skill_source_inline", + "AgentSkillVersion": ".agent_skill_version", "AgentSource": ".agent_source", "Ai21Integrations": ".ai21integrations", "Ai21KeyAuth": ".ai21key_auth", "Ai21Model": ".ai21model", "Ai21ProviderAccount": ".ai21provider_account", "AiFeaturesSettings": ".ai_features_settings", + "AktoGuardrailConfig": ".akto_guardrail_config", + "AktoGuardrailConfigConfig": ".akto_guardrail_config_config", + "AktoTokenAuth": ".akto_token_auth", "Alert": ".alert", "AlertConfig": ".alert_config", "AlertConfigResource": ".alert_config_resource", @@ -1068,7 +1154,6 @@ "AzureOAuth": ".azure_o_auth", "AzureOpenAiModel": ".azure_open_ai_model", "AzureOpenAiModelDeploymentType": ".azure_open_ai_model_deployment_type", - "AzureOpenAiModelRegion": ".azure_open_ai_model_region", "AzureOpenAiProviderAccount": ".azure_open_ai_provider_account", "AzureOpenAiProviderAccountAuthData": ".azure_open_ai_provider_account_auth_data", "AzurePiiCategory": ".azure_pii_category", @@ -1088,11 +1173,16 @@ "BaseAutoscaling": ".base_autoscaling", "BaseOAuth2Login": ".base_o_auth2login", "BaseOAuth2LoginJwtSource": ".base_o_auth2login_jwt_source", + "BaseRemoteAgent": ".base_remote_agent", "BaseService": ".base_service", "BaseServiceImage": ".base_service_image", "BaseServiceMountsItem": ".base_service_mounts_item", "BaseWorkbenchInput": ".base_workbench_input", "BaseWorkbenchInputMountsItem": ".base_workbench_input_mounts_item", + "BasetenIntegrations": ".baseten_integrations", + "BasetenKeyAuth": ".baseten_key_auth", + "BasetenModel": ".baseten_model", + "BasetenProviderAccount": ".baseten_provider_account", "BasicAuthCreds": ".basic_auth_creds", "BedrockModel": ".bedrock_model", "BitbucketIntegration": ".bitbucket_integration", @@ -1157,22 +1247,33 @@ "ContainerTaskConfigMountsItem": ".container_task_config_mounts_item", "CoreNatsOutputConfig": ".core_nats_output_config", "CpuUtilizationMetric": ".cpu_utilization_metric", + "CreateDockerRepositoryResponse": ".create_docker_repository_response", "CreateMultiPartUploadRequest": ".create_multi_part_upload_request", "CreatePersonalAccessTokenResponse": ".create_personal_access_token_response", "CronMetric": ".cron_metric", + "CustomAgentServerAuth": ".custom_agent_server_auth", "CustomBasicAuth": ".custom_basic_auth", "CustomBearerAuth": ".custom_bearer_auth", "CustomBlobStorage": ".custom_blob_storage", + "CustomEndpoint": ".custom_endpoint", + "CustomEndpointAuthData": ".custom_endpoint_auth_data", + "CustomEndpointIntegrations": ".custom_endpoint_integrations", + "CustomEndpointProviderAccount": ".custom_endpoint_provider_account", + "CustomEndpointProviderAccountAuthData": ".custom_endpoint_provider_account_auth_data", + "CustomFramework": ".custom_framework", "CustomGuardrailConfig": ".custom_guardrail_config", "CustomGuardrailConfigAuthData": ".custom_guardrail_config_auth_data", "CustomGuardrailConfigConfig": ".custom_guardrail_config_config", "CustomGuardrailConfigOperation": ".custom_guardrail_config_operation", "CustomGuardrailConfigTarget": ".custom_guardrail_config_target", + "CustomHeaderAuth": ".custom_header_auth", "CustomHelmRepo": ".custom_helm_repo", "CustomIntegrations": ".custom_integrations", "CustomJwtAuthIntegration": ".custom_jwt_auth_integration", "CustomProviderAccount": ".custom_provider_account", "CustomRegexPattern": ".custom_regex_pattern", + "CustomServerHeaderAuth": ".custom_server_header_auth", + "CustomServerPassthrough": ".custom_server_passthrough", "CustomTlsSettings": ".custom_tls_settings", "CustomUsernamePasswordArtifactsRegistry": ".custom_username_password_artifacts_registry", "DataAccessRule": ".data_access_rule", @@ -1182,6 +1283,8 @@ "DataDirectoryManifestSource": ".data_directory_manifest_source", "DatabricksApiKeyAuth": ".databricks_api_key_auth", "DatabricksIntegrations": ".databricks_integrations", + "DatabricksJobTaskConfig": ".databricks_job_task_config", + "DatabricksJobTaskConfigImage": ".databricks_job_task_config_image", "DatabricksModel": ".databricks_model", "DatabricksProviderAccount": ".databricks_provider_account", "DatabricksProviderAccountAuthData": ".databricks_provider_account_auth_data", @@ -1281,6 +1384,7 @@ "GatewayMetadataRule": ".gateway_metadata_rule", "GatewayMetadataWhen": ".gateway_metadata_when", "GatewayOtelConfig": ".gateway_otel_config", + "GatewayOtelConfigOtelMetricsExporterConfig": ".gateway_otel_config_otel_metrics_exporter_config", "GatewayOtelConfigOtelTracesExporterConfig": ".gateway_otel_config_otel_traces_exporter_config", "GatewayRequestMetadataFilter": ".gateway_request_metadata_filter", "GatewayRequestMetadataFilterOperator": ".gateway_request_metadata_filter_operator", @@ -1297,6 +1401,9 @@ "GcpRegion": ".gcp_region", "GcpTpu": ".gcp_tpu", "GeminiModel": ".gemini_model", + "GenericSecretStoreIntegration": ".generic_secret_store_integration", + "GetAgentSkillResponse": ".get_agent_skill_response", + "GetAgentSkillVersionResponse": ".get_agent_skill_version_response", "GetAlertsResponse": ".get_alerts_response", "GetApplicationDeploymentResponse": ".get_application_deployment_response", "GetApplicationResponse": ".get_application_response", @@ -1307,6 +1414,7 @@ "GetChartsResponse": ".get_charts_response", "GetClusterResponse": ".get_cluster_response", "GetDataDirectoryResponse": ".get_data_directory_response", + "GetDockerRegistryCredentialsResponse": ".get_docker_registry_credentials_response", "GetEnvironmentResponse": ".get_environment_response", "GetEventsResponse": ".get_events_response", "GetJobRunResponse": ".get_job_run_response", @@ -1322,8 +1430,10 @@ "GetSignedUrLsRequest": ".get_signed_ur_ls_request", "GetSignedUrLsResponse": ".get_signed_ur_ls_response", "GetSuggestedDeploymentEndpointResponse": ".get_suggested_deployment_endpoint_response", + "GetTeamPermissionsResponse": ".get_team_permissions_response", "GetTeamResponse": ".get_team_response", "GetTokenForVirtualAccountResponse": ".get_token_for_virtual_account_response", + "GetUserPermissionsResponse": ".get_user_permissions_response", "GetUserResourcesResponse": ".get_user_resources_response", "GetUserResponse": ".get_user_response", "GetUserTeamsResponse": ".get_user_teams_response", @@ -1343,6 +1453,7 @@ "GoogleModelArmorGuardrailConfig": ".google_model_armor_guardrail_config", "GoogleModelArmorGuardrailConfigAuthData": ".google_model_armor_guardrail_config_auth_data", "GoogleModelArmorGuardrailConfigConfig": ".google_model_armor_guardrail_config_config", + "GoogleModelArmorGuardrailConfigOperation": ".google_model_armor_guardrail_config_operation", "GoogleModelArmorKeyFileAuth": ".google_model_armor_key_file_auth", "GoogleModelArmorKeyFileAuthKeyFileContent": ".google_model_armor_key_file_auth_key_file_content", "GoogleVertexProviderAccount": ".google_vertex_provider_account", @@ -1363,12 +1474,15 @@ "GuardrailsRule": ".guardrails_rule", "GuardrailsWhen": ".guardrails_when", "H2OFramework": ".h2o_framework", + "HashicorpAppRoleAuth": ".hashicorp_app_role_auth", "HashicorpIntegrations": ".hashicorp_integrations", "HashicorpProviderAccount": ".hashicorp_provider_account", "HashicorpTokenAuth": ".hashicorp_token_auth", "HashicorpVaultIntegration": ".hashicorp_vault_integration", + "HashicorpVaultIntegrationAuthData": ".hashicorp_vault_integration_auth_data", "HeaderMatch": ".header_match", "HeaderRoutingConfig": ".header_routing_config", + "HeadersOverride": ".headers_override", "HealthProbe": ".health_probe", "Helm": ".helm", "HelmRepo": ".helm_repo", @@ -1432,8 +1546,11 @@ "LatencyBasedLoadBalanceTarget": ".latency_based_load_balance_target", "LatencyBasedLoadBalancing": ".latency_based_load_balancing", "LatencyBasedLoadBalancingRule": ".latency_based_load_balancing_rule", + "LegacyAgentManifest": ".legacy_agent_manifest", "LibraryName": ".library_name", "LightGbmFramework": ".light_gbm_framework", + "ListAgentSkillVersionsResponse": ".list_agent_skill_versions_response", + "ListAgentSkillsResponse": ".list_agent_skills_response", "ListApplicationDeploymentsResponse": ".list_application_deployments_response", "ListApplicationsResponse": ".list_applications_response", "ListArtifactVersionsResponse": ".list_artifact_versions_response", @@ -1478,13 +1595,17 @@ "LogsSortingDirection": ".logs_sorting_direction", "Manual": ".manual", "McpServerAuth": ".mcp_server_auth", + "McpServerEnvAuth": ".mcp_server_env_auth", + "McpServerEnvAuthAuthLevel": ".mcp_server_env_auth_auth_level", "McpServerHeaderAuth": ".mcp_server_header_auth", + "McpServerHeaderAuthAuthLevel": ".mcp_server_header_auth_auth_level", "McpServerHeaderOverrideAuth": ".mcp_server_header_override_auth", "McpServerIntegration": ".mcp_server_integration", "McpServerIntegrationTransport": ".mcp_server_integration_transport", "McpServerIntegrations": ".mcp_server_integrations", "McpServerManifest": ".mcp_server_manifest", "McpServerOAuth2": ".mcp_server_o_auth2", + "McpServerOAuth2GrantType": ".mcp_server_o_auth2grant_type", "McpServerOAuth2JwtSource": ".mcp_server_o_auth2jwt_source", "McpServerPassthrough": ".mcp_server_passthrough", "McpServerProviderAccount": ".mcp_server_provider_account", @@ -1494,6 +1615,9 @@ "McpServerWithUrl": ".mcp_server_with_url", "McpTool": ".mcp_tool", "McpToolSetting": ".mcp_tool_setting", + "McpToolTarget": ".mcp_tool_target", + "McpToolsOperator": ".mcp_tools_operator", + "McpToolsOperatorCondition": ".mcp_tools_operator_condition", "Metadata": ".metadata", "Metric": ".metric", "MimeType": ".mime_type", @@ -1554,8 +1678,6 @@ "OpenAiModel": ".open_ai_model", "OpenAiModerationsGuardrailConfig": ".open_ai_moderations_guardrail_config", "OpenAiModerationsGuardrailConfigConfig": ".open_ai_moderations_guardrail_config_config", - "OpenAiModerationsGuardrailConfigConfigCategoryThresholdsValue": ".open_ai_moderations_guardrail_config_config_category_thresholds_value", - "OpenAiModerationsGuardrailConfigConfigCategoryThresholdsValueHarassment": ".open_ai_moderations_guardrail_config_config_category_thresholds_value_harassment", "OpenApiSpecSource": ".open_api_spec_source", "OpenApimcpServerManifest": ".open_apimcp_server_manifest", "OpenApimcpToolSetting": ".open_apimcp_tool_setting", @@ -1567,10 +1689,15 @@ "OpenaiApiKeyAuth": ".openai_api_key_auth", "OpenaiProviderAccount": ".openai_provider_account", "Operation": ".operation", - "OtelExporterGrpcConfig": ".otel_exporter_grpc_config", - "OtelExporterHttpConfig": ".otel_exporter_http_config", - "OtelExporterHttpConfigEncoding": ".otel_exporter_http_config_encoding", - "OtelExporterSpanAttributeFilter": ".otel_exporter_span_attribute_filter", + "OtelExporterGrpcConfigBase": ".otel_exporter_grpc_config_base", + "OtelExporterHttpConfigBase": ".otel_exporter_http_config_base", + "OtelExporterHttpConfigBaseEncoding": ".otel_exporter_http_config_base_encoding", + "OtelMetricsExporterGrpcConfig": ".otel_metrics_exporter_grpc_config", + "OtelMetricsExporterHttpConfig": ".otel_metrics_exporter_http_config", + "OtelTracesExporterCommonConfig": ".otel_traces_exporter_common_config", + "OtelTracesExporterGrpcConfig": ".otel_traces_exporter_grpc_config", + "OtelTracesExporterHttpConfig": ".otel_traces_exporter_http_config", + "OtelTracesExporterSpanAttributeFilter": ".otel_traces_exporter_span_attribute_filter", "OwnDataAccessRule": ".own_data_access_rule", "OwnedBy": ".owned_by", "PaddleFramework": ".paddle_framework", @@ -1645,10 +1772,6 @@ "PrivatePricingTier": ".private_pricing_tier", "PrometheusAlertRule": ".prometheus_alert_rule", "Prompt": ".prompt", - "PromptFooGuardType": ".prompt_foo_guard_type", - "PromptFooGuardrailConfig": ".prompt_foo_guardrail_config", - "PromptFooGuardrailConfigConfig": ".prompt_foo_guardrail_config_config", - "PromptFooGuardrailConfigOperation": ".prompt_foo_guardrail_config_operation", "PromptSource": ".prompt_source", "PromptVersion": ".prompt_version", "ProviderAccounts": ".provider_accounts", @@ -1677,19 +1800,29 @@ "RegexGuardrailConfigConfig": ".regex_guardrail_config_config", "RegexGuardrailConfigOperation": ".regex_guardrail_config_operation", "RegisterUsersResponse": ".register_users_response", + "RemoteAgent": ".remote_agent", "RemoteMcpServerManifest": ".remote_mcp_server_manifest", "RemoteSource": ".remote_source", "RemoteSpecSource": ".remote_spec_source", "Resources": ".resources", "ResourcesDevicesItem": ".resources_devices_item", "ResourcesNode": ".resources_node", + "ResponseFormatJsonObject": ".response_format_json_object", + "ResponseFormatJsonSchema": ".response_format_json_schema", + "ResponseFormatJsonSchemaJsonSchema": ".response_format_json_schema_json_schema", + "ResponseFormatText": ".response_format_text", "RetryConfig": ".retry_config", "RevokeAllPersonalAccessTokenResponse": ".revoke_all_personal_access_token_response", + "RoleBindingManifest": ".role_binding_manifest", + "RoleBindingPermission": ".role_binding_permission", + "RoleBindingSubject": ".role_binding_subject", + "RoleBindingSubjectType": ".role_binding_subject_type", "RoleManifest": ".role_manifest", "RoleWithResource": ".role_with_resource", "RoleWithResourceResourceType": ".role_with_resource_resource_type", "Rolling": ".rolling", "RpsMetric": ".rps_metric", + "SagemakerAssumedRoleBasedAuth": ".sagemaker_assumed_role_based_auth", "SagemakerModel": ".sagemaker_model", "SambaNovaIntegrations": ".samba_nova_integrations", "SambaNovaKeyAuth": ".samba_nova_key_auth", @@ -1708,6 +1841,7 @@ "SecretMount": ".secret_mount", "SecretStoreConfig": ".secret_store_config", "SecretVersion": ".secret_version", + "SelfHostedAgent": ".self_hosted_agent", "SelfHostedModel": ".self_hosted_model", "SelfHostedModelAuthData": ".self_hosted_model_auth_data", "SelfHostedModelIntegrations": ".self_hosted_model_integrations", @@ -1781,12 +1915,17 @@ "StageArtifactResponse": ".stage_artifact_response", "StaticVolumeConfig": ".static_volume_config", "StatsModelsFramework": ".stats_models_framework", + "StdioMcpServerManifest": ".stdio_mcp_server_manifest", + "StickyRouting": ".sticky_routing", + "StickySessionIdentifier": ".sticky_session_identifier", + "StickySessionIdentifierSource": ".sticky_session_identifier_source", "StringDataMount": ".string_data_mount", "SubAgent": ".sub_agent", "Subject": ".subject", "SubjectClause": ".subject_clause", "SubjectConditionGroup": ".subject_condition_group", "SubjectConditionGroupOperator": ".subject_condition_group_operator", + "SubjectPermission": ".subject_permission", "SubjectType": ".subject_type", "SyncTokenInSecretStoreInfo": ".sync_token_in_secret_store_info", "SyncVirtualAccountTokenResponse": ".sync_virtual_account_token_response", @@ -1828,6 +1967,20 @@ "TracingProjectStorageConfig": ".tracing_project_storage_config", "TransformersFramework": ".transformers_framework", "TriggerJobRunResponse": ".trigger_job_run_response", + "TrojAiClientIdAuth": ".troj_ai_client_id_auth", + "TrojAiGuardrailConfig": ".troj_ai_guardrail_config", + "TrojAiGuardrailConfigConfig": ".troj_ai_guardrail_config_config", + "TrojAiGuardrailConfigOperation": ".troj_ai_guardrail_config_operation", + "TrueFoundryAgentManifest": ".true_foundry_agent_manifest", + "TrueFoundryAgentManifestModelParams": ".true_foundry_agent_manifest_model_params", + "TrueFoundryAgentManifestModelParamsReasoningEffort": ".true_foundry_agent_manifest_model_params_reasoning_effort", + "TrueFoundryAgentManifestResponseFormat": ".true_foundry_agent_manifest_response_format", + "TrueFoundryAgentManifestSandbox": ".true_foundry_agent_manifest_sandbox", + "TrueFoundryAgentMcpServer": ".true_foundry_agent_mcp_server", + "TrueFoundryAgentMcpTool": ".true_foundry_agent_mcp_tool", + "TrueFoundryAgentSkill": ".true_foundry_agent_skill", + "TrueFoundryAgentUserMessage": ".true_foundry_agent_user_message", + "TrueFoundryAgentVariable": ".true_foundry_agent_variable", "TrueFoundryApplyRequestManifest": ".true_foundry_apply_request_manifest", "TrueFoundryApplyResponse": ".true_foundry_apply_response", "TrueFoundryApplyResponseAction": ".true_foundry_apply_response_action", @@ -1854,6 +2007,7 @@ "UserMetadata": ".user_metadata", "UserMetadataTenantRoleManagedBy": ".user_metadata_tenant_role_managed_by", "UserResource": ".user_resource", + "UserTeamInfo": ".user_team_info", "Uv": ".uv", "ValidationError": ".validation_error", "ValidationErrorLocItem": ".validation_error_loc_item", @@ -1922,6 +2076,7 @@ def __dir__(): __all__ = [ + "A2AFramework", "Account", "AccountInfo", "ActivateUserResponse", @@ -1929,14 +2084,23 @@ def __dir__(): "AddonComponent", "AddonComponentName", "AddonComponentStatus", + "AgentFramework", "AgentManifest", "AgentSkill", + "AgentSkillManifest", + "AgentSkillManifestSource", + "AgentSkillSourceBlobStorage", + "AgentSkillSourceInline", + "AgentSkillVersion", "AgentSource", "Ai21Integrations", "Ai21KeyAuth", "Ai21Model", "Ai21ProviderAccount", "AiFeaturesSettings", + "AktoGuardrailConfig", + "AktoGuardrailConfigConfig", + "AktoTokenAuth", "Alert", "AlertConfig", "AlertConfigResource", @@ -2029,7 +2193,6 @@ def __dir__(): "AzureOAuth", "AzureOpenAiModel", "AzureOpenAiModelDeploymentType", - "AzureOpenAiModelRegion", "AzureOpenAiProviderAccount", "AzureOpenAiProviderAccountAuthData", "AzurePiiCategory", @@ -2049,11 +2212,16 @@ def __dir__(): "BaseAutoscaling", "BaseOAuth2Login", "BaseOAuth2LoginJwtSource", + "BaseRemoteAgent", "BaseService", "BaseServiceImage", "BaseServiceMountsItem", "BaseWorkbenchInput", "BaseWorkbenchInputMountsItem", + "BasetenIntegrations", + "BasetenKeyAuth", + "BasetenModel", + "BasetenProviderAccount", "BasicAuthCreds", "BedrockModel", "BitbucketIntegration", @@ -2118,22 +2286,33 @@ def __dir__(): "ContainerTaskConfigMountsItem", "CoreNatsOutputConfig", "CpuUtilizationMetric", + "CreateDockerRepositoryResponse", "CreateMultiPartUploadRequest", "CreatePersonalAccessTokenResponse", "CronMetric", + "CustomAgentServerAuth", "CustomBasicAuth", "CustomBearerAuth", "CustomBlobStorage", + "CustomEndpoint", + "CustomEndpointAuthData", + "CustomEndpointIntegrations", + "CustomEndpointProviderAccount", + "CustomEndpointProviderAccountAuthData", + "CustomFramework", "CustomGuardrailConfig", "CustomGuardrailConfigAuthData", "CustomGuardrailConfigConfig", "CustomGuardrailConfigOperation", "CustomGuardrailConfigTarget", + "CustomHeaderAuth", "CustomHelmRepo", "CustomIntegrations", "CustomJwtAuthIntegration", "CustomProviderAccount", "CustomRegexPattern", + "CustomServerHeaderAuth", + "CustomServerPassthrough", "CustomTlsSettings", "CustomUsernamePasswordArtifactsRegistry", "DataAccessRule", @@ -2143,6 +2322,8 @@ def __dir__(): "DataDirectoryManifestSource", "DatabricksApiKeyAuth", "DatabricksIntegrations", + "DatabricksJobTaskConfig", + "DatabricksJobTaskConfigImage", "DatabricksModel", "DatabricksProviderAccount", "DatabricksProviderAccountAuthData", @@ -2242,6 +2423,7 @@ def __dir__(): "GatewayMetadataRule", "GatewayMetadataWhen", "GatewayOtelConfig", + "GatewayOtelConfigOtelMetricsExporterConfig", "GatewayOtelConfigOtelTracesExporterConfig", "GatewayRequestMetadataFilter", "GatewayRequestMetadataFilterOperator", @@ -2258,6 +2440,9 @@ def __dir__(): "GcpRegion", "GcpTpu", "GeminiModel", + "GenericSecretStoreIntegration", + "GetAgentSkillResponse", + "GetAgentSkillVersionResponse", "GetAlertsResponse", "GetApplicationDeploymentResponse", "GetApplicationResponse", @@ -2268,6 +2453,7 @@ def __dir__(): "GetChartsResponse", "GetClusterResponse", "GetDataDirectoryResponse", + "GetDockerRegistryCredentialsResponse", "GetEnvironmentResponse", "GetEventsResponse", "GetJobRunResponse", @@ -2283,8 +2469,10 @@ def __dir__(): "GetSignedUrLsRequest", "GetSignedUrLsResponse", "GetSuggestedDeploymentEndpointResponse", + "GetTeamPermissionsResponse", "GetTeamResponse", "GetTokenForVirtualAccountResponse", + "GetUserPermissionsResponse", "GetUserResourcesResponse", "GetUserResponse", "GetUserTeamsResponse", @@ -2304,6 +2492,7 @@ def __dir__(): "GoogleModelArmorGuardrailConfig", "GoogleModelArmorGuardrailConfigAuthData", "GoogleModelArmorGuardrailConfigConfig", + "GoogleModelArmorGuardrailConfigOperation", "GoogleModelArmorKeyFileAuth", "GoogleModelArmorKeyFileAuthKeyFileContent", "GoogleVertexProviderAccount", @@ -2324,12 +2513,15 @@ def __dir__(): "GuardrailsRule", "GuardrailsWhen", "H2OFramework", + "HashicorpAppRoleAuth", "HashicorpIntegrations", "HashicorpProviderAccount", "HashicorpTokenAuth", "HashicorpVaultIntegration", + "HashicorpVaultIntegrationAuthData", "HeaderMatch", "HeaderRoutingConfig", + "HeadersOverride", "HealthProbe", "Helm", "HelmRepo", @@ -2393,8 +2585,11 @@ def __dir__(): "LatencyBasedLoadBalanceTarget", "LatencyBasedLoadBalancing", "LatencyBasedLoadBalancingRule", + "LegacyAgentManifest", "LibraryName", "LightGbmFramework", + "ListAgentSkillVersionsResponse", + "ListAgentSkillsResponse", "ListApplicationDeploymentsResponse", "ListApplicationsResponse", "ListArtifactVersionsResponse", @@ -2439,13 +2634,17 @@ def __dir__(): "LogsSortingDirection", "Manual", "McpServerAuth", + "McpServerEnvAuth", + "McpServerEnvAuthAuthLevel", "McpServerHeaderAuth", + "McpServerHeaderAuthAuthLevel", "McpServerHeaderOverrideAuth", "McpServerIntegration", "McpServerIntegrationTransport", "McpServerIntegrations", "McpServerManifest", "McpServerOAuth2", + "McpServerOAuth2GrantType", "McpServerOAuth2JwtSource", "McpServerPassthrough", "McpServerProviderAccount", @@ -2455,6 +2654,9 @@ def __dir__(): "McpServerWithUrl", "McpTool", "McpToolSetting", + "McpToolTarget", + "McpToolsOperator", + "McpToolsOperatorCondition", "Metadata", "Metric", "MimeType", @@ -2515,8 +2717,6 @@ def __dir__(): "OpenAiModel", "OpenAiModerationsGuardrailConfig", "OpenAiModerationsGuardrailConfigConfig", - "OpenAiModerationsGuardrailConfigConfigCategoryThresholdsValue", - "OpenAiModerationsGuardrailConfigConfigCategoryThresholdsValueHarassment", "OpenApiSpecSource", "OpenApimcpServerManifest", "OpenApimcpToolSetting", @@ -2528,10 +2728,15 @@ def __dir__(): "OpenaiApiKeyAuth", "OpenaiProviderAccount", "Operation", - "OtelExporterGrpcConfig", - "OtelExporterHttpConfig", - "OtelExporterHttpConfigEncoding", - "OtelExporterSpanAttributeFilter", + "OtelExporterGrpcConfigBase", + "OtelExporterHttpConfigBase", + "OtelExporterHttpConfigBaseEncoding", + "OtelMetricsExporterGrpcConfig", + "OtelMetricsExporterHttpConfig", + "OtelTracesExporterCommonConfig", + "OtelTracesExporterGrpcConfig", + "OtelTracesExporterHttpConfig", + "OtelTracesExporterSpanAttributeFilter", "OwnDataAccessRule", "OwnedBy", "PaddleFramework", @@ -2606,10 +2811,6 @@ def __dir__(): "PrivatePricingTier", "PrometheusAlertRule", "Prompt", - "PromptFooGuardType", - "PromptFooGuardrailConfig", - "PromptFooGuardrailConfigConfig", - "PromptFooGuardrailConfigOperation", "PromptSource", "PromptVersion", "ProviderAccounts", @@ -2638,19 +2839,29 @@ def __dir__(): "RegexGuardrailConfigConfig", "RegexGuardrailConfigOperation", "RegisterUsersResponse", + "RemoteAgent", "RemoteMcpServerManifest", "RemoteSource", "RemoteSpecSource", "Resources", "ResourcesDevicesItem", "ResourcesNode", + "ResponseFormatJsonObject", + "ResponseFormatJsonSchema", + "ResponseFormatJsonSchemaJsonSchema", + "ResponseFormatText", "RetryConfig", "RevokeAllPersonalAccessTokenResponse", + "RoleBindingManifest", + "RoleBindingPermission", + "RoleBindingSubject", + "RoleBindingSubjectType", "RoleManifest", "RoleWithResource", "RoleWithResourceResourceType", "Rolling", "RpsMetric", + "SagemakerAssumedRoleBasedAuth", "SagemakerModel", "SambaNovaIntegrations", "SambaNovaKeyAuth", @@ -2669,6 +2880,7 @@ def __dir__(): "SecretMount", "SecretStoreConfig", "SecretVersion", + "SelfHostedAgent", "SelfHostedModel", "SelfHostedModelAuthData", "SelfHostedModelIntegrations", @@ -2742,12 +2954,17 @@ def __dir__(): "StageArtifactResponse", "StaticVolumeConfig", "StatsModelsFramework", + "StdioMcpServerManifest", + "StickyRouting", + "StickySessionIdentifier", + "StickySessionIdentifierSource", "StringDataMount", "SubAgent", "Subject", "SubjectClause", "SubjectConditionGroup", "SubjectConditionGroupOperator", + "SubjectPermission", "SubjectType", "SyncTokenInSecretStoreInfo", "SyncVirtualAccountTokenResponse", @@ -2789,6 +3006,20 @@ def __dir__(): "TracingProjectStorageConfig", "TransformersFramework", "TriggerJobRunResponse", + "TrojAiClientIdAuth", + "TrojAiGuardrailConfig", + "TrojAiGuardrailConfigConfig", + "TrojAiGuardrailConfigOperation", + "TrueFoundryAgentManifest", + "TrueFoundryAgentManifestModelParams", + "TrueFoundryAgentManifestModelParamsReasoningEffort", + "TrueFoundryAgentManifestResponseFormat", + "TrueFoundryAgentManifestSandbox", + "TrueFoundryAgentMcpServer", + "TrueFoundryAgentMcpTool", + "TrueFoundryAgentSkill", + "TrueFoundryAgentUserMessage", + "TrueFoundryAgentVariable", "TrueFoundryApplyRequestManifest", "TrueFoundryApplyResponse", "TrueFoundryApplyResponseAction", @@ -2815,6 +3046,7 @@ def __dir__(): "UserMetadata", "UserMetadataTenantRoleManagedBy", "UserResource", + "UserTeamInfo", "Uv", "ValidationError", "ValidationErrorLocItem", diff --git a/src/truefoundry_sdk/types/a2a_framework.py b/src/truefoundry_sdk/types/a2a_framework.py new file mode 100644 index 00000000..8ace8e05 --- /dev/null +++ b/src/truefoundry_sdk/types/a2a_framework.py @@ -0,0 +1,30 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class A2AFramework(UniversalBaseModel): + """ + A2A + """ + + type: typing.Literal["a2a"] = pydantic.Field(default="a2a") + """ + Type + """ + + agent_card_path: str = pydantic.Field(default="/.well-known/agent-card.json") + """ + Path to the agent card JSON, relative to the base URL + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/account.py b/src/truefoundry_sdk/types/account.py index a69069cb..a1293088 100644 --- a/src/truefoundry_sdk/types/account.py +++ b/src/truefoundry_sdk/types/account.py @@ -12,27 +12,25 @@ class Account(UniversalBaseModel): id: typing.Optional[str] = None - tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName")] = pydantic.Field( - alias="tenantName" - ) + tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName"), pydantic.Field(alias="tenantName")] fqn: str manifest: typing.Dict[str, typing.Any] = pydantic.Field() """ Account manifest """ - created_by_subject: typing_extensions.Annotated[Subject, FieldMetadata(alias="createdBySubject")] = pydantic.Field( - alias="createdBySubject" - ) - created_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="createdAt")] = ( - pydantic.Field(alias="createdAt", default=None) - ) - updated_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt")] = ( - pydantic.Field(alias="updatedAt", default=None) - ) - is_editable: typing_extensions.Annotated[bool, FieldMetadata(alias="isEditable")] = pydantic.Field( - alias="isEditable" - ) + created_by_subject: typing_extensions.Annotated[ + Subject, FieldMetadata(alias="createdBySubject"), pydantic.Field(alias="createdBySubject") + ] + created_at: typing_extensions.Annotated[ + typing.Optional[dt.datetime], FieldMetadata(alias="createdAt"), pydantic.Field(alias="createdAt") + ] = None + updated_at: typing_extensions.Annotated[ + typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt"), pydantic.Field(alias="updatedAt") + ] = None + is_editable: typing_extensions.Annotated[ + bool, FieldMetadata(alias="isEditable"), pydantic.Field(alias="isEditable") + ] if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/account_info.py b/src/truefoundry_sdk/types/account_info.py index 3d66fb0b..1c3edd6a 100644 --- a/src/truefoundry_sdk/types/account_info.py +++ b/src/truefoundry_sdk/types/account_info.py @@ -9,7 +9,7 @@ class AccountInfo(UniversalBaseModel): - account_id: typing_extensions.Annotated[str, FieldMetadata(alias="accountId")] = pydantic.Field(alias="accountId") + account_id: typing_extensions.Annotated[str, FieldMetadata(alias="accountId"), pydantic.Field(alias="accountId")] name: str if IS_PYDANTIC_V2: diff --git a/src/truefoundry_sdk/types/addon_component.py b/src/truefoundry_sdk/types/addon_component.py index dbb0b9cd..d29f12c3 100644 --- a/src/truefoundry_sdk/types/addon_component.py +++ b/src/truefoundry_sdk/types/addon_component.py @@ -18,32 +18,34 @@ class AddonComponent(UniversalBaseModel): name: AddonComponentName - app_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="appName")] = pydantic.Field( - alias="appName", default=None - ) + app_name: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="appName"), pydantic.Field(alias="appName") + ] = None namespace: typing.Optional[str] = None - application_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="applicationId")] = ( - pydantic.Field(alias="applicationId", default=None) - ) + application_id: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="applicationId"), pydantic.Field(alias="applicationId") + ] = None description: typing.Optional[str] = None path: typing.Optional[str] = None - addon_folder: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="addonFolder")] = ( - pydantic.Field(alias="addonFolder", default=None) - ) + addon_folder: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="addonFolder"), pydantic.Field(alias="addonFolder") + ] = None installed: typing.Optional[bool] = None status: typing.Optional[AddonComponentStatus] = None version: typing.Optional[str] = None manifest: typing.Optional[typing.Dict[str, typing.Any]] = None installation_source: typing_extensions.Annotated[ - typing.Optional[str], FieldMetadata(alias="installationSource") - ] = pydantic.Field(alias="installationSource", default=None) + typing.Optional[str], FieldMetadata(alias="installationSource"), pydantic.Field(alias="installationSource") + ] = None unsupported_cluster_types: typing_extensions.Annotated[ - typing.Optional[typing.List[ClusterType]], FieldMetadata(alias="unsupportedClusterTypes") - ] = pydantic.Field(alias="unsupportedClusterTypes", default=None) + typing.Optional[typing.List[ClusterType]], + FieldMetadata(alias="unsupportedClusterTypes"), + pydantic.Field(alias="unsupportedClusterTypes"), + ] = None required: typing.Optional[bool] = None - known_cr_ds: typing_extensions.Annotated[typing.Optional[typing.List[str]], FieldMetadata(alias="knownCRDs")] = ( - pydantic.Field(alias="knownCRDs", default=None) - ) + known_cr_ds: typing_extensions.Annotated[ + typing.Optional[typing.List[str]], FieldMetadata(alias="knownCRDs"), pydantic.Field(alias="knownCRDs") + ] = None source: typing.Optional[AddOnComponentSource] = None upgrades: typing.Optional[UpgradeData] = None labels: typing.Optional[typing.List[str]] = None @@ -52,9 +54,13 @@ class AddonComponent(UniversalBaseModel): Recommendations """ - workspace_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="workspaceId")] = ( - pydantic.Field(alias="workspaceId", default=None) - ) + workspace_id: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="workspaceId"), pydantic.Field(alias="workspaceId") + ] = None + metadata: typing.Optional[typing.Dict[str, typing.Any]] = pydantic.Field(default=None) + """ + Addon metadata. autopilotEnabled is true when the backing addon application has autopilot enabled; otherwise false. + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/addon_component_status.py b/src/truefoundry_sdk/types/addon_component_status.py index ef37f79f..5361a1a3 100644 --- a/src/truefoundry_sdk/types/addon_component_status.py +++ b/src/truefoundry_sdk/types/addon_component_status.py @@ -9,20 +9,16 @@ class AddonComponentStatus(UniversalBaseModel): - health_status: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="healthStatus")] = ( - pydantic.Field(alias="healthStatus", default=None) - ) - """ - Health status of the addon - """ - - sync_status: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="syncStatus")] = pydantic.Field( - alias="syncStatus", default=None - ) - """ - Sync status of the addon - """ - + health_status: typing_extensions.Annotated[ + typing.Optional[str], + FieldMetadata(alias="healthStatus"), + pydantic.Field(alias="healthStatus", description="Health status of the addon"), + ] = None + sync_status: typing_extensions.Annotated[ + typing.Optional[str], + FieldMetadata(alias="syncStatus"), + pydantic.Field(alias="syncStatus", description="Sync status of the addon"), + ] = None installed: bool = pydantic.Field() """ Indicates whether the addon is installed diff --git a/src/truefoundry_sdk/types/agent_framework.py b/src/truefoundry_sdk/types/agent_framework.py new file mode 100644 index 00000000..1bfaa1df --- /dev/null +++ b/src/truefoundry_sdk/types/agent_framework.py @@ -0,0 +1,8 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +from .a2a_framework import A2AFramework +from .custom_framework import CustomFramework + +AgentFramework = typing.Union[A2AFramework, CustomFramework] diff --git a/src/truefoundry_sdk/types/agent_manifest.py b/src/truefoundry_sdk/types/agent_manifest.py index f0f32526..6ae7823f 100644 --- a/src/truefoundry_sdk/types/agent_manifest.py +++ b/src/truefoundry_sdk/types/agent_manifest.py @@ -2,51 +2,8 @@ import typing -import pydantic -import typing_extensions -from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel -from ..core.serialization import FieldMetadata -from .agent_source import AgentSource -from .collaborator import Collaborator -from .owned_by import OwnedBy -from .sample_agent_input import SampleAgentInput +from .legacy_agent_manifest import LegacyAgentManifest +from .remote_agent import RemoteAgent +from .true_foundry_agent_manifest import TrueFoundryAgentManifest - -class AgentManifest(UniversalBaseModel): - type: typing.Literal["agent"] = pydantic.Field(default="agent") - """ - Type of the manifest - """ - - name: str = pydantic.Field() - """ - The name of the Agent - """ - - description: str = pydantic.Field() - """ - The description of the Agent - """ - - source: AgentSource - collaborators: typing.List[Collaborator] = pydantic.Field() - """ - List of users who have access to this Agent - """ - - sample_inputs: typing.Optional[typing.List[SampleAgentInput]] = pydantic.Field(default=None) - """ - Sample inputs for your agent. These inputs are shown as an example in the "Agent Chat" page. (Click on Try Now in the agent listing page) - """ - - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 - else: - - class Config: - smart_union = True - extra = pydantic.Extra.allow +AgentManifest = typing.Union[TrueFoundryAgentManifest, RemoteAgent, LegacyAgentManifest] diff --git a/src/truefoundry_sdk/types/agent_skill.py b/src/truefoundry_sdk/types/agent_skill.py index bbc641d0..109e0222 100644 --- a/src/truefoundry_sdk/types/agent_skill.py +++ b/src/truefoundry_sdk/types/agent_skill.py @@ -14,12 +14,12 @@ class AgentSkill(UniversalBaseModel): description: str tags: typing.Optional[typing.List[str]] = None examples: typing.Optional[typing.List[str]] = None - input_modes: typing_extensions.Annotated[typing.Optional[typing.List[str]], FieldMetadata(alias="inputModes")] = ( - pydantic.Field(alias="inputModes", default=None) - ) - output_modes: typing_extensions.Annotated[typing.Optional[typing.List[str]], FieldMetadata(alias="outputModes")] = ( - pydantic.Field(alias="outputModes", default=None) - ) + input_modes: typing_extensions.Annotated[ + typing.Optional[typing.List[str]], FieldMetadata(alias="inputModes"), pydantic.Field(alias="inputModes") + ] = None + output_modes: typing_extensions.Annotated[ + typing.Optional[typing.List[str]], FieldMetadata(alias="outputModes"), pydantic.Field(alias="outputModes") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/agent_skill_manifest.py b/src/truefoundry_sdk/types/agent_skill_manifest.py new file mode 100644 index 00000000..407c9479 --- /dev/null +++ b/src/truefoundry_sdk/types/agent_skill_manifest.py @@ -0,0 +1,44 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_skill_manifest_source import AgentSkillManifestSource + + +class AgentSkillManifest(UniversalBaseModel): + """ + Apply/API manifest: ML Repo and versioning; ``source`` is inline (apply) or blob-storage (stored). + """ + + name: str = pydantic.Field() + """ + Name of the skill. + """ + + metadata: typing.Dict[str, typing.Any] = pydantic.Field() + """ + Key value metadata. Should be valid JSON. For e.g. `{"business-unit": "sales", "quality": "good", "rating": 4.5}` + """ + + ml_repo: str = pydantic.Field() + """ + Name of the ML Repo that this agent skill belongs to + """ + + version: typing.Optional[int] = pydantic.Field(default=None) + """ + Version of the entity + """ + + type: typing.Literal["agent_skill"] = "agent_skill" + source: AgentSkillManifestSource + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/agent_skill_manifest_source.py b/src/truefoundry_sdk/types/agent_skill_manifest_source.py new file mode 100644 index 00000000..c0c0f4ce --- /dev/null +++ b/src/truefoundry_sdk/types/agent_skill_manifest_source.py @@ -0,0 +1,8 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +from .agent_skill_source_blob_storage import AgentSkillSourceBlobStorage +from .agent_skill_source_inline import AgentSkillSourceInline + +AgentSkillManifestSource = typing.Union[AgentSkillSourceInline, AgentSkillSourceBlobStorage] diff --git a/src/truefoundry_sdk/types/agent_skill_source_blob_storage.py b/src/truefoundry_sdk/types/agent_skill_source_blob_storage.py new file mode 100644 index 00000000..709bfad2 --- /dev/null +++ b/src/truefoundry_sdk/types/agent_skill_source_blob_storage.py @@ -0,0 +1,26 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class AgentSkillSourceBlobStorage(UniversalBaseModel): + """ + SKILL.md content stored on blob + """ + + type: typing.Literal["blob-storage"] = "blob-storage" + description: str = pydantic.Field() + """ + 1–1024 chars. + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/agent_skill_source_inline.py b/src/truefoundry_sdk/types/agent_skill_source_inline.py new file mode 100644 index 00000000..c7ac30c1 --- /dev/null +++ b/src/truefoundry_sdk/types/agent_skill_source_inline.py @@ -0,0 +1,26 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class AgentSkillSourceInline(UniversalBaseModel): + """ + SKILL.md for this version when using inline source. + """ + + type: typing.Literal["inline"] = "inline" + skill_md: str = pydantic.Field() + """ + Main body of SKILL.md file. + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/agent_skill_version.py b/src/truefoundry_sdk/types/agent_skill_version.py new file mode 100644 index 00000000..0074ea50 --- /dev/null +++ b/src/truefoundry_sdk/types/agent_skill_version.py @@ -0,0 +1,63 @@ +# This file was auto-generated by Fern from our API Definition. + +import datetime as dt +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_skill_manifest import AgentSkillManifest +from .subject import Subject + + +class AgentSkillVersion(UniversalBaseModel): + """ + Shared artifact-version fields (identity, manifest union, ML repo). + """ + + id: str = pydantic.Field() + """ + Unique identifier for the artifact version + """ + + fqn: str = pydantic.Field() + """ + Fully qualified name of the artifact version in the format '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}:{version}' + """ + + created_by_subject: Subject = pydantic.Field() + """ + Subject (user, team, or service account) that created this artifact version + """ + + created_at: typing.Optional[dt.datetime] = pydantic.Field(default=None) + """ + Timestamp when the artifact version was created + """ + + updated_at: typing.Optional[dt.datetime] = pydantic.Field(default=None) + """ + Timestamp when the artifact version was last updated + """ + + manifest: AgentSkillManifest = pydantic.Field() + """ + Manifest containing metadata specific to this agent skill version + """ + + ml_repo_id: str = pydantic.Field() + """ + ID of the ML Repo that this artifact version belongs to + """ + + agent_skill_id: str = pydantic.Field() + """ + ID of the parent agent skill artifact that this version belongs to + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/ai21provider_account.py b/src/truefoundry_sdk/types/ai21provider_account.py index 2ed1b09b..bc1dc89e 100644 --- a/src/truefoundry_sdk/types/ai21provider_account.py +++ b/src/truefoundry_sdk/types/ai21provider_account.py @@ -38,9 +38,9 @@ class Ai21ProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/akto_guardrail_config.py b/src/truefoundry_sdk/types/akto_guardrail_config.py new file mode 100644 index 00000000..4d72b9c0 --- /dev/null +++ b/src/truefoundry_sdk/types/akto_guardrail_config.py @@ -0,0 +1,56 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .akto_guardrail_config_config import AktoGuardrailConfigConfig +from .akto_token_auth import AktoTokenAuth +from .enforcing_strategy import EnforcingStrategy + + +class AktoGuardrailConfig(UniversalBaseModel): + """ + Akto + """ + + name: str = pydantic.Field() + """ + The name of the Guardrail Config. + """ + + description: typing.Optional[str] = pydantic.Field( + default="Akto guardrail for LLM security, prompt injection detection, and policy violation monitoring" + ) + """ + Optional description for this Guardrail Config. + """ + + type: typing.Literal["integration/guardrail-config/akto"] = pydantic.Field( + default="integration/guardrail-config/akto" + ) + """ + +uiType=Hidden + +value=integration/guardrail-config/akto + """ + + auth_data: AktoTokenAuth + operation: typing.Literal["validate"] = pydantic.Field(default="validate") + """ + The operation type for this guardrail. Akto guardrails can only be used for validation. + """ + + enforcing_strategy: EnforcingStrategy + config: AktoGuardrailConfigConfig = pydantic.Field() + """ + +uiType=Ignore + +uiProps={"forwardJsonKey": true} + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/prompt_foo_guardrail_config_config.py b/src/truefoundry_sdk/types/akto_guardrail_config_config.py similarity index 72% rename from src/truefoundry_sdk/types/prompt_foo_guardrail_config_config.py rename to src/truefoundry_sdk/types/akto_guardrail_config_config.py index ddb1b1e2..c837886e 100644 --- a/src/truefoundry_sdk/types/prompt_foo_guardrail_config_config.py +++ b/src/truefoundry_sdk/types/akto_guardrail_config_config.py @@ -4,16 +4,18 @@ import pydantic from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel -from .prompt_foo_guard_type import PromptFooGuardType -class PromptFooGuardrailConfigConfig(UniversalBaseModel): +class AktoGuardrailConfigConfig(UniversalBaseModel): """ +uiType=Ignore +uiProps={"forwardJsonKey": true} """ - guard_type: PromptFooGuardType + base_url: str = pydantic.Field() + """ + The base URL of the Akto guardrails service (e.g. https://your-akto-host:port) + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/akto_token_auth.py b/src/truefoundry_sdk/types/akto_token_auth.py new file mode 100644 index 00000000..dc26a503 --- /dev/null +++ b/src/truefoundry_sdk/types/akto_token_auth.py @@ -0,0 +1,30 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class AktoTokenAuth(UniversalBaseModel): + """ + Authentication method using an Akto JWT token + """ + + type: typing.Literal["token"] = pydantic.Field(default="token") + """ + +value=token + """ + + token: str = pydantic.Field() + """ + JWT token for authenticating with the Akto guardrails service + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/alert.py b/src/truefoundry_sdk/types/alert.py index 86b6133b..00f47590 100644 --- a/src/truefoundry_sdk/types/alert.py +++ b/src/truefoundry_sdk/types/alert.py @@ -13,29 +13,31 @@ class Alert(UniversalBaseModel): id: typing.Optional[str] = None name: str timestamps: typing.List[dt.datetime] - start_time: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="startTime")] = pydantic.Field( - alias="startTime" - ) - resolved_time: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="resolvedTime")] = ( - pydantic.Field(alias="resolvedTime", default=None) - ) - application_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="applicationId")] = ( - pydantic.Field(alias="applicationId", default=None) - ) - cluster_id: typing_extensions.Annotated[str, FieldMetadata(alias="clusterId")] = pydantic.Field(alias="clusterId") - tenant_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="tenantName")] = pydantic.Field( - alias="tenantName", default=None - ) + start_time: typing_extensions.Annotated[ + dt.datetime, FieldMetadata(alias="startTime"), pydantic.Field(alias="startTime") + ] + resolved_time: typing_extensions.Annotated[ + typing.Optional[dt.datetime], FieldMetadata(alias="resolvedTime"), pydantic.Field(alias="resolvedTime") + ] = None + application_id: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="applicationId"), pydantic.Field(alias="applicationId") + ] = None + cluster_id: typing_extensions.Annotated[str, FieldMetadata(alias="clusterId"), pydantic.Field(alias="clusterId")] + tenant_name: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="tenantName"), pydantic.Field(alias="tenantName") + ] = None fingerprint: str - updated_at: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="updatedAt")] = pydantic.Field( - alias="updatedAt", default=None - ) - created_at: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="createdAt")] = pydantic.Field( - alias="createdAt", default=None - ) + updated_at: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="updatedAt"), pydantic.Field(alias="updatedAt") + ] = None + created_at: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="createdAt"), pydantic.Field(alias="createdAt") + ] = None application_debug_info_id: typing_extensions.Annotated[ - typing.Optional[str], FieldMetadata(alias="applicationDebugInfoId") - ] = pydantic.Field(alias="applicationDebugInfoId", default=None) + typing.Optional[str], + FieldMetadata(alias="applicationDebugInfoId"), + pydantic.Field(alias="applicationDebugInfoId"), + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/anthropic_provider_account.py b/src/truefoundry_sdk/types/anthropic_provider_account.py index 79b42e84..242cda03 100644 --- a/src/truefoundry_sdk/types/anthropic_provider_account.py +++ b/src/truefoundry_sdk/types/anthropic_provider_account.py @@ -38,9 +38,9 @@ class AnthropicProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/application.py b/src/truefoundry_sdk/types/application.py index b64a7ba8..cc01b1ff 100644 --- a/src/truefoundry_sdk/types/application.py +++ b/src/truefoundry_sdk/types/application.py @@ -23,31 +23,31 @@ class Application(UniversalBaseModel): fqn: typing.Optional[str] = None name: typing.Optional[str] = None type: typing.Optional[ApplicationType] = None - created_by_subject: typing_extensions.Annotated[Subject, FieldMetadata(alias="createdBySubject")] = pydantic.Field( - alias="createdBySubject" - ) - tenant_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="tenantName")] = pydantic.Field( - alias="tenantName", default=None - ) + created_by_subject: typing_extensions.Annotated[ + Subject, FieldMetadata(alias="createdBySubject"), pydantic.Field(alias="createdBySubject") + ] + tenant_name: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="tenantName"), pydantic.Field(alias="tenantName") + ] = None metadata: typing.Optional[ApplicationMetadata] = None - lifecycle_stage: typing_extensions.Annotated[ApplicationLifecycleStage, FieldMetadata(alias="lifecycleStage")] = ( - pydantic.Field(alias="lifecycleStage") - ) - workspace_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="workspaceId")] = ( - pydantic.Field(alias="workspaceId", default=None) - ) - last_version: typing_extensions.Annotated[typing.Optional[int], FieldMetadata(alias="lastVersion")] = ( - pydantic.Field(alias="lastVersion", default=None) - ) - active_version: typing_extensions.Annotated[typing.Optional[int], FieldMetadata(alias="activeVersion")] = ( - pydantic.Field(alias="activeVersion", default=None) - ) - created_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="createdAt")] = ( - pydantic.Field(alias="createdAt", default=None) - ) - updated_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt")] = ( - pydantic.Field(alias="updatedAt", default=None) - ) + lifecycle_stage: typing_extensions.Annotated[ + ApplicationLifecycleStage, FieldMetadata(alias="lifecycleStage"), pydantic.Field(alias="lifecycleStage") + ] + workspace_id: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="workspaceId"), pydantic.Field(alias="workspaceId") + ] = None + last_version: typing_extensions.Annotated[ + typing.Optional[int], FieldMetadata(alias="lastVersion"), pydantic.Field(alias="lastVersion") + ] = None + active_version: typing_extensions.Annotated[ + typing.Optional[int], FieldMetadata(alias="activeVersion"), pydantic.Field(alias="activeVersion") + ] = None + created_at: typing_extensions.Annotated[ + typing.Optional[dt.datetime], FieldMetadata(alias="createdAt"), pydantic.Field(alias="createdAt") + ] = None + updated_at: typing_extensions.Annotated[ + typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt"), pydantic.Field(alias="updatedAt") + ] = None recommendations: typing.Optional[typing.List[Recommendation]] = pydantic.Field(default=None) """ Recommendations for this application @@ -59,40 +59,34 @@ class Application(UniversalBaseModel): """ alerts_summary: typing_extensions.Annotated[ - typing.Optional[typing.Dict[str, typing.Any]], FieldMetadata(alias="alertsSummary") - ] = pydantic.Field(alias="alertsSummary", default=None) - """ - Summary of alerts for this application - """ - + typing.Optional[typing.Dict[str, typing.Any]], + FieldMetadata(alias="alertsSummary"), + pydantic.Field(alias="alertsSummary", description="Summary of alerts for this application"), + ] = None application_debug_infos: typing_extensions.Annotated[ - typing.Optional[typing.List["ApplicationDebugInfo"]], FieldMetadata(alias="applicationDebugInfos") - ] = pydantic.Field(alias="applicationDebugInfos", default=None) - """ - Debug infos for this application - """ - + typing.Optional[typing.List["ApplicationDebugInfo"]], + FieldMetadata(alias="applicationDebugInfos"), + pydantic.Field(alias="applicationDebugInfos", description="Debug infos for this application"), + ] = None potential_problems: typing_extensions.Annotated[ - typing.Optional[typing.List[ApplicationProblem]], FieldMetadata(alias="potentialProblems") - ] = pydantic.Field(alias="potentialProblems", default=None) - """ - Potential problems with the application - """ - + typing.Optional[typing.List[ApplicationProblem]], + FieldMetadata(alias="potentialProblems"), + pydantic.Field(alias="potentialProblems", description="Potential problems with the application"), + ] = None autopilot: typing.Dict[str, typing.Any] - workspace_fqn: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="workspaceFqn")] = ( - pydantic.Field(alias="workspaceFqn", default=None) - ) - created_by: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="createdBy")] = pydantic.Field( - alias="createdBy", default=None - ) + workspace_fqn: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="workspaceFqn"), pydantic.Field(alias="workspaceFqn") + ] = None + created_by: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="createdBy"), pydantic.Field(alias="createdBy") + ] = None deployment: typing.Optional["Deployment"] = None active_deployment_id: typing_extensions.Annotated[ - typing.Optional[str], FieldMetadata(alias="activeDeploymentId") - ] = pydantic.Field(alias="activeDeploymentId", default=None) - last_deployment_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="lastDeploymentId")] = ( - pydantic.Field(alias="lastDeploymentId", default=None) - ) + typing.Optional[str], FieldMetadata(alias="activeDeploymentId"), pydantic.Field(alias="activeDeploymentId") + ] = None + last_deployment_id: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="lastDeploymentId"), pydantic.Field(alias="lastDeploymentId") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/application_debug_info.py b/src/truefoundry_sdk/types/application_debug_info.py index a06d81d8..44050873 100644 --- a/src/truefoundry_sdk/types/application_debug_info.py +++ b/src/truefoundry_sdk/types/application_debug_info.py @@ -13,19 +13,19 @@ class ApplicationDebugInfo(UniversalBaseModel): id: typing.Optional[str] = None - application_id: typing_extensions.Annotated[str, FieldMetadata(alias="applicationId")] = pydantic.Field( - alias="applicationId" - ) + application_id: typing_extensions.Annotated[ + str, FieldMetadata(alias="applicationId"), pydantic.Field(alias="applicationId") + ] application: typing.Optional["Application"] = None - debug_info: typing_extensions.Annotated[typing.Dict[str, typing.Any], FieldMetadata(alias="debugInfo")] = ( - pydantic.Field(alias="debugInfo") - ) - created_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="createdAt")] = ( - pydantic.Field(alias="createdAt", default=None) - ) - updated_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt")] = ( - pydantic.Field(alias="updatedAt", default=None) - ) + debug_info: typing_extensions.Annotated[ + typing.Dict[str, typing.Any], FieldMetadata(alias="debugInfo"), pydantic.Field(alias="debugInfo") + ] + created_at: typing_extensions.Annotated[ + typing.Optional[dt.datetime], FieldMetadata(alias="createdAt"), pydantic.Field(alias="createdAt") + ] = None + updated_at: typing_extensions.Annotated[ + typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt"), pydantic.Field(alias="updatedAt") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/apply_ml_entity_response.py b/src/truefoundry_sdk/types/apply_ml_entity_response.py index 4197c805..33da51d7 100644 --- a/src/truefoundry_sdk/types/apply_ml_entity_response.py +++ b/src/truefoundry_sdk/types/apply_ml_entity_response.py @@ -8,7 +8,10 @@ class ApplyMlEntityResponse(UniversalBaseModel): - data: ApplyMlEntityResponseData + data: ApplyMlEntityResponseData = pydantic.Field() + """ + The created or updated ML entity (model version, prompt version, agent skill version, artifact version, or data directory) + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/apply_ml_entity_response_data.py b/src/truefoundry_sdk/types/apply_ml_entity_response_data.py index a47359fa..c0ea7de3 100644 --- a/src/truefoundry_sdk/types/apply_ml_entity_response_data.py +++ b/src/truefoundry_sdk/types/apply_ml_entity_response_data.py @@ -2,9 +2,10 @@ import typing +from .agent_skill_version import AgentSkillVersion from .artifact_version import ArtifactVersion from .data_directory import DataDirectory from .model_version import ModelVersion from .prompt_version import PromptVersion -ApplyMlEntityResponseData = typing.Union[ModelVersion, PromptVersion, ArtifactVersion, DataDirectory] +ApplyMlEntityResponseData = typing.Union[ModelVersion, PromptVersion, AgentSkillVersion, ArtifactVersion, DataDirectory] diff --git a/src/truefoundry_sdk/types/artifact.py b/src/truefoundry_sdk/types/artifact.py index 71a89018..72c27053 100644 --- a/src/truefoundry_sdk/types/artifact.py +++ b/src/truefoundry_sdk/types/artifact.py @@ -11,16 +11,59 @@ class Artifact(UniversalBaseModel): - id: str - ml_repo_id: str - type: ArtifactType - name: str - fqn: str - created_by_subject: Subject - created_at: typing.Optional[dt.datetime] = None - updated_at: typing.Optional[dt.datetime] = None - latest_version: typing.Optional[BaseArtifactVersion] = None - run_steps: typing.Optional[typing.List[int]] = None + """ + Generic artifact API DTO including run-step linkage for ML runs. + """ + + id: str = pydantic.Field() + """ + Unique identifier for the artifact + """ + + ml_repo_id: str = pydantic.Field() + """ + ID of the ML Repo that this artifact belongs to + """ + + type: ArtifactType = pydantic.Field() + """ + Type of the artifact (e.g., 'artifact', 'model', 'chat_prompt', 'agent_skill', 'plot', 'image') + """ + + name: str = pydantic.Field() + """ + Name of the artifact (alphanumeric characters, hyphens, and underscores only, max 256 characters) + """ + + fqn: str = pydantic.Field() + """ + Fully qualified name of the artifact in the format '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}' + """ + + created_by_subject: Subject = pydantic.Field() + """ + Subject (user, team, or service account) that created this artifact + """ + + created_at: typing.Optional[dt.datetime] = pydantic.Field(default=None) + """ + Timestamp when the artifact was created + """ + + updated_at: typing.Optional[dt.datetime] = pydantic.Field(default=None) + """ + Timestamp when the artifact was last updated + """ + + latest_version: typing.Optional[BaseArtifactVersion] = pydantic.Field(default=None) + """ + The most recent version of this artifact + """ + + run_steps: typing.Optional[typing.List[int]] = pydantic.Field(default=None) + """ + List of run step numbers where this artifact was created or updated + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/artifact_manifest.py b/src/truefoundry_sdk/types/artifact_manifest.py index 3f5cb288..3f48a99b 100644 --- a/src/truefoundry_sdk/types/artifact_manifest.py +++ b/src/truefoundry_sdk/types/artifact_manifest.py @@ -14,23 +14,17 @@ class ArtifactManifest(UniversalBaseModel): name: str = pydantic.Field() """ - Name of the entity + Name of the artifact (alphanumeric characters, hyphens, and underscores only, max 256 characters) """ - description: typing.Optional[str] = None metadata: typing.Dict[str, typing.Any] = pydantic.Field() """ Key value metadata. Should be valid JSON. For e.g. `{"business-unit": "sales", "quality": "good", "rating": 4.5}` """ - version_alias: typing.Optional[str] = pydantic.Field(default=None) - """ - Version alias is alternate, ideally human readable, version string to reference an artifact version. It should start with `v` followed by alphanumeric and it can include `.` and `-` in between (e.g. `v1.0.0`, `v1-prod`, `v3-dev`, etc) - """ - ml_repo: str = pydantic.Field() """ - Name of the ML Repo + Name of the ML Repo that this artifact belongs to (must start and end with alphanumeric, 2-100 characters) """ version: typing.Optional[int] = pydantic.Field(default=None) @@ -39,6 +33,12 @@ class ArtifactManifest(UniversalBaseModel): """ type: typing.Literal["artifact-version"] = "artifact-version" + description: typing.Optional[str] = None + version_alias: typing.Optional[str] = pydantic.Field(default=None) + """ + Version alias is alternate, ideally human readable, version string to reference an artifact version. It should start with `v` followed by alphanumeric and it can include `.` and `-` in between (e.g. `v1.0.0`, `v1-prod`, `v3-dev`, etc) + """ + source: ArtifactManifestSource step: typing.Optional[int] = pydantic.Field(default=0) """ diff --git a/src/truefoundry_sdk/types/artifact_type.py b/src/truefoundry_sdk/types/artifact_type.py index af27cec6..0c01a645 100644 --- a/src/truefoundry_sdk/types/artifact_type.py +++ b/src/truefoundry_sdk/types/artifact_type.py @@ -17,6 +17,7 @@ class ArtifactType(enum.StrEnum): PLOT = "plot" IMAGE = "image" CHAT_PROMPT = "chat_prompt" + AGENT_SKILL = "agent_skill" _UNKNOWN = "__ARTIFACTTYPE_UNKNOWN__" """ This member is used for forward compatibility. If the value is not recognized by the enum, it will be stored here, and the raw value is accessible through `.value`. @@ -35,6 +36,7 @@ def visit( plot: typing.Callable[[], T_Result], image: typing.Callable[[], T_Result], chat_prompt: typing.Callable[[], T_Result], + agent_skill: typing.Callable[[], T_Result], _unknown_member: typing.Callable[[str], T_Result], ) -> T_Result: if self is ArtifactType.ARTIFACT: @@ -47,4 +49,6 @@ def visit( return image() if self is ArtifactType.CHAT_PROMPT: return chat_prompt() + if self is ArtifactType.AGENT_SKILL: + return agent_skill() return _unknown_member(self._value_) diff --git a/src/truefoundry_sdk/types/artifact_version.py b/src/truefoundry_sdk/types/artifact_version.py index e97a2d75..140cfdc1 100644 --- a/src/truefoundry_sdk/types/artifact_version.py +++ b/src/truefoundry_sdk/types/artifact_version.py @@ -10,16 +10,64 @@ class ArtifactVersion(UniversalBaseModel): - id: str - fqn: str - created_by_subject: Subject - created_at: typing.Optional[dt.datetime] = None - updated_at: typing.Optional[dt.datetime] = None - manifest: ArtifactManifest - usage_code_snippet: typing.Optional[str] = None - ml_repo_id: str - tags: typing.Optional[typing.List[str]] = None - artifact_id: str + """ + Tags, optional version alias, and SDK usage snippet (models, prompts, generic artifacts). + """ + + id: str = pydantic.Field() + """ + Unique identifier for the artifact version + """ + + fqn: str = pydantic.Field() + """ + Fully qualified name of the artifact version in the format '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}:{version}' + """ + + created_by_subject: Subject = pydantic.Field() + """ + Subject (user, team, or service account) that created this artifact version + """ + + created_at: typing.Optional[dt.datetime] = pydantic.Field(default=None) + """ + Timestamp when the artifact version was created + """ + + updated_at: typing.Optional[dt.datetime] = pydantic.Field(default=None) + """ + Timestamp when the artifact version was last updated + """ + + manifest: ArtifactManifest = pydantic.Field() + """ + Manifest containing metadata for a generic artifact version + """ + + ml_repo_id: str = pydantic.Field() + """ + ID of the ML Repo that this artifact version belongs to + """ + + tags: typing.Optional[typing.List[str]] = pydantic.Field(default=None) + """ + List of tags associated with this artifact version for filtering and organization + """ + + version_alias: typing.Optional[str] = pydantic.Field(default=None) + """ + Optional human-readable version alias (e.g. v1.0.0) + """ + + usage_code_snippet: typing.Optional[str] = pydantic.Field(default=None) + """ + Code snippet demonstrating how to use this artifact version + """ + + artifact_id: str = pydantic.Field() + """ + ID of the parent artifact that this version belongs to + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/aws_bedrock_guardrail_config_auth_data.py b/src/truefoundry_sdk/types/aws_bedrock_guardrail_config_auth_data.py index 916a6513..a5433c32 100644 --- a/src/truefoundry_sdk/types/aws_bedrock_guardrail_config_auth_data.py +++ b/src/truefoundry_sdk/types/aws_bedrock_guardrail_config_auth_data.py @@ -3,6 +3,9 @@ import typing from .aws_access_key_based_auth import AwsAccessKeyBasedAuth +from .aws_bedrock_api_key_auth import AwsBedrockApiKeyAuth from .aws_bedrock_assumed_role_based_auth import AwsBedrockAssumedRoleBasedAuth -AwsBedrockGuardrailConfigAuthData = typing.Union[AwsAccessKeyBasedAuth, AwsBedrockAssumedRoleBasedAuth] +AwsBedrockGuardrailConfigAuthData = typing.Union[ + AwsAccessKeyBasedAuth, AwsBedrockAssumedRoleBasedAuth, AwsBedrockApiKeyAuth +] diff --git a/src/truefoundry_sdk/types/aws_bedrock_provider_account.py b/src/truefoundry_sdk/types/aws_bedrock_provider_account.py index d2184af6..ac400255 100644 --- a/src/truefoundry_sdk/types/aws_bedrock_provider_account.py +++ b/src/truefoundry_sdk/types/aws_bedrock_provider_account.py @@ -44,9 +44,9 @@ class AwsBedrockProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/aws_parameter_store.py b/src/truefoundry_sdk/types/aws_parameter_store.py index 395c0768..38f62d66 100644 --- a/src/truefoundry_sdk/types/aws_parameter_store.py +++ b/src/truefoundry_sdk/types/aws_parameter_store.py @@ -36,6 +36,11 @@ class AwsParameterStore(UniversalBaseModel): List of subjects that are authorized to access this integration. List of user fqn in format :. """ + kms_arn: typing.Optional[str] = pydantic.Field(default=None) + """ + The ARN of the KMS key to use for encryption. + """ + if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 else: diff --git a/src/truefoundry_sdk/types/aws_provider_account.py b/src/truefoundry_sdk/types/aws_provider_account.py index 49bcd4bb..e0e9923d 100644 --- a/src/truefoundry_sdk/types/aws_provider_account.py +++ b/src/truefoundry_sdk/types/aws_provider_account.py @@ -41,9 +41,9 @@ class AwsProviderAccount(UniversalBaseModel): List of integrations that are associated with the AWS provider account. """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/aws_sagemaker_provider_account.py b/src/truefoundry_sdk/types/aws_sagemaker_provider_account.py index fd330ecf..5839d5b9 100644 --- a/src/truefoundry_sdk/types/aws_sagemaker_provider_account.py +++ b/src/truefoundry_sdk/types/aws_sagemaker_provider_account.py @@ -44,9 +44,9 @@ class AwsSagemakerProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/aws_sagemaker_provider_account_auth_data.py b/src/truefoundry_sdk/types/aws_sagemaker_provider_account_auth_data.py index e28e87a8..5ef69b56 100644 --- a/src/truefoundry_sdk/types/aws_sagemaker_provider_account_auth_data.py +++ b/src/truefoundry_sdk/types/aws_sagemaker_provider_account_auth_data.py @@ -3,6 +3,6 @@ import typing from .aws_access_key_based_auth import AwsAccessKeyBasedAuth -from .aws_bedrock_assumed_role_based_auth import AwsBedrockAssumedRoleBasedAuth +from .sagemaker_assumed_role_based_auth import SagemakerAssumedRoleBasedAuth -AwsSagemakerProviderAccountAuthData = typing.Union[AwsAccessKeyBasedAuth, AwsBedrockAssumedRoleBasedAuth] +AwsSagemakerProviderAccountAuthData = typing.Union[AwsAccessKeyBasedAuth, SagemakerAssumedRoleBasedAuth] diff --git a/src/truefoundry_sdk/types/aws_secrets_manager.py b/src/truefoundry_sdk/types/aws_secrets_manager.py index 9288163d..aa9a4d61 100644 --- a/src/truefoundry_sdk/types/aws_secrets_manager.py +++ b/src/truefoundry_sdk/types/aws_secrets_manager.py @@ -36,6 +36,11 @@ class AwsSecretsManager(UniversalBaseModel): List of subjects that are authorized to access this integration. List of user fqn in format :. """ + kms_arn: typing.Optional[str] = pydantic.Field(default=None) + """ + The ARN of the KMS key to use for encryption. + """ + if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 else: diff --git a/src/truefoundry_sdk/types/azure_foundry_provider_account.py b/src/truefoundry_sdk/types/azure_foundry_provider_account.py index 4f073dd4..7599da8e 100644 --- a/src/truefoundry_sdk/types/azure_foundry_provider_account.py +++ b/src/truefoundry_sdk/types/azure_foundry_provider_account.py @@ -36,9 +36,9 @@ class AzureFoundryProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/azure_open_ai_model.py b/src/truefoundry_sdk/types/azure_open_ai_model.py index 607d8a1a..9f5f2e16 100644 --- a/src/truefoundry_sdk/types/azure_open_ai_model.py +++ b/src/truefoundry_sdk/types/azure_open_ai_model.py @@ -5,7 +5,6 @@ import pydantic from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel from .azure_open_ai_model_deployment_type import AzureOpenAiModelDeploymentType -from .azure_open_ai_model_region import AzureOpenAiModelRegion from .model_cost_metric import ModelCostMetric from .model_type import ModelType @@ -40,14 +39,9 @@ class AzureOpenAiModel(UniversalBaseModel): The foundation model identifier (e.g., gpt-4o-2024-11-20) """ - deployment_type: typing.Optional[AzureOpenAiModelDeploymentType] = pydantic.Field(default=None) + deployment_type: AzureOpenAiModelDeploymentType = pydantic.Field() """ - Global: worldwide processing, Data Zone: US/EU processing only - """ - - region: typing.Optional[AzureOpenAiModelRegion] = pydantic.Field(default=None) - """ - The Azure region for data-zone deployments + Global: worldwide processing; Data zone (US): US data zone processing; Data zone (EU): EU data zone processing; Standard: single-region processing """ model_types: typing.List[ModelType] = pydantic.Field() diff --git a/src/truefoundry_sdk/types/azure_open_ai_model_deployment_type.py b/src/truefoundry_sdk/types/azure_open_ai_model_deployment_type.py index 5c67dc90..aad7b277 100644 --- a/src/truefoundry_sdk/types/azure_open_ai_model_deployment_type.py +++ b/src/truefoundry_sdk/types/azure_open_ai_model_deployment_type.py @@ -9,11 +9,13 @@ class AzureOpenAiModelDeploymentType(enum.StrEnum): """ - Global: worldwide processing, Data Zone: US/EU processing only + Global: worldwide processing; Data zone (US): US data zone processing; Data zone (EU): EU data zone processing; Standard: single-region processing """ + STANDARD = "standard" + DATAZONE_US = "datazone_us" + DATAZONE_EU = "datazone_eu" GLOBAL = "global" - DATA_ZONE = "data-zone" _UNKNOWN = "__AZUREOPENAIMODELDEPLOYMENTTYPE_UNKNOWN__" """ This member is used for forward compatibility. If the value is not recognized by the enum, it will be stored here, and the raw value is accessible through `.value`. @@ -27,12 +29,18 @@ def _missing_(cls, value: typing.Any) -> "AzureOpenAiModelDeploymentType": def visit( self, + standard: typing.Callable[[], T_Result], + datazone_us: typing.Callable[[], T_Result], + datazone_eu: typing.Callable[[], T_Result], global_: typing.Callable[[], T_Result], - data_zone: typing.Callable[[], T_Result], _unknown_member: typing.Callable[[str], T_Result], ) -> T_Result: + if self is AzureOpenAiModelDeploymentType.STANDARD: + return standard() + if self is AzureOpenAiModelDeploymentType.DATAZONE_US: + return datazone_us() + if self is AzureOpenAiModelDeploymentType.DATAZONE_EU: + return datazone_eu() if self is AzureOpenAiModelDeploymentType.GLOBAL: return global_() - if self is AzureOpenAiModelDeploymentType.DATA_ZONE: - return data_zone() return _unknown_member(self._value_) diff --git a/src/truefoundry_sdk/types/azure_open_ai_model_region.py b/src/truefoundry_sdk/types/azure_open_ai_model_region.py deleted file mode 100644 index 91eba626..00000000 --- a/src/truefoundry_sdk/types/azure_open_ai_model_region.py +++ /dev/null @@ -1,190 +0,0 @@ -# This file was auto-generated by Fern from our API Definition. - -import typing - -from ..core import enum - -T_Result = typing.TypeVar("T_Result") - - -class AzureOpenAiModelRegion(enum.StrEnum): - """ - The Azure region for data-zone deployments - """ - - AUSTRALIAEAST = "australiaeast" - AUSTRIAEAST = "austriaeast" - BELGIUMCENTRAL = "belgiumcentral" - BRAZILSOUTH = "brazilsouth" - CANADACENTRAL = "canadacentral" - CENTRALINDIA = "centralindia" - CENTRALUS = "centralus" - CHILECENTRAL = "chilecentral" - DENMARKEAST = "denmarkeast" - EASTASIA = "eastasia" - EASTUS = "eastus" - EASTUS2 = "eastus2" - FRANCECENTRAL = "francecentral" - GERMANYWESTCENTRAL = "germanywestcentral" - INDONESIACENTRAL = "indonesiacentral" - ISRAELCENTRAL = "israelcentral" - ITALYNORTH = "italynorth" - JAPANEAST = "japaneast" - JAPANWEST = "japanwest" - KOREACENTRAL = "koreacentral" - MALAYSIAWEST = "malaysiawest" - MEXICOCENTRAL = "mexicocentral" - NEWZEALANDNORTH = "newzealandnorth" - NORTHCENTRALUS = "northcentralus" - NORTHEUROPE = "northeurope" - NORWAYEAST = "norwayeast" - POLANDCENTRAL = "polandcentral" - QATARCENTRAL = "qatarcentral" - SOUTHAFRICANORTH = "southafricanorth" - SOUTHCENTRALUS = "southcentralus" - SOUTHEASTASIA = "southeastasia" - SPAINCENTRAL = "spaincentral" - SWEDENCENTRAL = "swedencentral" - SWITZERLANDNORTH = "switzerlandnorth" - UAENORTH = "uaenorth" - UKSOUTH = "uksouth" - WESTEUROPE = "westeurope" - WESTUS = "westus" - WESTUS2 = "westus2" - WESTUS3 = "westus3" - _UNKNOWN = "__AZUREOPENAIMODELREGION_UNKNOWN__" - """ - This member is used for forward compatibility. If the value is not recognized by the enum, it will be stored here, and the raw value is accessible through `.value`. - """ - - @classmethod - def _missing_(cls, value: typing.Any) -> "AzureOpenAiModelRegion": - unknown = cls._UNKNOWN - unknown._value_ = value - return unknown - - def visit( - self, - australiaeast: typing.Callable[[], T_Result], - austriaeast: typing.Callable[[], T_Result], - belgiumcentral: typing.Callable[[], T_Result], - brazilsouth: typing.Callable[[], T_Result], - canadacentral: typing.Callable[[], T_Result], - centralindia: typing.Callable[[], T_Result], - centralus: typing.Callable[[], T_Result], - chilecentral: typing.Callable[[], T_Result], - denmarkeast: typing.Callable[[], T_Result], - eastasia: typing.Callable[[], T_Result], - eastus: typing.Callable[[], T_Result], - eastus2: typing.Callable[[], T_Result], - francecentral: typing.Callable[[], T_Result], - germanywestcentral: typing.Callable[[], T_Result], - indonesiacentral: typing.Callable[[], T_Result], - israelcentral: typing.Callable[[], T_Result], - italynorth: typing.Callable[[], T_Result], - japaneast: typing.Callable[[], T_Result], - japanwest: typing.Callable[[], T_Result], - koreacentral: typing.Callable[[], T_Result], - malaysiawest: typing.Callable[[], T_Result], - mexicocentral: typing.Callable[[], T_Result], - newzealandnorth: typing.Callable[[], T_Result], - northcentralus: typing.Callable[[], T_Result], - northeurope: typing.Callable[[], T_Result], - norwayeast: typing.Callable[[], T_Result], - polandcentral: typing.Callable[[], T_Result], - qatarcentral: typing.Callable[[], T_Result], - southafricanorth: typing.Callable[[], T_Result], - southcentralus: typing.Callable[[], T_Result], - southeastasia: typing.Callable[[], T_Result], - spaincentral: typing.Callable[[], T_Result], - swedencentral: typing.Callable[[], T_Result], - switzerlandnorth: typing.Callable[[], T_Result], - uaenorth: typing.Callable[[], T_Result], - uksouth: typing.Callable[[], T_Result], - westeurope: typing.Callable[[], T_Result], - westus: typing.Callable[[], T_Result], - westus2: typing.Callable[[], T_Result], - westus3: typing.Callable[[], T_Result], - _unknown_member: typing.Callable[[str], T_Result], - ) -> T_Result: - if self is AzureOpenAiModelRegion.AUSTRALIAEAST: - return australiaeast() - if self is AzureOpenAiModelRegion.AUSTRIAEAST: - return austriaeast() - if self is AzureOpenAiModelRegion.BELGIUMCENTRAL: - return belgiumcentral() - if self is AzureOpenAiModelRegion.BRAZILSOUTH: - return brazilsouth() - if self is AzureOpenAiModelRegion.CANADACENTRAL: - return canadacentral() - if self is AzureOpenAiModelRegion.CENTRALINDIA: - return centralindia() - if self is AzureOpenAiModelRegion.CENTRALUS: - return centralus() - if self is AzureOpenAiModelRegion.CHILECENTRAL: - return chilecentral() - if self is AzureOpenAiModelRegion.DENMARKEAST: - return denmarkeast() - if self is AzureOpenAiModelRegion.EASTASIA: - return eastasia() - if self is AzureOpenAiModelRegion.EASTUS: - return eastus() - if self is AzureOpenAiModelRegion.EASTUS2: - return eastus2() - if self is AzureOpenAiModelRegion.FRANCECENTRAL: - return francecentral() - if self is AzureOpenAiModelRegion.GERMANYWESTCENTRAL: - return germanywestcentral() - if self is AzureOpenAiModelRegion.INDONESIACENTRAL: - return indonesiacentral() - if self is AzureOpenAiModelRegion.ISRAELCENTRAL: - return israelcentral() - if self is AzureOpenAiModelRegion.ITALYNORTH: - return italynorth() - if self is AzureOpenAiModelRegion.JAPANEAST: - return japaneast() - if self is AzureOpenAiModelRegion.JAPANWEST: - return japanwest() - if self is AzureOpenAiModelRegion.KOREACENTRAL: - return koreacentral() - if self is AzureOpenAiModelRegion.MALAYSIAWEST: - return malaysiawest() - if self is AzureOpenAiModelRegion.MEXICOCENTRAL: - return mexicocentral() - if self is AzureOpenAiModelRegion.NEWZEALANDNORTH: - return newzealandnorth() - if self is AzureOpenAiModelRegion.NORTHCENTRALUS: - return northcentralus() - if self is AzureOpenAiModelRegion.NORTHEUROPE: - return northeurope() - if self is AzureOpenAiModelRegion.NORWAYEAST: - return norwayeast() - if self is AzureOpenAiModelRegion.POLANDCENTRAL: - return polandcentral() - if self is AzureOpenAiModelRegion.QATARCENTRAL: - return qatarcentral() - if self is AzureOpenAiModelRegion.SOUTHAFRICANORTH: - return southafricanorth() - if self is AzureOpenAiModelRegion.SOUTHCENTRALUS: - return southcentralus() - if self is AzureOpenAiModelRegion.SOUTHEASTASIA: - return southeastasia() - if self is AzureOpenAiModelRegion.SPAINCENTRAL: - return spaincentral() - if self is AzureOpenAiModelRegion.SWEDENCENTRAL: - return swedencentral() - if self is AzureOpenAiModelRegion.SWITZERLANDNORTH: - return switzerlandnorth() - if self is AzureOpenAiModelRegion.UAENORTH: - return uaenorth() - if self is AzureOpenAiModelRegion.UKSOUTH: - return uksouth() - if self is AzureOpenAiModelRegion.WESTEUROPE: - return westeurope() - if self is AzureOpenAiModelRegion.WESTUS: - return westus() - if self is AzureOpenAiModelRegion.WESTUS2: - return westus2() - if self is AzureOpenAiModelRegion.WESTUS3: - return westus3() - return _unknown_member(self._value_) diff --git a/src/truefoundry_sdk/types/azure_open_ai_provider_account.py b/src/truefoundry_sdk/types/azure_open_ai_provider_account.py index 9d08895c..312a4fb7 100644 --- a/src/truefoundry_sdk/types/azure_open_ai_provider_account.py +++ b/src/truefoundry_sdk/types/azure_open_ai_provider_account.py @@ -47,9 +47,9 @@ class AzureOpenAiProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/azure_provider_account.py b/src/truefoundry_sdk/types/azure_provider_account.py index 28382900..760905da 100644 --- a/src/truefoundry_sdk/types/azure_provider_account.py +++ b/src/truefoundry_sdk/types/azure_provider_account.py @@ -35,9 +35,9 @@ class AzureProviderAccount(UniversalBaseModel): List of integrations that are associated with the Azure provider account. """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/base_artifact_version.py b/src/truefoundry_sdk/types/base_artifact_version.py index 2c52b5e7..534cf2ab 100644 --- a/src/truefoundry_sdk/types/base_artifact_version.py +++ b/src/truefoundry_sdk/types/base_artifact_version.py @@ -10,15 +10,40 @@ class BaseArtifactVersion(UniversalBaseModel): - id: str - fqn: str - created_by_subject: Subject - created_at: typing.Optional[dt.datetime] = None - updated_at: typing.Optional[dt.datetime] = None + """ + Shared artifact-version fields (identity, manifest union, ML repo). + """ + + id: str = pydantic.Field() + """ + Unique identifier for the artifact version + """ + + fqn: str = pydantic.Field() + """ + Fully qualified name of the artifact version in the format '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}:{version}' + """ + + created_by_subject: Subject = pydantic.Field() + """ + Subject (user, team, or service account) that created this artifact version + """ + + created_at: typing.Optional[dt.datetime] = pydantic.Field(default=None) + """ + Timestamp when the artifact version was created + """ + + updated_at: typing.Optional[dt.datetime] = pydantic.Field(default=None) + """ + Timestamp when the artifact version was last updated + """ + manifest: typing.Optional[BaseArtifactVersionManifest] = None - usage_code_snippet: typing.Optional[str] = None - ml_repo_id: str - tags: typing.Optional[typing.List[str]] = None + ml_repo_id: str = pydantic.Field() + """ + ID of the ML Repo that this artifact version belongs to + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/base_artifact_version_manifest.py b/src/truefoundry_sdk/types/base_artifact_version_manifest.py index b419d172..529fcb57 100644 --- a/src/truefoundry_sdk/types/base_artifact_version_manifest.py +++ b/src/truefoundry_sdk/types/base_artifact_version_manifest.py @@ -2,8 +2,9 @@ import typing +from .agent_skill_manifest import AgentSkillManifest from .artifact_manifest import ArtifactManifest from .chat_prompt_manifest import ChatPromptManifest from .model_manifest import ModelManifest -BaseArtifactVersionManifest = typing.Union[ModelManifest, ChatPromptManifest, ArtifactManifest] +BaseArtifactVersionManifest = typing.Union[ModelManifest, ChatPromptManifest, ArtifactManifest, AgentSkillManifest] diff --git a/src/truefoundry_sdk/types/base_remote_agent.py b/src/truefoundry_sdk/types/base_remote_agent.py new file mode 100644 index 00000000..bd34e068 --- /dev/null +++ b/src/truefoundry_sdk/types/base_remote_agent.py @@ -0,0 +1,44 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +import typing_extensions +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from ..core.serialization import FieldMetadata +from .collaborator import Collaborator +from .owned_by import OwnedBy + + +class BaseRemoteAgent(UniversalBaseModel): + name: str = pydantic.Field() + """ + The name of the Agent + """ + + description: str = pydantic.Field() + """ + The description of the Agent + """ + + tags: typing.Optional[typing.Dict[str, typing.Any]] = pydantic.Field(default=None) + """ + Tags for the Agent + """ + + collaborators: typing.List[Collaborator] = pydantic.Field() + """ + List of users who have access to this Agent + """ + + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/baseten_integrations.py b/src/truefoundry_sdk/types/baseten_integrations.py new file mode 100644 index 00000000..a23916ff --- /dev/null +++ b/src/truefoundry_sdk/types/baseten_integrations.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +from .baseten_model import BasetenModel + +BasetenIntegrations = BasetenModel diff --git a/src/truefoundry_sdk/types/baseten_key_auth.py b/src/truefoundry_sdk/types/baseten_key_auth.py new file mode 100644 index 00000000..c789707c --- /dev/null +++ b/src/truefoundry_sdk/types/baseten_key_auth.py @@ -0,0 +1,30 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class BasetenKeyAuth(UniversalBaseModel): + """ + Authentication method using Baseten API key + """ + + type: typing.Literal["api-key"] = pydantic.Field(default="api-key") + """ + +value=api-key + """ + + api_key: str = pydantic.Field() + """ + The API key for Baseten authentication + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/baseten_model.py b/src/truefoundry_sdk/types/baseten_model.py new file mode 100644 index 00000000..39dc2272 --- /dev/null +++ b/src/truefoundry_sdk/types/baseten_model.py @@ -0,0 +1,48 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .model_cost_metric import ModelCostMetric +from .model_type import ModelType + + +class BasetenModel(UniversalBaseModel): + """ + Baseten Model + """ + + type: typing.Literal["integration/model/baseten"] = pydantic.Field(default="integration/model/baseten") + """ + +value=integration/model/baseten + """ + + name: str = pydantic.Field() + """ + A descriptive name to identify this model integration in the UI + """ + + model_id: str = pydantic.Field() + """ + The Baseten model identifier. This is the model name from Baseten's model catalog. + """ + + model_types: typing.List[ModelType] = pydantic.Field() + """ + Specify the type of the Baseten model + """ + + cost: typing.Optional[ModelCostMetric] = None + authorized_subjects: typing.Optional[typing.List[str]] = pydantic.Field(default=None) + """ + List of subjects that are authorized to access this integration. List of user fqn in format :. + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/baseten_provider_account.py b/src/truefoundry_sdk/types/baseten_provider_account.py new file mode 100644 index 00000000..97a60d02 --- /dev/null +++ b/src/truefoundry_sdk/types/baseten_provider_account.py @@ -0,0 +1,51 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +import typing_extensions +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from ..core.serialization import FieldMetadata +from .baseten_integrations import BasetenIntegrations +from .baseten_key_auth import BasetenKeyAuth +from .collaborator import Collaborator +from .owned_by import OwnedBy + + +class BasetenProviderAccount(UniversalBaseModel): + """ + Baseten + """ + + type: typing.Literal["provider-account/baseten"] = pydantic.Field(default="provider-account/baseten") + """ + +value=provider-account/baseten + """ + + name: str = pydantic.Field() + """ + The name of the Baseten provider account + """ + + auth_data: BasetenKeyAuth + integrations: typing.Optional[typing.List[BasetenIntegrations]] = pydantic.Field(default=None) + """ + List of integrations that are associated with the Baseten provider account + """ + + collaborators: typing.Optional[typing.List[Collaborator]] = pydantic.Field(default=None) + """ + List of users who have access to this provider account + """ + + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/bitbucket_provider_account.py b/src/truefoundry_sdk/types/bitbucket_provider_account.py index 3bf62bc2..cdedf78a 100644 --- a/src/truefoundry_sdk/types/bitbucket_provider_account.py +++ b/src/truefoundry_sdk/types/bitbucket_provider_account.py @@ -30,9 +30,9 @@ class BitbucketProviderAccount(UniversalBaseModel): +uiType=IntegrationsGroup """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/cartesia_provider_account.py b/src/truefoundry_sdk/types/cartesia_provider_account.py index f81e62c7..d7cd509a 100644 --- a/src/truefoundry_sdk/types/cartesia_provider_account.py +++ b/src/truefoundry_sdk/types/cartesia_provider_account.py @@ -49,9 +49,9 @@ class CartesiaProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/cerebras_provider_account.py b/src/truefoundry_sdk/types/cerebras_provider_account.py index abae3cd9..4a89401d 100644 --- a/src/truefoundry_sdk/types/cerebras_provider_account.py +++ b/src/truefoundry_sdk/types/cerebras_provider_account.py @@ -38,9 +38,9 @@ class CerebrasProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/chat_prompt_manifest.py b/src/truefoundry_sdk/types/chat_prompt_manifest.py index f2e02d21..a4190516 100644 --- a/src/truefoundry_sdk/types/chat_prompt_manifest.py +++ b/src/truefoundry_sdk/types/chat_prompt_manifest.py @@ -24,23 +24,17 @@ class ChatPromptManifest(UniversalBaseModel): name: str = pydantic.Field() """ - Name of the entity + Name of the prompt (alphanumeric characters, hyphens, and underscores only, max 256 characters) """ - description: typing.Optional[str] = None metadata: typing.Dict[str, typing.Any] = pydantic.Field() """ Key value metadata. Should be valid JSON. For e.g. `{"business-unit": "sales", "quality": "good", "rating": 4.5}` """ - version_alias: typing.Optional[str] = pydantic.Field(default=None) - """ - Version alias is alternate, ideally human readable, version string to reference an artifact version. It should start with `v` followed by alphanumeric and it can include `.` and `-` in between (e.g. `v1.0.0`, `v1-prod`, `v3-dev`, etc) - """ - ml_repo: str = pydantic.Field() """ - Name of the ML Repo + Name of the ML Repo that this prompt belongs to (must start and end with alphanumeric, 2-100 characters) """ version: typing.Optional[int] = pydantic.Field(default=None) @@ -49,6 +43,12 @@ class ChatPromptManifest(UniversalBaseModel): """ type: typing.Literal["chat_prompt"] = "chat_prompt" + description: typing.Optional[str] = None + version_alias: typing.Optional[str] = pydantic.Field(default=None) + """ + Version alias is alternate, ideally human readable, version string to reference an artifact version. It should start with `v` followed by alphanumeric and it can include `.` and `-` in between (e.g. `v1.0.0`, `v1-prod`, `v3-dev`, etc) + """ + messages: typing.List[ChatPromptManifestMessagesItem] = pydantic.Field() """ List of messages in the chat conversation, must be non-empty diff --git a/src/truefoundry_sdk/types/cloudera_provider_account.py b/src/truefoundry_sdk/types/cloudera_provider_account.py index 740b53b8..b5eab788 100644 --- a/src/truefoundry_sdk/types/cloudera_provider_account.py +++ b/src/truefoundry_sdk/types/cloudera_provider_account.py @@ -42,9 +42,9 @@ class ClouderaProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/cluster.py b/src/truefoundry_sdk/types/cluster.py index 82045743..b7e850b6 100644 --- a/src/truefoundry_sdk/types/cluster.py +++ b/src/truefoundry_sdk/types/cluster.py @@ -15,22 +15,20 @@ class Cluster(UniversalBaseModel): id: str fqn: str manifest: ClusterManifest - tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName")] = pydantic.Field( - alias="tenantName" - ) - account_id: typing_extensions.Annotated[str, FieldMetadata(alias="accountId")] = pydantic.Field(alias="accountId") + tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName"), pydantic.Field(alias="tenantName")] + account_id: typing_extensions.Annotated[str, FieldMetadata(alias="accountId"), pydantic.Field(alias="accountId")] created_by_subject: typing_extensions.Annotated[ - typing.Optional[Subject], FieldMetadata(alias="createdBySubject") - ] = pydantic.Field(alias="createdBySubject", default=None) - created_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="createdAt")] = pydantic.Field( - alias="createdAt" - ) - updated_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="updatedAt")] = pydantic.Field( - alias="updatedAt" - ) - created_by: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="createdBy")] = pydantic.Field( - alias="createdBy", default=None - ) + typing.Optional[Subject], FieldMetadata(alias="createdBySubject"), pydantic.Field(alias="createdBySubject") + ] = None + created_at: typing_extensions.Annotated[ + dt.datetime, FieldMetadata(alias="createdAt"), pydantic.Field(alias="createdAt") + ] + updated_at: typing_extensions.Annotated[ + dt.datetime, FieldMetadata(alias="updatedAt"), pydantic.Field(alias="updatedAt") + ] + created_by: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="createdBy"), pydantic.Field(alias="createdBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/cluster_gateway.py b/src/truefoundry_sdk/types/cluster_gateway.py index 34fa6819..355c1d13 100644 --- a/src/truefoundry_sdk/types/cluster_gateway.py +++ b/src/truefoundry_sdk/types/cluster_gateway.py @@ -12,13 +12,11 @@ class ClusterGateway(UniversalBaseModel): uid: typing.Optional[str] = None name: str hosts: typing.List[str] - is_tie_breaker: typing_extensions.Annotated[typing.Optional[bool], FieldMetadata(alias="isTieBreaker")] = ( - pydantic.Field(alias="isTieBreaker", default=None) - ) - """ - Used when there are 2 gateways with same host - """ - + is_tie_breaker: typing_extensions.Annotated[ + typing.Optional[bool], + FieldMetadata(alias="isTieBreaker"), + pydantic.Field(alias="isTieBreaker", description="Used when there are 2 gateways with same host"), + ] = None selector: typing.Dict[str, str] if IS_PYDANTIC_V2: diff --git a/src/truefoundry_sdk/types/cluster_manifest.py b/src/truefoundry_sdk/types/cluster_manifest.py index b85d96db..d396ed85 100644 --- a/src/truefoundry_sdk/types/cluster_manifest.py +++ b/src/truefoundry_sdk/types/cluster_manifest.py @@ -89,9 +89,9 @@ class ClusterManifest(UniversalBaseModel): Collaborators who can access this cluster """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/cohere_provider_account.py b/src/truefoundry_sdk/types/cohere_provider_account.py index fd51ceb8..947c9e0f 100644 --- a/src/truefoundry_sdk/types/cohere_provider_account.py +++ b/src/truefoundry_sdk/types/cohere_provider_account.py @@ -38,9 +38,9 @@ class CohereProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/internal/docker_registries/types/docker_registries_create_repository_response.py b/src/truefoundry_sdk/types/create_docker_repository_response.py similarity index 50% rename from src/truefoundry_sdk/internal/docker_registries/types/docker_registries_create_repository_response.py rename to src/truefoundry_sdk/types/create_docker_repository_response.py index 68e866dc..7cbe2b32 100644 --- a/src/truefoundry_sdk/internal/docker_registries/types/docker_registries_create_repository_response.py +++ b/src/truefoundry_sdk/types/create_docker_repository_response.py @@ -4,14 +4,16 @@ import pydantic import typing_extensions -from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel -from ....core.serialization import FieldMetadata +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from ..core.serialization import FieldMetadata -class DockerRegistriesCreateRepositoryResponse(UniversalBaseModel): - repo_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="repoName")] = pydantic.Field( - alias="repoName", default=None - ) +class CreateDockerRepositoryResponse(UniversalBaseModel): + repo_name: typing_extensions.Annotated[ + str, + FieldMetadata(alias="repoName"), + pydantic.Field(alias="repoName", description="Created Docker repository name"), + ] if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/create_multi_part_upload_request.py b/src/truefoundry_sdk/types/create_multi_part_upload_request.py index d82746fb..d9f227a2 100644 --- a/src/truefoundry_sdk/types/create_multi_part_upload_request.py +++ b/src/truefoundry_sdk/types/create_multi_part_upload_request.py @@ -7,9 +7,20 @@ class CreateMultiPartUploadRequest(UniversalBaseModel): - id: str - path: str - num_parts: int + id: str = pydantic.Field() + """ + ID of the artifact version to upload files to + """ + + path: str = pydantic.Field() + """ + Relative path within the artifact version where the file should be uploaded + """ + + num_parts: int = pydantic.Field() + """ + Number of parts to split the upload into for multipart upload + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/custom_agent_server_auth.py b/src/truefoundry_sdk/types/custom_agent_server_auth.py new file mode 100644 index 00000000..fd3dfcba --- /dev/null +++ b/src/truefoundry_sdk/types/custom_agent_server_auth.py @@ -0,0 +1,8 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +from .custom_server_header_auth import CustomServerHeaderAuth +from .custom_server_passthrough import CustomServerPassthrough + +CustomAgentServerAuth = typing.Union[CustomServerHeaderAuth, CustomServerPassthrough] diff --git a/src/truefoundry_sdk/types/custom_endpoint.py b/src/truefoundry_sdk/types/custom_endpoint.py new file mode 100644 index 00000000..44081baa --- /dev/null +++ b/src/truefoundry_sdk/types/custom_endpoint.py @@ -0,0 +1,55 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .custom_endpoint_auth_data import CustomEndpointAuthData +from .custom_tls_settings import CustomTlsSettings + + +class CustomEndpoint(UniversalBaseModel): + """ + Custom Endpoint + """ + + type: typing.Literal["integration/model/custom-endpoint"] = pydantic.Field( + default="integration/model/custom-endpoint" + ) + """ + +value=integration/model/custom-endpoint + """ + + name: str = pydantic.Field() + """ + A descriptive name to identify this endpoint in the UI + """ + + base_url: str = pydantic.Field() + """ + The target base URL to proxy requests to (e.g., https://my-service.example.com/v1) + """ + + auth_data: typing.Optional[CustomEndpointAuthData] = pydantic.Field(default=None) + """ + Authentication credentials for the upstream endpoint. Overrides account-level auth if set. + """ + + headers: typing.Optional[typing.Dict[str, str]] = pydantic.Field(default=None) + """ + Custom headers forwarded to the upstream endpoint with every request. For example: `{"X-Custom-Header": "value"}` + """ + + tls_settings: typing.Optional[CustomTlsSettings] = None + authorized_subjects: typing.Optional[typing.List[str]] = pydantic.Field(default=None) + """ + List of subjects that are authorized to access this endpoint. List of user fqn in format :. + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/custom_endpoint_auth_data.py b/src/truefoundry_sdk/types/custom_endpoint_auth_data.py new file mode 100644 index 00000000..f4057688 --- /dev/null +++ b/src/truefoundry_sdk/types/custom_endpoint_auth_data.py @@ -0,0 +1,9 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +from .custom_basic_auth import CustomBasicAuth +from .custom_bearer_auth import CustomBearerAuth +from .custom_header_auth import CustomHeaderAuth + +CustomEndpointAuthData = typing.Union[CustomBasicAuth, CustomBearerAuth, CustomHeaderAuth] diff --git a/src/truefoundry_sdk/types/custom_endpoint_integrations.py b/src/truefoundry_sdk/types/custom_endpoint_integrations.py new file mode 100644 index 00000000..7cb3a355 --- /dev/null +++ b/src/truefoundry_sdk/types/custom_endpoint_integrations.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +from .custom_endpoint import CustomEndpoint + +CustomEndpointIntegrations = CustomEndpoint diff --git a/src/truefoundry_sdk/types/custom_endpoint_provider_account.py b/src/truefoundry_sdk/types/custom_endpoint_provider_account.py new file mode 100644 index 00000000..a8e2b49b --- /dev/null +++ b/src/truefoundry_sdk/types/custom_endpoint_provider_account.py @@ -0,0 +1,57 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +import typing_extensions +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from ..core.serialization import FieldMetadata +from .collaborator import Collaborator +from .custom_endpoint_integrations import CustomEndpointIntegrations +from .custom_endpoint_provider_account_auth_data import CustomEndpointProviderAccountAuthData +from .owned_by import OwnedBy + + +class CustomEndpointProviderAccount(UniversalBaseModel): + """ + Custom Endpoint + """ + + type: typing.Literal["provider-account/custom-endpoint"] = pydantic.Field( + default="provider-account/custom-endpoint" + ) + """ + +value=provider-account/custom-endpoint + """ + + name: str = pydantic.Field() + """ + The name of the custom endpoint provider account. + """ + + auth_data: typing.Optional[CustomEndpointProviderAccountAuthData] = pydantic.Field(default=None) + """ + Default authentication data for all endpoints under this account. Can be overridden at the endpoint level. + """ + + integrations: typing.List[CustomEndpointIntegrations] = pydantic.Field() + """ + List of endpoint integrations associated with this provider account. + """ + + collaborators: typing.Optional[typing.List[Collaborator]] = pydantic.Field(default=None) + """ + Collaborators + """ + + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/custom_endpoint_provider_account_auth_data.py b/src/truefoundry_sdk/types/custom_endpoint_provider_account_auth_data.py new file mode 100644 index 00000000..64a2dc5b --- /dev/null +++ b/src/truefoundry_sdk/types/custom_endpoint_provider_account_auth_data.py @@ -0,0 +1,9 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +from .custom_basic_auth import CustomBasicAuth +from .custom_bearer_auth import CustomBearerAuth +from .custom_header_auth import CustomHeaderAuth + +CustomEndpointProviderAccountAuthData = typing.Union[CustomBasicAuth, CustomBearerAuth, CustomHeaderAuth] diff --git a/src/truefoundry_sdk/types/custom_framework.py b/src/truefoundry_sdk/types/custom_framework.py new file mode 100644 index 00000000..939cc1d1 --- /dev/null +++ b/src/truefoundry_sdk/types/custom_framework.py @@ -0,0 +1,25 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class CustomFramework(UniversalBaseModel): + """ + Custom + """ + + type: typing.Literal["custom"] = pydantic.Field(default="custom") + """ + Type + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/custom_header_auth.py b/src/truefoundry_sdk/types/custom_header_auth.py new file mode 100644 index 00000000..53cbcb00 --- /dev/null +++ b/src/truefoundry_sdk/types/custom_header_auth.py @@ -0,0 +1,30 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class CustomHeaderAuth(UniversalBaseModel): + """ + Static API key or token authentication via request headers. All users share the same credentials. + """ + + type: typing.Literal["header"] = pydantic.Field(default="header") + """ + +value=header + """ + + headers: typing.Dict[str, str] = pydantic.Field() + """ + Headers passed to the generic secret server with every request. + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/custom_integrations.py b/src/truefoundry_sdk/types/custom_integrations.py index d3afe875..63a35ed4 100644 --- a/src/truefoundry_sdk/types/custom_integrations.py +++ b/src/truefoundry_sdk/types/custom_integrations.py @@ -7,6 +7,7 @@ from .custom_jwt_auth_integration import CustomJwtAuthIntegration from .custom_username_password_artifacts_registry import CustomUsernamePasswordArtifactsRegistry from .email_notification_channel import EmailNotificationChannel +from .generic_secret_store_integration import GenericSecretStoreIntegration CustomIntegrations = typing.Union[ CustomUsernamePasswordArtifactsRegistry, @@ -14,4 +15,5 @@ CustomHelmRepo, CustomBlobStorage, CustomJwtAuthIntegration, + GenericSecretStoreIntegration, ] diff --git a/src/truefoundry_sdk/types/custom_provider_account.py b/src/truefoundry_sdk/types/custom_provider_account.py index 70c8f882..5b27d859 100644 --- a/src/truefoundry_sdk/types/custom_provider_account.py +++ b/src/truefoundry_sdk/types/custom_provider_account.py @@ -32,9 +32,9 @@ class CustomProviderAccount(UniversalBaseModel): List of integrations that are associated with the provider account. """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/custom_server_header_auth.py b/src/truefoundry_sdk/types/custom_server_header_auth.py new file mode 100644 index 00000000..1a17e868 --- /dev/null +++ b/src/truefoundry_sdk/types/custom_server_header_auth.py @@ -0,0 +1,27 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class CustomServerHeaderAuth(UniversalBaseModel): + """ + Static API key or token authentication via request headers. + """ + + type: typing.Literal["header"] = pydantic.Field(default="header") + """ + +value=header + """ + + headers: typing.Dict[str, str] + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/custom_server_passthrough.py b/src/truefoundry_sdk/types/custom_server_passthrough.py new file mode 100644 index 00000000..60c795a2 --- /dev/null +++ b/src/truefoundry_sdk/types/custom_server_passthrough.py @@ -0,0 +1,25 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class CustomServerPassthrough(UniversalBaseModel): + """ + Authenticate using your existing TrueFoundry account (PAT or Virtual Accounts). Your credentials are automatically passed to the server. + """ + + type: typing.Literal["passthrough"] = pydantic.Field(default="passthrough") + """ + +value=passthrough + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/data_directory.py b/src/truefoundry_sdk/types/data_directory.py index f9d2d4c8..e2094d64 100644 --- a/src/truefoundry_sdk/types/data_directory.py +++ b/src/truefoundry_sdk/types/data_directory.py @@ -10,15 +10,50 @@ class DataDirectory(UniversalBaseModel): - id: str - ml_repo_id: str - name: str - fqn: str - created_by_subject: Subject - created_at: dt.datetime - updated_at: dt.datetime - manifest: DataDirectoryManifest - usage_code_snippet: typing.Optional[str] = None + id: str = pydantic.Field() + """ + Unique identifier for the data directory + """ + + ml_repo_id: str = pydantic.Field() + """ + ID of the ML Repo that this data directory belongs to + """ + + name: str = pydantic.Field() + """ + Name of the data directory + """ + + fqn: str = pydantic.Field() + """ + Fully qualified name of the data directory + """ + + created_by_subject: Subject = pydantic.Field() + """ + Subject (user, team, or service account) that created this data directory + """ + + created_at: dt.datetime = pydantic.Field() + """ + Timestamp when the data directory was created + """ + + updated_at: dt.datetime = pydantic.Field() + """ + Timestamp when the data directory was last updated + """ + + manifest: DataDirectoryManifest = pydantic.Field() + """ + Manifest containing metadata for the data directory + """ + + usage_code_snippet: typing.Optional[str] = pydantic.Field(default=None) + """ + Code snippet demonstrating how to use this data directory + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/databricks_job_task_config.py b/src/truefoundry_sdk/types/databricks_job_task_config.py new file mode 100644 index 00000000..e41585bb --- /dev/null +++ b/src/truefoundry_sdk/types/databricks_job_task_config.py @@ -0,0 +1,69 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .databricks_job_task_config_image import DatabricksJobTaskConfigImage +from .resources import Resources + + +class DatabricksJobTaskConfig(UniversalBaseModel): + """ + Task that triggers a Databricks job via API and polls until completion. Uses image and optional resources; no env or mounts. Execution is handled by the CLI (trigger + poll). + """ + + type: typing.Literal["databricks-job-task-config"] = pydantic.Field(default="databricks-job-task-config") + """ + +value=databricks-job-task-config + """ + + image: DatabricksJobTaskConfigImage = pydantic.Field() + """ + Specify the image spec for the task + """ + + workspace_host: str = pydantic.Field() + """ + Databricks workspace URL, e.g. https://.cloud.databricks.com + """ + + job_id: str = pydantic.Field() + """ + The Databricks job ID to run (from Databricks workspace Jobs). + """ + + service_account: typing.Optional[str] = pydantic.Field(default=None) + """ + Service Account + """ + + job_parameters: typing.Optional[typing.Dict[str, typing.Optional[str]]] = pydantic.Field(default=None) + """ + Optional parameters to pass to the job run (e.g. notebook params, jar params). + """ + + timeout_seconds: typing.Optional[float] = pydantic.Field(default=None) + """ + Maximum seconds to wait for the job run to complete. Used by CLI when polling. + """ + + skip_wait_for_completion: typing.Optional[bool] = pydantic.Field(default=False) + """ + If false, the task waits for the Databricks job run to complete (trigger and poll). If true, only triggers the job and returns. Default false. + """ + + env: typing.Optional[typing.Dict[str, typing.Optional[str]]] = pydantic.Field(default=None) + """ + Configure environment variables to be injected in the task either as plain text or secrets. [Docs](https://docs.truefoundry.com/docs/env-variables) + """ + + resources: typing.Optional[Resources] = None + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/databricks_job_task_config_image.py b/src/truefoundry_sdk/types/databricks_job_task_config_image.py new file mode 100644 index 00000000..f232b8cd --- /dev/null +++ b/src/truefoundry_sdk/types/databricks_job_task_config_image.py @@ -0,0 +1,8 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +from .task_docker_file_build import TaskDockerFileBuild +from .task_python_build import TaskPythonBuild + +DatabricksJobTaskConfigImage = typing.Union[TaskPythonBuild, TaskDockerFileBuild] diff --git a/src/truefoundry_sdk/types/databricks_provider_account.py b/src/truefoundry_sdk/types/databricks_provider_account.py index 39360106..5923c6c8 100644 --- a/src/truefoundry_sdk/types/databricks_provider_account.py +++ b/src/truefoundry_sdk/types/databricks_provider_account.py @@ -47,9 +47,9 @@ class DatabricksProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/deepgram_provider_account.py b/src/truefoundry_sdk/types/deepgram_provider_account.py index f3217b41..13105341 100644 --- a/src/truefoundry_sdk/types/deepgram_provider_account.py +++ b/src/truefoundry_sdk/types/deepgram_provider_account.py @@ -43,9 +43,9 @@ class DeepgramProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/deepinfra_provider_account.py b/src/truefoundry_sdk/types/deepinfra_provider_account.py index 6d072006..cf4ffb6d 100644 --- a/src/truefoundry_sdk/types/deepinfra_provider_account.py +++ b/src/truefoundry_sdk/types/deepinfra_provider_account.py @@ -38,9 +38,9 @@ class DeepinfraProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/deployment.py b/src/truefoundry_sdk/types/deployment.py index 15d20522..d00f791f 100644 --- a/src/truefoundry_sdk/types/deployment.py +++ b/src/truefoundry_sdk/types/deployment.py @@ -20,42 +20,44 @@ class Deployment(UniversalBaseModel): id: typing.Optional[str] = None version: typing.Optional[float] = None fqn: typing.Optional[str] = None - application_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="applicationId")] = ( - pydantic.Field(alias="applicationId", default=None) - ) + application_id: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="applicationId"), pydantic.Field(alias="applicationId") + ] = None manifest: DeploymentManifest application: typing.Optional["Application"] = None - created_by_subject: typing_extensions.Annotated[Subject, FieldMetadata(alias="createdBySubject")] = pydantic.Field( - alias="createdBySubject" - ) - created_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="createdAt")] = ( - pydantic.Field(alias="createdAt", default=None) - ) - updated_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt")] = ( - pydantic.Field(alias="updatedAt", default=None) - ) + created_by_subject: typing_extensions.Annotated[ + Subject, FieldMetadata(alias="createdBySubject"), pydantic.Field(alias="createdBySubject") + ] + created_at: typing_extensions.Annotated[ + typing.Optional[dt.datetime], FieldMetadata(alias="createdAt"), pydantic.Field(alias="createdAt") + ] = None + updated_at: typing_extensions.Annotated[ + typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt"), pydantic.Field(alias="updatedAt") + ] = None deployment_builds: typing_extensions.Annotated[ - typing.Optional[typing.List[BuildInfo]], FieldMetadata(alias="deploymentBuilds") - ] = pydantic.Field(alias="deploymentBuilds", default=None) + typing.Optional[typing.List[BuildInfo]], + FieldMetadata(alias="deploymentBuilds"), + pydantic.Field(alias="deploymentBuilds"), + ] = None deployment_statuses: typing_extensions.Annotated[ - typing.Optional[typing.List[DeploymentStatus]], FieldMetadata(alias="deploymentStatuses") - ] = pydantic.Field(alias="deploymentStatuses", default=None) - current_status_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="currentStatusId")] = ( - pydantic.Field(alias="currentStatusId", default=None) - ) + typing.Optional[typing.List[DeploymentStatus]], + FieldMetadata(alias="deploymentStatuses"), + pydantic.Field(alias="deploymentStatuses"), + ] = None + current_status_id: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="currentStatusId"), pydantic.Field(alias="currentStatusId") + ] = None current_status: typing_extensions.Annotated[ - typing.Optional[DeploymentStatus], FieldMetadata(alias="currentStatus") - ] = pydantic.Field(alias="currentStatus", default=None) + typing.Optional[DeploymentStatus], FieldMetadata(alias="currentStatus"), pydantic.Field(alias="currentStatus") + ] = None applied_recommendations: typing_extensions.Annotated[ - typing.Optional[typing.List[Recommendation]], FieldMetadata(alias="appliedRecommendations") - ] = pydantic.Field(alias="appliedRecommendations", default=None) - """ - Applied recommendations for this deployment - """ - - created_by: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="createdBy")] = pydantic.Field( - alias="createdBy", default=None - ) + typing.Optional[typing.List[Recommendation]], + FieldMetadata(alias="appliedRecommendations"), + pydantic.Field(alias="appliedRecommendations", description="Applied recommendations for this deployment"), + ] = None + created_by: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="createdBy"), pydantic.Field(alias="createdBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/deployment_build.py b/src/truefoundry_sdk/types/deployment_build.py index 8ee5600a..629b8486 100644 --- a/src/truefoundry_sdk/types/deployment_build.py +++ b/src/truefoundry_sdk/types/deployment_build.py @@ -13,37 +13,37 @@ class DeploymentBuild(UniversalBaseModel): id: typing.Optional[str] = None - deployment_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="deploymentId")] = ( - pydantic.Field(alias="deploymentId", default=None) - ) - component_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="componentName")] = ( - pydantic.Field(alias="componentName", default=None) - ) + deployment_id: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="deploymentId"), pydantic.Field(alias="deploymentId") + ] = None + component_name: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="componentName"), pydantic.Field(alias="componentName") + ] = None build: typing.Optional[BuildInfo] = None - build_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="buildId")] = pydantic.Field( - alias="buildId", default=None - ) - image_uri: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="imageUri")] = pydantic.Field( - alias="imageUri", default=None - ) + build_id: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="buildId"), pydantic.Field(alias="buildId") + ] = None + image_uri: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="imageUri"), pydantic.Field(alias="imageUri") + ] = None name: typing.Optional[str] = None status: typing.Optional[BuildStatus] = None - get_logs_url: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="getLogsUrl")] = pydantic.Field( - alias="getLogsUrl", default=None - ) - tail_logs_url: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="tailLogsUrl")] = ( - pydantic.Field(alias="tailLogsUrl", default=None) - ) - logs_start_ts: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="logsStartTs")] = ( - pydantic.Field(alias="logsStartTs", default=None) - ) + get_logs_url: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="getLogsUrl"), pydantic.Field(alias="getLogsUrl") + ] = None + tail_logs_url: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="tailLogsUrl"), pydantic.Field(alias="tailLogsUrl") + ] = None + logs_start_ts: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="logsStartTs"), pydantic.Field(alias="logsStartTs") + ] = None metadata: typing.Optional[typing.Dict[str, typing.Any]] = None - created_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="createdAt")] = ( - pydantic.Field(alias="createdAt", default=None) - ) - updated_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt")] = ( - pydantic.Field(alias="updatedAt", default=None) - ) + created_at: typing_extensions.Annotated[ + typing.Optional[dt.datetime], FieldMetadata(alias="createdAt"), pydantic.Field(alias="createdAt") + ] = None + updated_at: typing_extensions.Annotated[ + typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt"), pydantic.Field(alias="updatedAt") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/deployment_status.py b/src/truefoundry_sdk/types/deployment_status.py index c06fe004..27191c35 100644 --- a/src/truefoundry_sdk/types/deployment_status.py +++ b/src/truefoundry_sdk/types/deployment_status.py @@ -13,22 +13,22 @@ class DeploymentStatus(UniversalBaseModel): id: typing.Optional[str] = None - deployment_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="deploymentId")] = ( - pydantic.Field(alias="deploymentId", default=None) - ) + deployment_id: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="deploymentId"), pydantic.Field(alias="deploymentId") + ] = None status: typing.Optional[DeploymentStatusValue] = None state: typing.Optional[typing.Dict[str, typing.Any]] = None transition: typing.Optional[DeploymentTransition] = None message: typing.Optional[str] = None - retry_count: typing_extensions.Annotated[typing.Optional[float], FieldMetadata(alias="retryCount")] = ( - pydantic.Field(alias="retryCount", default=None) - ) - created_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="createdAt")] = ( - pydantic.Field(alias="createdAt", default=None) - ) - updated_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt")] = ( - pydantic.Field(alias="updatedAt", default=None) - ) + retry_count: typing_extensions.Annotated[ + typing.Optional[float], FieldMetadata(alias="retryCount"), pydantic.Field(alias="retryCount") + ] = None + created_at: typing_extensions.Annotated[ + typing.Optional[dt.datetime], FieldMetadata(alias="createdAt"), pydantic.Field(alias="createdAt") + ] = None + updated_at: typing_extensions.Annotated[ + typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt"), pydantic.Field(alias="updatedAt") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/dockerhub_provider_account.py b/src/truefoundry_sdk/types/dockerhub_provider_account.py index ee292391..ae4be579 100644 --- a/src/truefoundry_sdk/types/dockerhub_provider_account.py +++ b/src/truefoundry_sdk/types/dockerhub_provider_account.py @@ -37,9 +37,9 @@ class DockerhubProviderAccount(UniversalBaseModel): +uiType=IntegrationsGroup """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/eleven_labs_provider_account.py b/src/truefoundry_sdk/types/eleven_labs_provider_account.py index 86d11667..677492d0 100644 --- a/src/truefoundry_sdk/types/eleven_labs_provider_account.py +++ b/src/truefoundry_sdk/types/eleven_labs_provider_account.py @@ -43,9 +43,9 @@ class ElevenLabsProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/environment.py b/src/truefoundry_sdk/types/environment.py index 5dc16a84..38623630 100644 --- a/src/truefoundry_sdk/types/environment.py +++ b/src/truefoundry_sdk/types/environment.py @@ -16,22 +16,20 @@ class Environment(UniversalBaseModel): id: typing.Optional[str] = None priority: float color: EnvironmentColor - tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName")] = pydantic.Field( - alias="tenantName" - ) - created_by_subject: typing_extensions.Annotated[Subject, FieldMetadata(alias="createdBySubject")] = pydantic.Field( - alias="createdBySubject" - ) - is_production: typing_extensions.Annotated[bool, FieldMetadata(alias="isProduction")] = pydantic.Field( - alias="isProduction" - ) + tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName"), pydantic.Field(alias="tenantName")] + created_by_subject: typing_extensions.Annotated[ + Subject, FieldMetadata(alias="createdBySubject"), pydantic.Field(alias="createdBySubject") + ] + is_production: typing_extensions.Annotated[ + bool, FieldMetadata(alias="isProduction"), pydantic.Field(alias="isProduction") + ] optimize_for: typing_extensions.Annotated[ - typing.Optional[EnvironmentOptimizeFor], FieldMetadata(alias="optimizeFor") - ] = pydantic.Field(alias="optimizeFor", default=None) + typing.Optional[EnvironmentOptimizeFor], FieldMetadata(alias="optimizeFor"), pydantic.Field(alias="optimizeFor") + ] = None manifest: EnvironmentManifest - created_by: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="createdBy")] = pydantic.Field( - alias="createdBy", default=None - ) + created_by: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="createdBy"), pydantic.Field(alias="createdBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/environment_color.py b/src/truefoundry_sdk/types/environment_color.py index 04de9f59..d453ddc0 100644 --- a/src/truefoundry_sdk/types/environment_color.py +++ b/src/truefoundry_sdk/types/environment_color.py @@ -9,16 +9,16 @@ class EnvironmentColor(UniversalBaseModel): - color_hex: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="colorHex")] = pydantic.Field( - alias="colorHex", default=None - ) + color_hex: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="colorHex"), pydantic.Field(alias="colorHex") + ] = None background_color_hex: typing_extensions.Annotated[ - typing.Optional[str], FieldMetadata(alias="backgroundColorHex") - ] = pydantic.Field(alias="backgroundColorHex", default=None) + typing.Optional[str], FieldMetadata(alias="backgroundColorHex"), pydantic.Field(alias="backgroundColorHex") + ] = None color: typing.Optional[str] = None - background_color: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="backgroundColor")] = ( - pydantic.Field(alias="backgroundColor", default=None) - ) + background_color: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="backgroundColor"), pydantic.Field(alias="backgroundColor") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/environment_manifest.py b/src/truefoundry_sdk/types/environment_manifest.py index 29965c62..583795ea 100644 --- a/src/truefoundry_sdk/types/environment_manifest.py +++ b/src/truefoundry_sdk/types/environment_manifest.py @@ -22,16 +22,16 @@ class EnvironmentManifest(UniversalBaseModel): """ color: EnvironmentColor - is_production: typing_extensions.Annotated[bool, FieldMetadata(alias="isProduction")] = pydantic.Field( - alias="isProduction" - ) - """ - Environment Type - Indicates if the environment is for production use - """ - - optimize_for: typing_extensions.Annotated[EnvironmentOptimizeFor, FieldMetadata(alias="optimizeFor")] = ( - pydantic.Field(alias="optimizeFor") - ) + is_production: typing_extensions.Annotated[ + bool, + FieldMetadata(alias="isProduction"), + pydantic.Field( + alias="isProduction", description="Environment Type - Indicates if the environment is for production use" + ), + ] + optimize_for: typing_extensions.Annotated[ + EnvironmentOptimizeFor, FieldMetadata(alias="optimizeFor"), pydantic.Field(alias="optimizeFor") + ] if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/event.py b/src/truefoundry_sdk/types/event.py index 675ae1a0..48e54e8c 100644 --- a/src/truefoundry_sdk/types/event.py +++ b/src/truefoundry_sdk/types/event.py @@ -16,27 +16,21 @@ class Event(UniversalBaseModel): Name of the event """ - first_timestamp: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="firstTimestamp")] = ( - pydantic.Field(alias="firstTimestamp", default=None) - ) - """ - Timestamp when the event was first observed - """ - - last_timestamp: typing_extensions.Annotated[str, FieldMetadata(alias="lastTimestamp")] = pydantic.Field( - alias="lastTimestamp" - ) - """ - Timestamp when the event was last observed - """ - - involved_object: typing_extensions.Annotated[EventInvolvedObject, FieldMetadata(alias="involvedObject")] = ( - pydantic.Field(alias="involvedObject") - ) - """ - Details of the involved object - """ - + first_timestamp: typing_extensions.Annotated[ + typing.Optional[str], + FieldMetadata(alias="firstTimestamp"), + pydantic.Field(alias="firstTimestamp", description="Timestamp when the event was first observed"), + ] = None + last_timestamp: typing_extensions.Annotated[ + str, + FieldMetadata(alias="lastTimestamp"), + pydantic.Field(alias="lastTimestamp", description="Timestamp when the event was last observed"), + ] + involved_object: typing_extensions.Annotated[ + EventInvolvedObject, + FieldMetadata(alias="involvedObject"), + pydantic.Field(alias="involvedObject", description="Details of the involved object"), + ] type: str = pydantic.Field() """ Type of the event diff --git a/src/truefoundry_sdk/types/event_involved_object.py b/src/truefoundry_sdk/types/event_involved_object.py index fdf0f1e7..1d56d624 100644 --- a/src/truefoundry_sdk/types/event_involved_object.py +++ b/src/truefoundry_sdk/types/event_involved_object.py @@ -11,13 +11,13 @@ class EventInvolvedObject(UniversalBaseModel): kind: str name: str - api_version: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="apiVersion")] = pydantic.Field( - alias="apiVersion", default=None - ) + api_version: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="apiVersion"), pydantic.Field(alias="apiVersion") + ] = None namespace: typing.Optional[str] = None - container_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="containerName")] = ( - pydantic.Field(alias="containerName", default=None) - ) + container_name: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="containerName"), pydantic.Field(alias="containerName") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/file_info.py b/src/truefoundry_sdk/types/file_info.py index 50f5e7fe..15b3e3d7 100644 --- a/src/truefoundry_sdk/types/file_info.py +++ b/src/truefoundry_sdk/types/file_info.py @@ -8,11 +8,30 @@ class FileInfo(UniversalBaseModel): - path: str - is_dir: bool - file_size: typing.Optional[int] = None - signed_url: typing.Optional[str] = None - last_modified: typing.Optional[dt.datetime] = None + path: str = pydantic.Field() + """ + Relative path of the file or directory within the artifact version + """ + + is_dir: bool = pydantic.Field() + """ + Whether this path represents a directory (true) or a file (false) + """ + + file_size: typing.Optional[int] = pydantic.Field(default=None) + """ + Size of the file in bytes (only present for files, not directories) + """ + + signed_url: typing.Optional[str] = pydantic.Field(default=None) + """ + Pre-signed URL to download the file directly (only present for files) + """ + + last_modified: typing.Optional[dt.datetime] = pydantic.Field(default=None) + """ + Timestamp when the file was last modified + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/flyte_launch_plan_id.py b/src/truefoundry_sdk/types/flyte_launch_plan_id.py index 45cdd4a5..38c87779 100644 --- a/src/truefoundry_sdk/types/flyte_launch_plan_id.py +++ b/src/truefoundry_sdk/types/flyte_launch_plan_id.py @@ -9,9 +9,9 @@ class FlyteLaunchPlanId(UniversalBaseModel): - resource_type: typing_extensions.Annotated[typing.Literal["LAUNCH_PLAN"], FieldMetadata(alias="resourceType")] = ( - pydantic.Field(alias="resourceType", default="LAUNCH_PLAN") - ) + resource_type: typing_extensions.Annotated[ + typing.Literal["LAUNCH_PLAN"], FieldMetadata(alias="resourceType"), pydantic.Field(alias="resourceType") + ] = "LAUNCH_PLAN" name: str if IS_PYDANTIC_V2: diff --git a/src/truefoundry_sdk/types/flyte_launch_plan_spec.py b/src/truefoundry_sdk/types/flyte_launch_plan_spec.py index 0137d92b..4f23fc95 100644 --- a/src/truefoundry_sdk/types/flyte_launch_plan_spec.py +++ b/src/truefoundry_sdk/types/flyte_launch_plan_spec.py @@ -10,9 +10,9 @@ class FlyteLaunchPlanSpec(UniversalBaseModel): - workflow_id: typing_extensions.Annotated[FlyteWorkflowId, FieldMetadata(alias="workflowId")] = pydantic.Field( - alias="workflowId" - ) + workflow_id: typing_extensions.Annotated[ + FlyteWorkflowId, FieldMetadata(alias="workflowId"), pydantic.Field(alias="workflowId") + ] if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/flyte_task_custom_truefoundry.py b/src/truefoundry_sdk/types/flyte_task_custom_truefoundry.py index 2828febe..c34cdf9e 100644 --- a/src/truefoundry_sdk/types/flyte_task_custom_truefoundry.py +++ b/src/truefoundry_sdk/types/flyte_task_custom_truefoundry.py @@ -3,7 +3,10 @@ import typing from .container_task_config import ContainerTaskConfig +from .databricks_job_task_config import DatabricksJobTaskConfig from .py_spark_task_config import PySparkTaskConfig from .python_task_config import PythonTaskConfig -FlyteTaskCustomTruefoundry = typing.Union[PythonTaskConfig, ContainerTaskConfig, PySparkTaskConfig] +FlyteTaskCustomTruefoundry = typing.Union[ + PythonTaskConfig, ContainerTaskConfig, PySparkTaskConfig, DatabricksJobTaskConfig +] diff --git a/src/truefoundry_sdk/types/flyte_task_id.py b/src/truefoundry_sdk/types/flyte_task_id.py index 48526eb7..c988df09 100644 --- a/src/truefoundry_sdk/types/flyte_task_id.py +++ b/src/truefoundry_sdk/types/flyte_task_id.py @@ -9,9 +9,9 @@ class FlyteTaskId(UniversalBaseModel): - resource_type: typing_extensions.Annotated[typing.Literal["TASK"], FieldMetadata(alias="resourceType")] = ( - pydantic.Field(alias="resourceType", default="TASK") - ) + resource_type: typing_extensions.Annotated[ + typing.Literal["TASK"], FieldMetadata(alias="resourceType"), pydantic.Field(alias="resourceType") + ] = "TASK" name: str if IS_PYDANTIC_V2: diff --git a/src/truefoundry_sdk/types/flyte_workflow_id.py b/src/truefoundry_sdk/types/flyte_workflow_id.py index 73aaeeb5..5590da8c 100644 --- a/src/truefoundry_sdk/types/flyte_workflow_id.py +++ b/src/truefoundry_sdk/types/flyte_workflow_id.py @@ -9,9 +9,9 @@ class FlyteWorkflowId(UniversalBaseModel): - resource_type: typing_extensions.Annotated[typing.Literal["WORKFLOW"], FieldMetadata(alias="resourceType")] = ( - pydantic.Field(alias="resourceType", default="WORKFLOW") - ) + resource_type: typing_extensions.Annotated[ + typing.Literal["WORKFLOW"], FieldMetadata(alias="resourceType"), pydantic.Field(alias="resourceType") + ] = "WORKFLOW" name: str if IS_PYDANTIC_V2: diff --git a/src/truefoundry_sdk/types/gateway_configuration.py b/src/truefoundry_sdk/types/gateway_configuration.py index c97385e3..524e0480 100644 --- a/src/truefoundry_sdk/types/gateway_configuration.py +++ b/src/truefoundry_sdk/types/gateway_configuration.py @@ -13,20 +13,18 @@ class GatewayConfiguration(UniversalBaseModel): id: typing.Optional[str] = None - tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName")] = pydantic.Field( - alias="tenantName" - ) + tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName"), pydantic.Field(alias="tenantName")] type: str manifest: types_config_Config - created_by_subject: typing_extensions.Annotated[Subject, FieldMetadata(alias="createdBySubject")] = pydantic.Field( - alias="createdBySubject" - ) - created_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="createdAt")] = ( - pydantic.Field(alias="createdAt", default=None) - ) - updated_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt")] = ( - pydantic.Field(alias="updatedAt", default=None) - ) + created_by_subject: typing_extensions.Annotated[ + Subject, FieldMetadata(alias="createdBySubject"), pydantic.Field(alias="createdBySubject") + ] + created_at: typing_extensions.Annotated[ + typing.Optional[dt.datetime], FieldMetadata(alias="createdAt"), pydantic.Field(alias="createdAt") + ] = None + updated_at: typing_extensions.Annotated[ + typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt"), pydantic.Field(alias="updatedAt") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/gateway_otel_config.py b/src/truefoundry_sdk/types/gateway_otel_config.py index 34ed263a..3670b08e 100644 --- a/src/truefoundry_sdk/types/gateway_otel_config.py +++ b/src/truefoundry_sdk/types/gateway_otel_config.py @@ -4,6 +4,7 @@ import pydantic from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .gateway_otel_config_otel_metrics_exporter_config import GatewayOtelConfigOtelMetricsExporterConfig from .gateway_otel_config_otel_traces_exporter_config import GatewayOtelConfigOtelTracesExporterConfig @@ -18,7 +19,14 @@ class GatewayOtelConfig(UniversalBaseModel): default=None ) """ - Set this configuration to export LLM gateway OTEL traces to an external platform. Note that we only export OTEL traces via this configuration, this does not include OTEL metrics. + Set this configuration to export LLM gateway OTEL traces to an external platform. Note that we only export OTEL traces via this configuration. + """ + + otel_metrics_exporter_config: typing.Optional[GatewayOtelConfigOtelMetricsExporterConfig] = pydantic.Field( + default=None + ) + """ + Set this configuration to export LLM gateway OTEL metrics to an external platform. Note that we only export OTEL metrics via this configuration. """ if IS_PYDANTIC_V2: diff --git a/src/truefoundry_sdk/types/gateway_otel_config_otel_metrics_exporter_config.py b/src/truefoundry_sdk/types/gateway_otel_config_otel_metrics_exporter_config.py new file mode 100644 index 00000000..76a32ab6 --- /dev/null +++ b/src/truefoundry_sdk/types/gateway_otel_config_otel_metrics_exporter_config.py @@ -0,0 +1,8 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +from .otel_metrics_exporter_grpc_config import OtelMetricsExporterGrpcConfig +from .otel_metrics_exporter_http_config import OtelMetricsExporterHttpConfig + +GatewayOtelConfigOtelMetricsExporterConfig = typing.Union[OtelMetricsExporterHttpConfig, OtelMetricsExporterGrpcConfig] diff --git a/src/truefoundry_sdk/types/gateway_otel_config_otel_traces_exporter_config.py b/src/truefoundry_sdk/types/gateway_otel_config_otel_traces_exporter_config.py index b2baf905..e1b95ff4 100644 --- a/src/truefoundry_sdk/types/gateway_otel_config_otel_traces_exporter_config.py +++ b/src/truefoundry_sdk/types/gateway_otel_config_otel_traces_exporter_config.py @@ -2,7 +2,7 @@ import typing -from .otel_exporter_grpc_config import OtelExporterGrpcConfig -from .otel_exporter_http_config import OtelExporterHttpConfig +from .otel_traces_exporter_grpc_config import OtelTracesExporterGrpcConfig +from .otel_traces_exporter_http_config import OtelTracesExporterHttpConfig -GatewayOtelConfigOtelTracesExporterConfig = typing.Union[OtelExporterHttpConfig, OtelExporterGrpcConfig] +GatewayOtelConfigOtelTracesExporterConfig = typing.Union[OtelTracesExporterHttpConfig, OtelTracesExporterGrpcConfig] diff --git a/src/truefoundry_sdk/types/gateway_request_metadata_filter.py b/src/truefoundry_sdk/types/gateway_request_metadata_filter.py index 4d6adbf4..7748bf11 100644 --- a/src/truefoundry_sdk/types/gateway_request_metadata_filter.py +++ b/src/truefoundry_sdk/types/gateway_request_metadata_filter.py @@ -11,9 +11,9 @@ class GatewayRequestMetadataFilter(UniversalBaseModel): - gateway_request_metadata_key: typing_extensions.Annotated[str, FieldMetadata(alias="gatewayRequestMetadataKey")] = ( - pydantic.Field(alias="gatewayRequestMetadataKey") - ) + gateway_request_metadata_key: typing_extensions.Annotated[ + str, FieldMetadata(alias="gatewayRequestMetadataKey"), pydantic.Field(alias="gatewayRequestMetadataKey") + ] operator: GatewayRequestMetadataFilterOperator value: GatewayRequestMetadataFilterValue diff --git a/src/truefoundry_sdk/types/gcp_api_key_auth.py b/src/truefoundry_sdk/types/gcp_api_key_auth.py index 3df7039f..a588d968 100644 --- a/src/truefoundry_sdk/types/gcp_api_key_auth.py +++ b/src/truefoundry_sdk/types/gcp_api_key_auth.py @@ -18,10 +18,11 @@ class GcpApiKeyAuth(UniversalBaseModel): +value=api-key """ - api_key: typing_extensions.Annotated[str, FieldMetadata(alias="apiKey")] = pydantic.Field(alias="apiKey") - """ - The API key for Google Cloud authentication - """ + api_key: typing_extensions.Annotated[ + str, + FieldMetadata(alias="apiKey"), + pydantic.Field(alias="apiKey", description="The API key for Google Cloud authentication"), + ] if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/gcp_provider_account.py b/src/truefoundry_sdk/types/gcp_provider_account.py index 4774f6e4..a8f6e840 100644 --- a/src/truefoundry_sdk/types/gcp_provider_account.py +++ b/src/truefoundry_sdk/types/gcp_provider_account.py @@ -37,9 +37,9 @@ class GcpProviderAccount(UniversalBaseModel): List of integrations that are associated with the GCP provider account. """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/generic_secret_store_integration.py b/src/truefoundry_sdk/types/generic_secret_store_integration.py new file mode 100644 index 00000000..eef2e916 --- /dev/null +++ b/src/truefoundry_sdk/types/generic_secret_store_integration.py @@ -0,0 +1,44 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .custom_header_auth import CustomHeaderAuth + + +class GenericSecretStoreIntegration(UniversalBaseModel): + """ + Generic Secret Store + """ + + type: typing.Literal["integration/secret-store/custom/generic"] = pydantic.Field( + default="integration/secret-store/custom/generic" + ) + """ + +value=integration/secret-store/custom/generic + """ + + name: str = pydantic.Field() + """ + The name of the integration that will be displayed in the TrueFoundry UI. + """ + + base_url: str = pydantic.Field() + """ + Base URL of the generic secret server. + """ + + auth_data: CustomHeaderAuth + authorized_subjects: typing.Optional[typing.List[str]] = pydantic.Field(default=None) + """ + List of subjects that are authorized to access this integration. List of user fqn in format :. + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/get_agent_skill_response.py b/src/truefoundry_sdk/types/get_agent_skill_response.py new file mode 100644 index 00000000..c0f9150c --- /dev/null +++ b/src/truefoundry_sdk/types/get_agent_skill_response.py @@ -0,0 +1,22 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_skill import AgentSkill + + +class GetAgentSkillResponse(UniversalBaseModel): + data: AgentSkill = pydantic.Field() + """ + The agent skill data + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/get_agent_skill_version_response.py b/src/truefoundry_sdk/types/get_agent_skill_version_response.py new file mode 100644 index 00000000..306fabd6 --- /dev/null +++ b/src/truefoundry_sdk/types/get_agent_skill_version_response.py @@ -0,0 +1,22 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_skill_version import AgentSkillVersion + + +class GetAgentSkillVersionResponse(UniversalBaseModel): + data: AgentSkillVersion = pydantic.Field() + """ + The agent skill version data + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/get_artifact_response.py b/src/truefoundry_sdk/types/get_artifact_response.py index 99b4c81a..a398f9fd 100644 --- a/src/truefoundry_sdk/types/get_artifact_response.py +++ b/src/truefoundry_sdk/types/get_artifact_response.py @@ -8,7 +8,10 @@ class GetArtifactResponse(UniversalBaseModel): - data: Artifact + data: Artifact = pydantic.Field() + """ + The artifact data + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/get_artifact_version_response.py b/src/truefoundry_sdk/types/get_artifact_version_response.py index e75f03e0..81ae4f2d 100644 --- a/src/truefoundry_sdk/types/get_artifact_version_response.py +++ b/src/truefoundry_sdk/types/get_artifact_version_response.py @@ -8,7 +8,10 @@ class GetArtifactVersionResponse(UniversalBaseModel): - data: ArtifactVersion + data: ArtifactVersion = pydantic.Field() + """ + The artifact version data + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/get_authenticated_vcsurl_response.py b/src/truefoundry_sdk/types/get_authenticated_vcsurl_response.py index 1f1e47b8..4f1d9f0d 100644 --- a/src/truefoundry_sdk/types/get_authenticated_vcsurl_response.py +++ b/src/truefoundry_sdk/types/get_authenticated_vcsurl_response.py @@ -9,12 +9,11 @@ class GetAuthenticatedVcsurlResponse(UniversalBaseModel): - authenticated_url: typing_extensions.Annotated[str, FieldMetadata(alias="authenticatedURL")] = pydantic.Field( - alias="authenticatedURL" - ) - """ - Authenticated URL to access the repository - """ + authenticated_url: typing_extensions.Annotated[ + str, + FieldMetadata(alias="authenticatedURL"), + pydantic.Field(alias="authenticatedURL", description="Authenticated URL to access the repository"), + ] if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/get_data_directory_response.py b/src/truefoundry_sdk/types/get_data_directory_response.py index 83e8b454..d0fd68bd 100644 --- a/src/truefoundry_sdk/types/get_data_directory_response.py +++ b/src/truefoundry_sdk/types/get_data_directory_response.py @@ -8,7 +8,10 @@ class GetDataDirectoryResponse(UniversalBaseModel): - data: DataDirectory + data: DataDirectory = pydantic.Field() + """ + The data directory data + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/get_docker_registry_credentials_response.py b/src/truefoundry_sdk/types/get_docker_registry_credentials_response.py new file mode 100644 index 00000000..a1860cb0 --- /dev/null +++ b/src/truefoundry_sdk/types/get_docker_registry_credentials_response.py @@ -0,0 +1,36 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +import typing_extensions +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from ..core.serialization import FieldMetadata + + +class GetDockerRegistryCredentialsResponse(UniversalBaseModel): + fqn: str = pydantic.Field() + """ + Docker registry FQN + """ + + registry_url: typing_extensions.Annotated[ + str, FieldMetadata(alias="registryUrl"), pydantic.Field(alias="registryUrl", description="Docker registry URL") + ] + username: str = pydantic.Field() + """ + Docker registry username + """ + + password: str = pydantic.Field() + """ + Docker registry password + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/get_model_response.py b/src/truefoundry_sdk/types/get_model_response.py index 115585c1..e4a43d80 100644 --- a/src/truefoundry_sdk/types/get_model_response.py +++ b/src/truefoundry_sdk/types/get_model_response.py @@ -8,7 +8,10 @@ class GetModelResponse(UniversalBaseModel): - data: Model + data: Model = pydantic.Field() + """ + The model data + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/get_model_version_response.py b/src/truefoundry_sdk/types/get_model_version_response.py index a2d5037b..291c5bda 100644 --- a/src/truefoundry_sdk/types/get_model_version_response.py +++ b/src/truefoundry_sdk/types/get_model_version_response.py @@ -8,7 +8,10 @@ class GetModelVersionResponse(UniversalBaseModel): - data: ModelVersion + data: ModelVersion = pydantic.Field() + """ + The model version data + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/get_prompt_response.py b/src/truefoundry_sdk/types/get_prompt_response.py index 5ed20277..52f8d1bd 100644 --- a/src/truefoundry_sdk/types/get_prompt_response.py +++ b/src/truefoundry_sdk/types/get_prompt_response.py @@ -8,7 +8,10 @@ class GetPromptResponse(UniversalBaseModel): - data: Prompt + data: Prompt = pydantic.Field() + """ + The prompt data + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/get_prompt_version_response.py b/src/truefoundry_sdk/types/get_prompt_version_response.py index 7bbf08d7..2ceaaa32 100644 --- a/src/truefoundry_sdk/types/get_prompt_version_response.py +++ b/src/truefoundry_sdk/types/get_prompt_version_response.py @@ -8,7 +8,10 @@ class GetPromptVersionResponse(UniversalBaseModel): - data: PromptVersion + data: PromptVersion = pydantic.Field() + """ + The prompt version data + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/get_signed_ur_ls_request.py b/src/truefoundry_sdk/types/get_signed_ur_ls_request.py index a0735190..be5dbd0e 100644 --- a/src/truefoundry_sdk/types/get_signed_ur_ls_request.py +++ b/src/truefoundry_sdk/types/get_signed_ur_ls_request.py @@ -8,9 +8,20 @@ class GetSignedUrLsRequest(UniversalBaseModel): - id: str - paths: typing.List[str] - operation: Operation + id: str = pydantic.Field() + """ + ID of the artifact version to get signed URLs for + """ + + paths: typing.List[str] = pydantic.Field() + """ + List of relative file paths within the artifact version to get signed URLs for + """ + + operation: Operation = pydantic.Field() + """ + Operation type for the signed URL (e.g., 'READ' or 'WRITE') + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/get_signed_ur_ls_response.py b/src/truefoundry_sdk/types/get_signed_ur_ls_response.py index 1d9419b1..7451eaae 100644 --- a/src/truefoundry_sdk/types/get_signed_ur_ls_response.py +++ b/src/truefoundry_sdk/types/get_signed_ur_ls_response.py @@ -8,7 +8,10 @@ class GetSignedUrLsResponse(UniversalBaseModel): - data: typing.List[SignedUrl] + data: typing.List[SignedUrl] = pydantic.Field() + """ + List of signed URLs for the requested file paths + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/get_team_permissions_response.py b/src/truefoundry_sdk/types/get_team_permissions_response.py new file mode 100644 index 00000000..bb2101c1 --- /dev/null +++ b/src/truefoundry_sdk/types/get_team_permissions_response.py @@ -0,0 +1,22 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .subject_permission import SubjectPermission + + +class GetTeamPermissionsResponse(UniversalBaseModel): + data: typing.List[SubjectPermission] = pydantic.Field() + """ + Role bindings for the team + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/get_user_permissions_response.py b/src/truefoundry_sdk/types/get_user_permissions_response.py new file mode 100644 index 00000000..c7c54d3f --- /dev/null +++ b/src/truefoundry_sdk/types/get_user_permissions_response.py @@ -0,0 +1,22 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .subject_permission import SubjectPermission + + +class GetUserPermissionsResponse(UniversalBaseModel): + data: typing.List[SubjectPermission] = pydantic.Field() + """ + Role bindings for the user (including team-inherited) + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/get_user_teams_response.py b/src/truefoundry_sdk/types/get_user_teams_response.py index 7e91370d..c2df74b7 100644 --- a/src/truefoundry_sdk/types/get_user_teams_response.py +++ b/src/truefoundry_sdk/types/get_user_teams_response.py @@ -4,13 +4,13 @@ import pydantic from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel -from .team import Team +from .user_team_info import UserTeamInfo class GetUserTeamsResponse(UniversalBaseModel): - data: typing.List[Team] = pydantic.Field() + data: typing.List[UserTeamInfo] = pydantic.Field() """ - Teams where user is a member + Teams where user is a member, with their role """ if IS_PYDANTIC_V2: diff --git a/src/truefoundry_sdk/types/github_provider_account.py b/src/truefoundry_sdk/types/github_provider_account.py index 6bf4bef2..0f0bd1db 100644 --- a/src/truefoundry_sdk/types/github_provider_account.py +++ b/src/truefoundry_sdk/types/github_provider_account.py @@ -30,9 +30,9 @@ class GithubProviderAccount(UniversalBaseModel): +uiType=IntegrationsGroup """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/gitlab_provider_account.py b/src/truefoundry_sdk/types/gitlab_provider_account.py index b007da8f..7a895b58 100644 --- a/src/truefoundry_sdk/types/gitlab_provider_account.py +++ b/src/truefoundry_sdk/types/gitlab_provider_account.py @@ -30,9 +30,9 @@ class GitlabProviderAccount(UniversalBaseModel): +uiType=IntegrationsGroup """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/google_gemini_provider_account.py b/src/truefoundry_sdk/types/google_gemini_provider_account.py index 04f99568..c6dab5a5 100644 --- a/src/truefoundry_sdk/types/google_gemini_provider_account.py +++ b/src/truefoundry_sdk/types/google_gemini_provider_account.py @@ -38,9 +38,9 @@ class GoogleGeminiProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/google_model_armor_guardrail_config.py b/src/truefoundry_sdk/types/google_model_armor_guardrail_config.py index 55c3ab29..b58c4779 100644 --- a/src/truefoundry_sdk/types/google_model_armor_guardrail_config.py +++ b/src/truefoundry_sdk/types/google_model_armor_guardrail_config.py @@ -7,6 +7,7 @@ from .enforcing_strategy import EnforcingStrategy from .google_model_armor_guardrail_config_auth_data import GoogleModelArmorGuardrailConfigAuthData from .google_model_armor_guardrail_config_config import GoogleModelArmorGuardrailConfigConfig +from .google_model_armor_guardrail_config_operation import GoogleModelArmorGuardrailConfigOperation class GoogleModelArmorGuardrailConfig(UniversalBaseModel): @@ -39,9 +40,14 @@ class GoogleModelArmorGuardrailConfig(UniversalBaseModel): Authentication credentials for Google Cloud Model Armor """ - operation: typing.Literal["validate"] = pydantic.Field(default="validate") + operation: GoogleModelArmorGuardrailConfigOperation = pydantic.Field() """ - The operation type for this guardrail. Google Model Armor guardrails can only be used for validation. + The operation type to use for the Guardrail. Validate guardrails are used to validate requests and mutate can validate as well as mutate requests. + """ + + priority: typing.Optional[int] = pydantic.Field(default=1) + """ + Execution order for mutate guardrails. Lower values run first. Only applicable when operation is mutate. """ enforcing_strategy: EnforcingStrategy diff --git a/src/truefoundry_sdk/types/prompt_foo_guardrail_config_operation.py b/src/truefoundry_sdk/types/google_model_armor_guardrail_config_operation.py similarity index 72% rename from src/truefoundry_sdk/types/prompt_foo_guardrail_config_operation.py rename to src/truefoundry_sdk/types/google_model_armor_guardrail_config_operation.py index c0e48d5c..1ac90017 100644 --- a/src/truefoundry_sdk/types/prompt_foo_guardrail_config_operation.py +++ b/src/truefoundry_sdk/types/google_model_armor_guardrail_config_operation.py @@ -7,20 +7,20 @@ T_Result = typing.TypeVar("T_Result") -class PromptFooGuardrailConfigOperation(enum.StrEnum): +class GoogleModelArmorGuardrailConfigOperation(enum.StrEnum): """ The operation type to use for the Guardrail. Validate guardrails are used to validate requests and mutate can validate as well as mutate requests. """ VALIDATE = "validate" MUTATE = "mutate" - _UNKNOWN = "__PROMPTFOOGUARDRAILCONFIGOPERATION_UNKNOWN__" + _UNKNOWN = "__GOOGLEMODELARMORGUARDRAILCONFIGOPERATION_UNKNOWN__" """ This member is used for forward compatibility. If the value is not recognized by the enum, it will be stored here, and the raw value is accessible through `.value`. """ @classmethod - def _missing_(cls, value: typing.Any) -> "PromptFooGuardrailConfigOperation": + def _missing_(cls, value: typing.Any) -> "GoogleModelArmorGuardrailConfigOperation": unknown = cls._UNKNOWN unknown._value_ = value return unknown @@ -31,8 +31,8 @@ def visit( mutate: typing.Callable[[], T_Result], _unknown_member: typing.Callable[[str], T_Result], ) -> T_Result: - if self is PromptFooGuardrailConfigOperation.VALIDATE: + if self is GoogleModelArmorGuardrailConfigOperation.VALIDATE: return validate() - if self is PromptFooGuardrailConfigOperation.MUTATE: + if self is GoogleModelArmorGuardrailConfigOperation.MUTATE: return mutate() return _unknown_member(self._value_) diff --git a/src/truefoundry_sdk/types/google_vertex_provider_account.py b/src/truefoundry_sdk/types/google_vertex_provider_account.py index eecb302f..568e2d83 100644 --- a/src/truefoundry_sdk/types/google_vertex_provider_account.py +++ b/src/truefoundry_sdk/types/google_vertex_provider_account.py @@ -45,9 +45,9 @@ class GoogleVertexProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/graph.py b/src/truefoundry_sdk/types/graph.py index f6f4e0d5..a2dafb01 100644 --- a/src/truefoundry_sdk/types/graph.py +++ b/src/truefoundry_sdk/types/graph.py @@ -25,13 +25,9 @@ class Graph(UniversalBaseModel): Chart name """ - chart_type: typing_extensions.Annotated[GraphChartType, FieldMetadata(alias="chartType")] = pydantic.Field( - alias="chartType" - ) - """ - Chart type - """ - + chart_type: typing_extensions.Annotated[ + GraphChartType, FieldMetadata(alias="chartType"), pydantic.Field(alias="chartType", description="Chart type") + ] params: str = pydantic.Field() """ Chart params diff --git a/src/truefoundry_sdk/types/groq_provider_account.py b/src/truefoundry_sdk/types/groq_provider_account.py index 88c726a4..187262ef 100644 --- a/src/truefoundry_sdk/types/groq_provider_account.py +++ b/src/truefoundry_sdk/types/groq_provider_account.py @@ -38,9 +38,9 @@ class GroqProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/guardrail_config_group.py b/src/truefoundry_sdk/types/guardrail_config_group.py index 0c8083de..1f178721 100644 --- a/src/truefoundry_sdk/types/guardrail_config_group.py +++ b/src/truefoundry_sdk/types/guardrail_config_group.py @@ -39,9 +39,9 @@ class GuardrailConfigGroup(UniversalBaseModel): List of Guardrail Configs, which are part of this Guardrail Config Group. """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/guardrail_config_integrations.py b/src/truefoundry_sdk/types/guardrail_config_integrations.py index f85b1f16..ee475406 100644 --- a/src/truefoundry_sdk/types/guardrail_config_integrations.py +++ b/src/truefoundry_sdk/types/guardrail_config_integrations.py @@ -2,6 +2,7 @@ import typing +from .akto_guardrail_config import AktoGuardrailConfig from .aws_bedrock_guardrail_config import AwsBedrockGuardrailConfig from .azure_content_safety_guardrail_config import AzureContentSafetyGuardrailConfig from .azure_pii_guardrail_config import AzurePiiGuardrailConfig @@ -18,13 +19,13 @@ from .palo_alto_prisma_airs_guardrail_config import PaloAltoPrismaAirsGuardrailConfig from .pangea_guardrail_config import PangeaGuardrailConfig from .patronus_guardrail_config import PatronusGuardrailConfig -from .prompt_foo_guardrail_config import PromptFooGuardrailConfig from .regex_guardrail_config import RegexGuardrailConfig from .secret_detection_guardrail_config import SecretDetectionGuardrailConfig from .sql_sanitizer_guardrail_config import SqlSanitizerGuardrailConfig from .tfy_content_moderation_guardrail_config import TfyContentModerationGuardrailConfig from .tfy_pii_guardrail_config import TfyPiiGuardrailConfig from .tfy_prompt_injection_guardrail_config import TfyPromptInjectionGuardrailConfig +from .troj_ai_guardrail_config import TrojAiGuardrailConfig GuardrailConfigIntegrations = typing.Union[ OpenAiModerationsGuardrailConfig, @@ -35,7 +36,6 @@ AzurePromptShieldGuardrailConfig, EnkryptAiGuardrailConfig, PaloAltoPrismaAirsGuardrailConfig, - PromptFooGuardrailConfig, FiddlerGuardrailConfig, PangeaGuardrailConfig, PatronusGuardrailConfig, @@ -50,4 +50,6 @@ OpaGuardrailConfig, GoogleModelArmorGuardrailConfig, GraySwanCygnalGuardrailConfig, + AktoGuardrailConfig, + TrojAiGuardrailConfig, ] diff --git a/src/truefoundry_sdk/types/hashicorp_app_role_auth.py b/src/truefoundry_sdk/types/hashicorp_app_role_auth.py new file mode 100644 index 00000000..1f233987 --- /dev/null +++ b/src/truefoundry_sdk/types/hashicorp_app_role_auth.py @@ -0,0 +1,35 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class HashicorpAppRoleAuth(UniversalBaseModel): + """ + Role ID and secret ID from your AppRole. Token policies must allow KV v2 data and metadata on this mount for your root path, secret paths, and the connection check. + """ + + type: typing.Literal["approle"] = pydantic.Field(default="approle") + """ + +value=approle + """ + + role_id: str = pydantic.Field() + """ + AppRole role ID for Vault authentication. + """ + + secret_id: str = pydantic.Field() + """ + AppRole secret ID for Vault authentication. + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/hashicorp_provider_account.py b/src/truefoundry_sdk/types/hashicorp_provider_account.py index 106495b7..54f3b3ec 100644 --- a/src/truefoundry_sdk/types/hashicorp_provider_account.py +++ b/src/truefoundry_sdk/types/hashicorp_provider_account.py @@ -30,9 +30,9 @@ class HashicorpProviderAccount(UniversalBaseModel): List of integrations that are associated with the HashiCorp Vault provider account. """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/hashicorp_token_auth.py b/src/truefoundry_sdk/types/hashicorp_token_auth.py index f225c954..614cae84 100644 --- a/src/truefoundry_sdk/types/hashicorp_token_auth.py +++ b/src/truefoundry_sdk/types/hashicorp_token_auth.py @@ -8,7 +8,7 @@ class HashicorpTokenAuth(UniversalBaseModel): """ - Auth Data + Vault Token Auth """ type: typing.Literal["token"] = pydantic.Field(default="token") diff --git a/src/truefoundry_sdk/types/hashicorp_vault_integration.py b/src/truefoundry_sdk/types/hashicorp_vault_integration.py index 4bb1fb8d..2c895a67 100644 --- a/src/truefoundry_sdk/types/hashicorp_vault_integration.py +++ b/src/truefoundry_sdk/types/hashicorp_vault_integration.py @@ -4,7 +4,7 @@ import pydantic from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel -from .hashicorp_token_auth import HashicorpTokenAuth +from .hashicorp_vault_integration_auth_data import HashicorpVaultIntegrationAuthData class HashicorpVaultIntegration(UniversalBaseModel): @@ -29,12 +29,17 @@ class HashicorpVaultIntegration(UniversalBaseModel): The URL of the HashiCorp Vault server (e.g., https://vault.example.com:8200). """ - kv_mount_path: typing.Optional[str] = pydantic.Field(default=None) + kv_mount_path: str = pydantic.Field() """ - Mount path of the KV v2 engine vault to use for secrets. The default value is tfy-secrets + Mount path of the KV v2 engine vault to use for secrets. + """ + + root_path: typing.Optional[str] = None + auth_data: HashicorpVaultIntegrationAuthData = pydantic.Field() + """ + Authentication data for the Vault integration. """ - auth_data: HashicorpTokenAuth authorized_subjects: typing.Optional[typing.List[str]] = pydantic.Field(default=None) """ List of subjects that are authorized to access this integration. List of user fqn in format :. diff --git a/src/truefoundry_sdk/types/hashicorp_vault_integration_auth_data.py b/src/truefoundry_sdk/types/hashicorp_vault_integration_auth_data.py new file mode 100644 index 00000000..770facba --- /dev/null +++ b/src/truefoundry_sdk/types/hashicorp_vault_integration_auth_data.py @@ -0,0 +1,8 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +from .hashicorp_app_role_auth import HashicorpAppRoleAuth +from .hashicorp_token_auth import HashicorpTokenAuth + +HashicorpVaultIntegrationAuthData = typing.Union[HashicorpTokenAuth, HashicorpAppRoleAuth] diff --git a/src/truefoundry_sdk/types/headers_override.py b/src/truefoundry_sdk/types/headers_override.py new file mode 100644 index 00000000..63b3f548 --- /dev/null +++ b/src/truefoundry_sdk/types/headers_override.py @@ -0,0 +1,33 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +import typing_extensions +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from ..core.serialization import FieldMetadata + + +class HeadersOverride(UniversalBaseModel): + """ + Headers Override + """ + + remove: typing.Optional[typing.List[str]] = pydantic.Field(default=None) + """ + List of headers to remove from upstream request + """ + + set_: typing_extensions.Annotated[ + typing.Optional[typing.Dict[str, str]], + FieldMetadata(alias="set"), + pydantic.Field(alias="set", description="Headers to add or overwrite in upstream request"), + ] = None + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/helm.py b/src/truefoundry_sdk/types/helm.py index b4b11802..ac70553f 100644 --- a/src/truefoundry_sdk/types/helm.py +++ b/src/truefoundry_sdk/types/helm.py @@ -38,8 +38,10 @@ class Helm(UniversalBaseModel): kustomize: typing.Optional[Kustomize] = None ignore_differences: typing_extensions.Annotated[ - typing.Optional[typing.List[typing.Dict[str, typing.Any]]], FieldMetadata(alias="ignoreDifferences") - ] = pydantic.Field(alias="ignoreDifferences", default=None) + typing.Optional[typing.List[typing.Dict[str, typing.Any]]], + FieldMetadata(alias="ignoreDifferences"), + pydantic.Field(alias="ignoreDifferences"), + ] = None workspace_fqn: typing.Optional[str] = pydantic.Field(default=None) """ Fully qualified name of the workspace diff --git a/src/truefoundry_sdk/types/http_error.py b/src/truefoundry_sdk/types/http_error.py index ab62b042..5f9fbe76 100644 --- a/src/truefoundry_sdk/types/http_error.py +++ b/src/truefoundry_sdk/types/http_error.py @@ -10,13 +10,9 @@ class HttpError(UniversalBaseModel): - status_code: typing_extensions.Annotated[int, FieldMetadata(alias="statusCode")] = pydantic.Field( - alias="statusCode" - ) - """ - HTTP Status Code - """ - + status_code: typing_extensions.Annotated[ + int, FieldMetadata(alias="statusCode"), pydantic.Field(alias="statusCode", description="HTTP Status Code") + ] message: str = pydantic.Field() """ Error Message diff --git a/src/truefoundry_sdk/types/i_change.py b/src/truefoundry_sdk/types/i_change.py index f65921f0..97ec6c12 100644 --- a/src/truefoundry_sdk/types/i_change.py +++ b/src/truefoundry_sdk/types/i_change.py @@ -16,8 +16,8 @@ class IChange(UniversalBaseModel): key: str value: typing.Optional[typing.Dict[str, typing.Any]] = None old_value: typing_extensions.Annotated[ - typing.Optional[typing.Dict[str, typing.Any]], FieldMetadata(alias="oldValue") - ] = pydantic.Field(alias="oldValue", default=None) + typing.Optional[typing.Dict[str, typing.Any]], FieldMetadata(alias="oldValue"), pydantic.Field(alias="oldValue") + ] = None changes: typing.Optional[typing.List["IChange"]] = None if IS_PYDANTIC_V2: diff --git a/src/truefoundry_sdk/types/internal_artifact_version.py b/src/truefoundry_sdk/types/internal_artifact_version.py index 4770e41d..2d1dd46f 100644 --- a/src/truefoundry_sdk/types/internal_artifact_version.py +++ b/src/truefoundry_sdk/types/internal_artifact_version.py @@ -10,18 +10,74 @@ class InternalArtifactVersion(UniversalBaseModel): - id: str - fqn: str - created_by_subject: Subject - created_at: typing.Optional[dt.datetime] = None - updated_at: typing.Optional[dt.datetime] = None - manifest: ArtifactManifest - usage_code_snippet: typing.Optional[str] = None - ml_repo_id: str - tags: typing.Optional[typing.List[str]] = None - artifact_id: str - artifact_fqn: str - artifact_size: typing.Optional[int] = None + """ + Tags, optional version alias, and SDK usage snippet (models, prompts, generic artifacts). + """ + + id: str = pydantic.Field() + """ + Unique identifier for the artifact version + """ + + fqn: str = pydantic.Field() + """ + Fully qualified name of the artifact version in the format '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}:{version}' + """ + + created_by_subject: Subject = pydantic.Field() + """ + Subject (user, team, or service account) that created this artifact version + """ + + created_at: typing.Optional[dt.datetime] = pydantic.Field(default=None) + """ + Timestamp when the artifact version was created + """ + + updated_at: typing.Optional[dt.datetime] = pydantic.Field(default=None) + """ + Timestamp when the artifact version was last updated + """ + + manifest: ArtifactManifest = pydantic.Field() + """ + Manifest containing metadata for a generic artifact version + """ + + ml_repo_id: str = pydantic.Field() + """ + ID of the ML Repo that this artifact version belongs to + """ + + tags: typing.Optional[typing.List[str]] = pydantic.Field(default=None) + """ + List of tags associated with this artifact version for filtering and organization + """ + + version_alias: typing.Optional[str] = pydantic.Field(default=None) + """ + Optional human-readable version alias (e.g. v1.0.0) + """ + + usage_code_snippet: typing.Optional[str] = pydantic.Field(default=None) + """ + Code snippet demonstrating how to use this artifact version + """ + + artifact_id: str = pydantic.Field() + """ + ID of the parent artifact that this version belongs to + """ + + artifact_fqn: str = pydantic.Field() + """ + Fully qualified name of the parent artifact (internal use only) + """ + + artifact_size: typing.Optional[int] = pydantic.Field(default=None) + """ + Total size of the artifact version in bytes (internal use only) + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/internal_list_artifact_versions_response.py b/src/truefoundry_sdk/types/internal_list_artifact_versions_response.py index f0ad0d1a..2fd66186 100644 --- a/src/truefoundry_sdk/types/internal_list_artifact_versions_response.py +++ b/src/truefoundry_sdk/types/internal_list_artifact_versions_response.py @@ -9,8 +9,15 @@ class InternalListArtifactVersionsResponse(UniversalBaseModel): - data: typing.List[InternalListArtifactVersionsResponseDataItem] - pagination: Pagination + data: typing.List[InternalListArtifactVersionsResponseDataItem] = pydantic.Field() + """ + List of artifact versions and model versions with internal metadata + """ + + pagination: Pagination = pydantic.Field() + """ + Pagination information including total count, offset, and limit + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/internal_model_version.py b/src/truefoundry_sdk/types/internal_model_version.py index 626a6ddd..38f70fea 100644 --- a/src/truefoundry_sdk/types/internal_model_version.py +++ b/src/truefoundry_sdk/types/internal_model_version.py @@ -11,20 +11,84 @@ class InternalModelVersion(UniversalBaseModel): - id: str - fqn: str - created_by_subject: Subject - created_at: typing.Optional[dt.datetime] = None - updated_at: typing.Optional[dt.datetime] = None - manifest: ModelManifest - usage_code_snippet: typing.Optional[str] = None - ml_repo_id: str - tags: typing.Optional[typing.List[str]] = None - model_id: str - metrics: typing.Optional[typing.List[Metric]] = None - deployable: typing.Optional[bool] = False - artifact_fqn: str - artifact_size: typing.Optional[int] = None + """ + Tags, optional version alias, and SDK usage snippet (models, prompts, generic artifacts). + """ + + id: str = pydantic.Field() + """ + Unique identifier for the artifact version + """ + + fqn: str = pydantic.Field() + """ + Fully qualified name of the artifact version in the format '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}:{version}' + """ + + created_by_subject: Subject = pydantic.Field() + """ + Subject (user, team, or service account) that created this artifact version + """ + + created_at: typing.Optional[dt.datetime] = pydantic.Field(default=None) + """ + Timestamp when the artifact version was created + """ + + updated_at: typing.Optional[dt.datetime] = pydantic.Field(default=None) + """ + Timestamp when the artifact version was last updated + """ + + manifest: ModelManifest = pydantic.Field() + """ + Manifest containing metadata specific to the model version + """ + + ml_repo_id: str = pydantic.Field() + """ + ID of the ML Repo that this artifact version belongs to + """ + + tags: typing.Optional[typing.List[str]] = pydantic.Field(default=None) + """ + List of tags associated with this artifact version for filtering and organization + """ + + version_alias: typing.Optional[str] = pydantic.Field(default=None) + """ + Optional human-readable version alias (e.g. v1.0.0) + """ + + usage_code_snippet: typing.Optional[str] = pydantic.Field(default=None) + """ + Code snippet demonstrating how to use this artifact version + """ + + model_id: str = pydantic.Field() + """ + ID of the parent model that this version belongs to + """ + + metrics: typing.Optional[typing.List[Metric]] = pydantic.Field(default=None) + """ + List of metrics associated with this model version + """ + + deployable: typing.Optional[bool] = pydantic.Field(default=False) + """ + Whether this model version is ready for deployment + """ + + artifact_fqn: str = pydantic.Field() + """ + Fully qualified name of the parent model (internal use only) + """ + + artifact_size: typing.Optional[int] = pydantic.Field(default=None) + """ + Total size of the model version in bytes (internal use only) + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/is_cluster_connected_response.py b/src/truefoundry_sdk/types/is_cluster_connected_response.py index 965b09bc..00caba99 100644 --- a/src/truefoundry_sdk/types/is_cluster_connected_response.py +++ b/src/truefoundry_sdk/types/is_cluster_connected_response.py @@ -9,12 +9,11 @@ class IsClusterConnectedResponse(UniversalBaseModel): - is_connected: typing_extensions.Annotated[bool, FieldMetadata(alias="isConnected")] = pydantic.Field( - alias="isConnected" - ) - """ - Whether the cluster is connected - """ + is_connected: typing_extensions.Annotated[ + bool, + FieldMetadata(alias="isConnected"), + pydantic.Field(alias="isConnected", description="Whether the cluster is connected"), + ] if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/jfrog_provider_account.py b/src/truefoundry_sdk/types/jfrog_provider_account.py index 81a76b9f..eda2ca18 100644 --- a/src/truefoundry_sdk/types/jfrog_provider_account.py +++ b/src/truefoundry_sdk/types/jfrog_provider_account.py @@ -37,9 +37,9 @@ class JfrogProviderAccount(UniversalBaseModel): List of integrations that are associated with the provider account. """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/job_run.py b/src/truefoundry_sdk/types/job_run.py index 25c7a0f5..0d939b53 100644 --- a/src/truefoundry_sdk/types/job_run.py +++ b/src/truefoundry_sdk/types/job_run.py @@ -21,32 +21,24 @@ class JobRun(UniversalBaseModel): JobRun Name """ - application_name: typing_extensions.Annotated[str, FieldMetadata(alias="applicationName")] = pydantic.Field( - alias="applicationName" - ) - """ - Application Name - """ - - deployment_version: typing_extensions.Annotated[str, FieldMetadata(alias="deploymentVersion")] = pydantic.Field( - alias="deploymentVersion" - ) - """ - Deployment Version - """ - - created_at: typing_extensions.Annotated[float, FieldMetadata(alias="createdAt")] = pydantic.Field(alias="createdAt") - """ - Created At - """ - - end_time: typing_extensions.Annotated[typing.Optional[float], FieldMetadata(alias="endTime")] = pydantic.Field( - alias="endTime", default=None - ) - """ - End Time of JobRun - """ - + application_name: typing_extensions.Annotated[ + str, + FieldMetadata(alias="applicationName"), + pydantic.Field(alias="applicationName", description="Application Name"), + ] + deployment_version: typing_extensions.Annotated[ + str, + FieldMetadata(alias="deploymentVersion"), + pydantic.Field(alias="deploymentVersion", description="Deployment Version"), + ] + created_at: typing_extensions.Annotated[ + float, FieldMetadata(alias="createdAt"), pydantic.Field(alias="createdAt", description="Created At") + ] + end_time: typing_extensions.Annotated[ + typing.Optional[float], + FieldMetadata(alias="endTime"), + pydantic.Field(alias="endTime", description="End Time of JobRun"), + ] = None duration: typing.Optional[int] = pydantic.Field(default=None) """ Duration of JobRun @@ -57,13 +49,9 @@ class JobRun(UniversalBaseModel): Command """ - total_retries: typing_extensions.Annotated[int, FieldMetadata(alias="totalRetries")] = pydantic.Field( - alias="totalRetries" - ) - """ - Total Retries - """ - + total_retries: typing_extensions.Annotated[ + int, FieldMetadata(alias="totalRetries"), pydantic.Field(alias="totalRetries", description="Total Retries") + ] error: typing.Optional[str] = pydantic.Field(default=None) """ Error @@ -74,54 +62,39 @@ class JobRun(UniversalBaseModel): Status of JobRun """ - triggered_by: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="triggeredBy")] = ( - pydantic.Field(alias="triggeredBy", default=None) - ) - """ - Triggered By - """ - + triggered_by: typing_extensions.Annotated[ + typing.Optional[str], + FieldMetadata(alias="triggeredBy"), + pydantic.Field(alias="triggeredBy", description="Triggered By"), + ] = None triggered_by_subject: typing_extensions.Annotated[ - typing.Optional[Subject], FieldMetadata(alias="triggeredBySubject") - ] = pydantic.Field(alias="triggeredBySubject", default=None) - """ - Triggered By Subject - """ - - exit_code: typing_extensions.Annotated[typing.Optional[int], FieldMetadata(alias="exitCode")] = pydantic.Field( - alias="exitCode", default=None - ) - """ - Exit Code - """ - - spark_ui: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="sparkUi")] = pydantic.Field( - alias="sparkUi", default=None - ) - """ - Spark UI Url - """ - - application_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="applicationId")] = ( - pydantic.Field(alias="applicationId", default=None) - ) - """ - Application ID - """ - - deployment_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="deploymentId")] = ( - pydantic.Field(alias="deploymentId", default=None) - ) - """ - Deployment ID - """ - - tenant_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="tenantName")] = pydantic.Field( - alias="tenantName", default=None - ) - """ - Tenant Name - """ + typing.Optional[Subject], + FieldMetadata(alias="triggeredBySubject"), + pydantic.Field(alias="triggeredBySubject", description="Triggered By Subject"), + ] = None + exit_code: typing_extensions.Annotated[ + typing.Optional[int], FieldMetadata(alias="exitCode"), pydantic.Field(alias="exitCode", description="Exit Code") + ] = None + spark_ui: typing_extensions.Annotated[ + typing.Optional[str], + FieldMetadata(alias="sparkUi"), + pydantic.Field(alias="sparkUi", description="Spark UI Url"), + ] = None + application_id: typing_extensions.Annotated[ + typing.Optional[str], + FieldMetadata(alias="applicationId"), + pydantic.Field(alias="applicationId", description="Application ID"), + ] = None + deployment_id: typing_extensions.Annotated[ + typing.Optional[str], + FieldMetadata(alias="deploymentId"), + pydantic.Field(alias="deploymentId", description="Deployment ID"), + ] = None + tenant_name: typing_extensions.Annotated[ + typing.Optional[str], + FieldMetadata(alias="tenantName"), + pydantic.Field(alias="tenantName", description="Tenant Name"), + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/json_schema.py b/src/truefoundry_sdk/types/json_schema.py index 5c6fce32..831dfb32 100644 --- a/src/truefoundry_sdk/types/json_schema.py +++ b/src/truefoundry_sdk/types/json_schema.py @@ -18,12 +18,11 @@ class JsonSchema(UniversalBaseModel): Name of the schema """ - schema_: typing_extensions.Annotated[typing.Dict[str, typing.Any], FieldMetadata(alias="schema")] = pydantic.Field( - alias="schema" - ) - """ - JSON schema object defining the expected structure - """ + schema_: typing_extensions.Annotated[ + typing.Dict[str, typing.Any], + FieldMetadata(alias="schema"), + pydantic.Field(alias="schema", description="JSON schema object defining the expected structure"), + ] if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/jwt.py b/src/truefoundry_sdk/types/jwt.py index 9074fb3f..225d4e88 100644 --- a/src/truefoundry_sdk/types/jwt.py +++ b/src/truefoundry_sdk/types/jwt.py @@ -11,18 +11,18 @@ class Jwt(UniversalBaseModel): id: str - subject_type: typing_extensions.Annotated[str, FieldMetadata(alias="subjectType")] = pydantic.Field( - alias="subjectType" - ) - subject_id: typing_extensions.Annotated[str, FieldMetadata(alias="subjectId")] = pydantic.Field(alias="subjectId") + subject_type: typing_extensions.Annotated[ + str, FieldMetadata(alias="subjectType"), pydantic.Field(alias="subjectType") + ] + subject_id: typing_extensions.Annotated[str, FieldMetadata(alias="subjectId"), pydantic.Field(alias="subjectId")] metadata: typing.Optional[typing.Dict[str, typing.Any]] = None expiry: dt.datetime - created_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="createdAt")] = pydantic.Field( - alias="createdAt" - ) - updated_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="updatedAt")] = pydantic.Field( - alias="updatedAt" - ) + created_at: typing_extensions.Annotated[ + dt.datetime, FieldMetadata(alias="createdAt"), pydantic.Field(alias="createdAt") + ] + updated_at: typing_extensions.Annotated[ + dt.datetime, FieldMetadata(alias="updatedAt"), pydantic.Field(alias="updatedAt") + ] if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/latency_based_load_balance_target.py b/src/truefoundry_sdk/types/latency_based_load_balance_target.py index abf58d70..f2366fca 100644 --- a/src/truefoundry_sdk/types/latency_based_load_balance_target.py +++ b/src/truefoundry_sdk/types/latency_based_load_balance_target.py @@ -4,6 +4,7 @@ import pydantic from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .headers_override import HeadersOverride from .retry_config import RetryConfig @@ -33,6 +34,12 @@ class LatencyBasedLoadBalanceTarget(UniversalBaseModel): Optional parameters to override in the request """ + headers_override: typing.Optional[HeadersOverride] = None + metadata_match: typing.Optional[typing.Dict[str, str]] = pydantic.Field(default=None) + """ + Optional metadata key-value pairs that must match incoming request metadata headers for this target to be considered for routing. + """ + if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 else: diff --git a/src/truefoundry_sdk/types/legacy_agent_manifest.py b/src/truefoundry_sdk/types/legacy_agent_manifest.py new file mode 100644 index 00000000..60f8ede5 --- /dev/null +++ b/src/truefoundry_sdk/types/legacy_agent_manifest.py @@ -0,0 +1,52 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +import typing_extensions +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from ..core.serialization import FieldMetadata +from .agent_source import AgentSource +from .collaborator import Collaborator +from .owned_by import OwnedBy +from .sample_agent_input import SampleAgentInput + + +class LegacyAgentManifest(UniversalBaseModel): + type: typing.Literal["agent"] = pydantic.Field(default="agent") + """ + Type of the manifest + """ + + name: str = pydantic.Field() + """ + The name of the Agent + """ + + description: str = pydantic.Field() + """ + The description of the Agent + """ + + source: AgentSource + collaborators: typing.List[Collaborator] = pydantic.Field() + """ + List of users who have access to this Agent + """ + + sample_inputs: typing.Optional[typing.List[SampleAgentInput]] = pydantic.Field(default=None) + """ + Sample inputs for your agent. These inputs are shown as an example in the "Agent Chat" page. (Click on Try Now in the agent listing page) + """ + + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/list_agent_skill_versions_response.py b/src/truefoundry_sdk/types/list_agent_skill_versions_response.py new file mode 100644 index 00000000..a0d44eb7 --- /dev/null +++ b/src/truefoundry_sdk/types/list_agent_skill_versions_response.py @@ -0,0 +1,28 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_skill_version import AgentSkillVersion +from .pagination import Pagination + + +class ListAgentSkillVersionsResponse(UniversalBaseModel): + data: typing.List[AgentSkillVersion] = pydantic.Field() + """ + List of agent skill versions + """ + + pagination: Pagination = pydantic.Field() + """ + Pagination information + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/list_agent_skills_response.py b/src/truefoundry_sdk/types/list_agent_skills_response.py new file mode 100644 index 00000000..b8e55066 --- /dev/null +++ b/src/truefoundry_sdk/types/list_agent_skills_response.py @@ -0,0 +1,28 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .agent_skill import AgentSkill +from .pagination import Pagination + + +class ListAgentSkillsResponse(UniversalBaseModel): + data: typing.List[AgentSkill] = pydantic.Field() + """ + List of agent skills matching the query + """ + + pagination: Pagination = pydantic.Field() + """ + Pagination information + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/list_artifact_versions_response.py b/src/truefoundry_sdk/types/list_artifact_versions_response.py index caaa91c1..6f167801 100644 --- a/src/truefoundry_sdk/types/list_artifact_versions_response.py +++ b/src/truefoundry_sdk/types/list_artifact_versions_response.py @@ -9,8 +9,15 @@ class ListArtifactVersionsResponse(UniversalBaseModel): - data: typing.List[ArtifactVersion] - pagination: Pagination + data: typing.List[ArtifactVersion] = pydantic.Field() + """ + List of artifact versions matching the query + """ + + pagination: Pagination = pydantic.Field() + """ + Pagination information including total count, offset, and limit + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/list_artifacts_response.py b/src/truefoundry_sdk/types/list_artifacts_response.py index f6b2654f..84c9eb8c 100644 --- a/src/truefoundry_sdk/types/list_artifacts_response.py +++ b/src/truefoundry_sdk/types/list_artifacts_response.py @@ -9,8 +9,15 @@ class ListArtifactsResponse(UniversalBaseModel): - data: typing.List[Artifact] - pagination: Pagination + data: typing.List[Artifact] = pydantic.Field() + """ + List of artifacts matching the query + """ + + pagination: Pagination = pydantic.Field() + """ + Pagination information including total count, offset, and limit + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/list_data_directories_response.py b/src/truefoundry_sdk/types/list_data_directories_response.py index 7bc08ac3..56946acb 100644 --- a/src/truefoundry_sdk/types/list_data_directories_response.py +++ b/src/truefoundry_sdk/types/list_data_directories_response.py @@ -9,8 +9,15 @@ class ListDataDirectoriesResponse(UniversalBaseModel): - data: typing.List[DataDirectory] - pagination: Pagination + data: typing.List[DataDirectory] = pydantic.Field() + """ + List of data directories matching the query + """ + + pagination: Pagination = pydantic.Field() + """ + Pagination information including total count, offset, and limit + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/list_files_request.py b/src/truefoundry_sdk/types/list_files_request.py index 6eb7e4a7..6f29882f 100644 --- a/src/truefoundry_sdk/types/list_files_request.py +++ b/src/truefoundry_sdk/types/list_files_request.py @@ -9,12 +9,26 @@ class ListFilesRequest(UniversalBaseModel): - id: str - path: typing.Optional[str] = None - limit: typing.Optional[int] = None - page_token: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="pageToken")] = pydantic.Field( - alias="pageToken", default=None - ) + id: str = pydantic.Field() + """ + ID of the artifact version to list files from + """ + + path: typing.Optional[str] = pydantic.Field(default=None) + """ + Relative path within the artifact version to list files from (defaults to root) + """ + + limit: typing.Optional[int] = pydantic.Field(default=None) + """ + Maximum number of files/directories to return + """ + + page_token: typing_extensions.Annotated[ + typing.Optional[str], + FieldMetadata(alias="pageToken"), + pydantic.Field(alias="pageToken", description="Token to retrieve the next page of results"), + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/list_files_response.py b/src/truefoundry_sdk/types/list_files_response.py index 5bae2987..83320f09 100644 --- a/src/truefoundry_sdk/types/list_files_response.py +++ b/src/truefoundry_sdk/types/list_files_response.py @@ -9,8 +9,15 @@ class ListFilesResponse(UniversalBaseModel): - data: typing.List[FileInfo] - pagination: TokenPagination + data: typing.List[FileInfo] = pydantic.Field() + """ + List of files and directories in the artifact version + """ + + pagination: TokenPagination = pydantic.Field() + """ + Pagination information including page tokens for navigation + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/list_ml_repos_response.py b/src/truefoundry_sdk/types/list_ml_repos_response.py index 9f570dae..da42f063 100644 --- a/src/truefoundry_sdk/types/list_ml_repos_response.py +++ b/src/truefoundry_sdk/types/list_ml_repos_response.py @@ -9,8 +9,15 @@ class ListMlReposResponse(UniversalBaseModel): - data: typing.List[MlRepo] - pagination: Pagination + data: typing.List[MlRepo] = pydantic.Field() + """ + List of ML Repos matching the query + """ + + pagination: Pagination = pydantic.Field() + """ + Pagination information including total count, offset, and limit + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/list_model_versions_response.py b/src/truefoundry_sdk/types/list_model_versions_response.py index fdb7f8af..273f1e19 100644 --- a/src/truefoundry_sdk/types/list_model_versions_response.py +++ b/src/truefoundry_sdk/types/list_model_versions_response.py @@ -9,8 +9,15 @@ class ListModelVersionsResponse(UniversalBaseModel): - data: typing.List[ModelVersion] - pagination: Pagination + data: typing.List[ModelVersion] = pydantic.Field() + """ + List of model versions matching the query + """ + + pagination: Pagination = pydantic.Field() + """ + Pagination information including total count, offset, and limit + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/list_models_response.py b/src/truefoundry_sdk/types/list_models_response.py index c9bc0715..513e4914 100644 --- a/src/truefoundry_sdk/types/list_models_response.py +++ b/src/truefoundry_sdk/types/list_models_response.py @@ -9,8 +9,15 @@ class ListModelsResponse(UniversalBaseModel): - data: typing.List[Model] - pagination: Pagination + data: typing.List[Model] = pydantic.Field() + """ + List of models matching the query + """ + + pagination: Pagination = pydantic.Field() + """ + Pagination information including total count, offset, and limit + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/list_prompt_versions_response.py b/src/truefoundry_sdk/types/list_prompt_versions_response.py index 991f8155..3db5a1ef 100644 --- a/src/truefoundry_sdk/types/list_prompt_versions_response.py +++ b/src/truefoundry_sdk/types/list_prompt_versions_response.py @@ -9,8 +9,15 @@ class ListPromptVersionsResponse(UniversalBaseModel): - data: typing.List[PromptVersion] - pagination: Pagination + data: typing.List[PromptVersion] = pydantic.Field() + """ + List of prompt versions matching the query + """ + + pagination: Pagination = pydantic.Field() + """ + Pagination information including total count, offset, and limit + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/list_prompts_response.py b/src/truefoundry_sdk/types/list_prompts_response.py index bcb62329..af97d14f 100644 --- a/src/truefoundry_sdk/types/list_prompts_response.py +++ b/src/truefoundry_sdk/types/list_prompts_response.py @@ -9,8 +9,15 @@ class ListPromptsResponse(UniversalBaseModel): - data: typing.List[Prompt] - pagination: Pagination + data: typing.List[Prompt] = pydantic.Field() + """ + List of prompts matching the query + """ + + pagination: Pagination = pydantic.Field() + """ + Pagination information including total count, offset, and limit + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/load_balance_target.py b/src/truefoundry_sdk/types/load_balance_target.py index 872ca1d9..b1885521 100644 --- a/src/truefoundry_sdk/types/load_balance_target.py +++ b/src/truefoundry_sdk/types/load_balance_target.py @@ -4,6 +4,7 @@ import pydantic from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .headers_override import HeadersOverride from .retry_config import RetryConfig @@ -38,6 +39,12 @@ class LoadBalanceTarget(UniversalBaseModel): Optional parameters to override in the request """ + headers_override: typing.Optional[HeadersOverride] = None + metadata_match: typing.Optional[typing.Dict[str, str]] = pydantic.Field(default=None) + """ + Optional metadata key-value pairs that must match incoming request metadata headers for this target to be considered for routing. + """ + if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 else: diff --git a/src/truefoundry_sdk/types/log.py b/src/truefoundry_sdk/types/log.py index 6e4cca73..19b41732 100644 --- a/src/truefoundry_sdk/types/log.py +++ b/src/truefoundry_sdk/types/log.py @@ -29,12 +29,11 @@ class Log(UniversalBaseModel): Log Time """ - container_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="containerName")] = ( - pydantic.Field(alias="containerName", default=None) - ) - """ - Container Name - """ + container_name: typing_extensions.Annotated[ + typing.Optional[str], + FieldMetadata(alias="containerName"), + pydantic.Field(alias="containerName", description="Container Name"), + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/logs_filter_query.py b/src/truefoundry_sdk/types/logs_filter_query.py index 2e60bb2e..4dfc9d7d 100644 --- a/src/truefoundry_sdk/types/logs_filter_query.py +++ b/src/truefoundry_sdk/types/logs_filter_query.py @@ -11,13 +11,11 @@ class LogsFilterQuery(UniversalBaseModel): - match_string: typing_extensions.Annotated[str, FieldMetadata(alias="matchString")] = pydantic.Field( - alias="matchString" - ) - """ - String that needs to be matched - """ - + match_string: typing_extensions.Annotated[ + str, + FieldMetadata(alias="matchString"), + pydantic.Field(alias="matchString", description="String that needs to be matched"), + ] type: LogsFilterQueryType = pydantic.Field() """ query filter type, `regex` or `substring` diff --git a/src/truefoundry_sdk/types/mcp_server_env_auth.py b/src/truefoundry_sdk/types/mcp_server_env_auth.py new file mode 100644 index 00000000..c19c0d63 --- /dev/null +++ b/src/truefoundry_sdk/types/mcp_server_env_auth.py @@ -0,0 +1,36 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .mcp_server_env_auth_auth_level import McpServerEnvAuthAuthLevel + + +class McpServerEnvAuth(UniversalBaseModel): + """ + Environment variable authentication for stdio MCP. For individual credentials, use a single {{placeholder}} name in values (same rules as header auth). + """ + + type: typing.Literal["env"] = pydantic.Field(default="env") + """ + +value=env + """ + + env: typing.Dict[str, str] = pydantic.Field() + """ + Map each env variable to its value. For shared, enter the actual value. For individual, use a placeholder that will be filled in by each user (e.g. API_KEY {{API_KEY}}). + """ + + auth_level: typing.Optional[McpServerEnvAuthAuthLevel] = pydantic.Field(default=None) + """ + Level at which this authentication will be applied. Values: global (default), per_user + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/mcp_server_env_auth_auth_level.py b/src/truefoundry_sdk/types/mcp_server_env_auth_auth_level.py new file mode 100644 index 00000000..670c6036 --- /dev/null +++ b/src/truefoundry_sdk/types/mcp_server_env_auth_auth_level.py @@ -0,0 +1,38 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +from ..core import enum + +T_Result = typing.TypeVar("T_Result") + + +class McpServerEnvAuthAuthLevel(enum.StrEnum): + """ + Level at which this authentication will be applied. Values: global (default), per_user + """ + + GLOBAL = "global" + PER_USER = "per_user" + _UNKNOWN = "__MCPSERVERENVAUTHAUTHLEVEL_UNKNOWN__" + """ + This member is used for forward compatibility. If the value is not recognized by the enum, it will be stored here, and the raw value is accessible through `.value`. + """ + + @classmethod + def _missing_(cls, value: typing.Any) -> "McpServerEnvAuthAuthLevel": + unknown = cls._UNKNOWN + unknown._value_ = value + return unknown + + def visit( + self, + global_: typing.Callable[[], T_Result], + per_user: typing.Callable[[], T_Result], + _unknown_member: typing.Callable[[str], T_Result], + ) -> T_Result: + if self is McpServerEnvAuthAuthLevel.GLOBAL: + return global_() + if self is McpServerEnvAuthAuthLevel.PER_USER: + return per_user() + return _unknown_member(self._value_) diff --git a/src/truefoundry_sdk/types/mcp_server_header_auth.py b/src/truefoundry_sdk/types/mcp_server_header_auth.py index 01c87939..e0c563ca 100644 --- a/src/truefoundry_sdk/types/mcp_server_header_auth.py +++ b/src/truefoundry_sdk/types/mcp_server_header_auth.py @@ -4,11 +4,12 @@ import pydantic from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .mcp_server_header_auth_auth_level import McpServerHeaderAuthAuthLevel class McpServerHeaderAuth(UniversalBaseModel): """ - Static API key or token authentication via request headers. All users share the same credentials. + Authenticate using a static key or token sent as a request header. Choose shared vs individual credentials below. """ type: typing.Literal["header"] = pydantic.Field(default="header") @@ -16,7 +17,15 @@ class McpServerHeaderAuth(UniversalBaseModel): +value=header """ - headers: typing.Dict[str, str] + headers: typing.Dict[str, str] = pydantic.Field() + """ + Map each header name to its value. For shared, enter the actual value. For individual, use a placeholder that will be filled in by each user (e.g. Bearer {{API_KEY}}). + """ + + auth_level: McpServerHeaderAuthAuthLevel = pydantic.Field() + """ + Level at which this authentication will be applied. Values: global (default), per_user + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/mcp_server_header_auth_auth_level.py b/src/truefoundry_sdk/types/mcp_server_header_auth_auth_level.py new file mode 100644 index 00000000..bf3f2e43 --- /dev/null +++ b/src/truefoundry_sdk/types/mcp_server_header_auth_auth_level.py @@ -0,0 +1,38 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +from ..core import enum + +T_Result = typing.TypeVar("T_Result") + + +class McpServerHeaderAuthAuthLevel(enum.StrEnum): + """ + Level at which this authentication will be applied. Values: global (default), per_user + """ + + GLOBAL = "global" + PER_USER = "per_user" + _UNKNOWN = "__MCPSERVERHEADERAUTHAUTHLEVEL_UNKNOWN__" + """ + This member is used for forward compatibility. If the value is not recognized by the enum, it will be stored here, and the raw value is accessible through `.value`. + """ + + @classmethod + def _missing_(cls, value: typing.Any) -> "McpServerHeaderAuthAuthLevel": + unknown = cls._UNKNOWN + unknown._value_ = value + return unknown + + def visit( + self, + global_: typing.Callable[[], T_Result], + per_user: typing.Callable[[], T_Result], + _unknown_member: typing.Callable[[str], T_Result], + ) -> T_Result: + if self is McpServerHeaderAuthAuthLevel.GLOBAL: + return global_() + if self is McpServerHeaderAuthAuthLevel.PER_USER: + return per_user() + return _unknown_member(self._value_) diff --git a/src/truefoundry_sdk/types/mcp_server_manifest.py b/src/truefoundry_sdk/types/mcp_server_manifest.py index 842ef09e..b76d9ba2 100644 --- a/src/truefoundry_sdk/types/mcp_server_manifest.py +++ b/src/truefoundry_sdk/types/mcp_server_manifest.py @@ -4,6 +4,9 @@ from .open_apimcp_server_manifest import OpenApimcpServerManifest from .remote_mcp_server_manifest import RemoteMcpServerManifest +from .stdio_mcp_server_manifest import StdioMcpServerManifest from .virtual_mcp_server_manifest import VirtualMcpServerManifest -McpServerManifest = typing.Union[RemoteMcpServerManifest, VirtualMcpServerManifest, OpenApimcpServerManifest] +McpServerManifest = typing.Union[ + RemoteMcpServerManifest, VirtualMcpServerManifest, OpenApimcpServerManifest, StdioMcpServerManifest +] diff --git a/src/truefoundry_sdk/types/mcp_server_o_auth2.py b/src/truefoundry_sdk/types/mcp_server_o_auth2.py index 0b4688b4..ea267eef 100644 --- a/src/truefoundry_sdk/types/mcp_server_o_auth2.py +++ b/src/truefoundry_sdk/types/mcp_server_o_auth2.py @@ -4,6 +4,7 @@ import pydantic from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .mcp_server_o_auth2grant_type import McpServerOAuth2GrantType from .mcp_server_o_auth2jwt_source import McpServerOAuth2JwtSource @@ -17,7 +18,12 @@ class McpServerOAuth2(UniversalBaseModel): OAuth2 authentication """ - authorization_url: str = pydantic.Field() + grant_type: McpServerOAuth2GrantType = pydantic.Field() + """ + The OAuth2 grant type to use for authentication. + """ + + authorization_url: typing.Optional[str] = pydantic.Field(default=None) """ URL for the authorization request """ diff --git a/src/truefoundry_sdk/types/mcp_server_o_auth2grant_type.py b/src/truefoundry_sdk/types/mcp_server_o_auth2grant_type.py new file mode 100644 index 00000000..184eccd6 --- /dev/null +++ b/src/truefoundry_sdk/types/mcp_server_o_auth2grant_type.py @@ -0,0 +1,38 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +from ..core import enum + +T_Result = typing.TypeVar("T_Result") + + +class McpServerOAuth2GrantType(enum.StrEnum): + """ + The OAuth2 grant type to use for authentication. + """ + + AUTHORIZATION_CODE = "authorization_code" + CLIENT_CREDENTIALS = "client_credentials" + _UNKNOWN = "__MCPSERVEROAUTH2GRANTTYPE_UNKNOWN__" + """ + This member is used for forward compatibility. If the value is not recognized by the enum, it will be stored here, and the raw value is accessible through `.value`. + """ + + @classmethod + def _missing_(cls, value: typing.Any) -> "McpServerOAuth2GrantType": + unknown = cls._UNKNOWN + unknown._value_ = value + return unknown + + def visit( + self, + authorization_code: typing.Callable[[], T_Result], + client_credentials: typing.Callable[[], T_Result], + _unknown_member: typing.Callable[[str], T_Result], + ) -> T_Result: + if self is McpServerOAuth2GrantType.AUTHORIZATION_CODE: + return authorization_code() + if self is McpServerOAuth2GrantType.CLIENT_CREDENTIALS: + return client_credentials() + return _unknown_member(self._value_) diff --git a/src/truefoundry_sdk/types/mcp_server_provider_account.py b/src/truefoundry_sdk/types/mcp_server_provider_account.py index 1fe9283a..38283a98 100644 --- a/src/truefoundry_sdk/types/mcp_server_provider_account.py +++ b/src/truefoundry_sdk/types/mcp_server_provider_account.py @@ -38,9 +38,9 @@ class McpServerProviderAccount(UniversalBaseModel): List of MCP Servers, which are part of this MCP Server Group. """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/mcp_tool_target.py b/src/truefoundry_sdk/types/mcp_tool_target.py new file mode 100644 index 00000000..28f1a422 --- /dev/null +++ b/src/truefoundry_sdk/types/mcp_tool_target.py @@ -0,0 +1,31 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class McpToolTarget(UniversalBaseModel): + name: str = pydantic.Field() + """ + Name of the MCP server + """ + + enable_all_tools: bool = pydantic.Field(default=False) + """ + When enabled, all tools from this MCP server are targeted. Disable to select specific tools. + """ + + enabled_tools: typing.Optional[typing.List[str]] = pydantic.Field(default=None) + """ + List of specific tools to target from this MCP server. + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/mcp_tools_operator.py b/src/truefoundry_sdk/types/mcp_tools_operator.py new file mode 100644 index 00000000..dbc559ad --- /dev/null +++ b/src/truefoundry_sdk/types/mcp_tools_operator.py @@ -0,0 +1,21 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .mcp_tool_target import McpToolTarget +from .mcp_tools_operator_condition import McpToolsOperatorCondition + + +class McpToolsOperator(UniversalBaseModel): + condition: McpToolsOperatorCondition + values: typing.List[McpToolTarget] + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/mcp_tools_operator_condition.py b/src/truefoundry_sdk/types/mcp_tools_operator_condition.py new file mode 100644 index 00000000..b5098e81 --- /dev/null +++ b/src/truefoundry_sdk/types/mcp_tools_operator_condition.py @@ -0,0 +1,34 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +from ..core import enum + +T_Result = typing.TypeVar("T_Result") + + +class McpToolsOperatorCondition(enum.StrEnum): + IN = "in" + NOT_IN = "not_in" + _UNKNOWN = "__MCPTOOLSOPERATORCONDITION_UNKNOWN__" + """ + This member is used for forward compatibility. If the value is not recognized by the enum, it will be stored here, and the raw value is accessible through `.value`. + """ + + @classmethod + def _missing_(cls, value: typing.Any) -> "McpToolsOperatorCondition": + unknown = cls._UNKNOWN + unknown._value_ = value + return unknown + + def visit( + self, + in_: typing.Callable[[], T_Result], + not_in: typing.Callable[[], T_Result], + _unknown_member: typing.Callable[[str], T_Result], + ) -> T_Result: + if self is McpToolsOperatorCondition.IN: + return in_() + if self is McpToolsOperatorCondition.NOT_IN: + return not_in() + return _unknown_member(self._value_) diff --git a/src/truefoundry_sdk/types/metric.py b/src/truefoundry_sdk/types/metric.py index 90f0b0ba..d3db678c 100644 --- a/src/truefoundry_sdk/types/metric.py +++ b/src/truefoundry_sdk/types/metric.py @@ -7,10 +7,25 @@ class Metric(UniversalBaseModel): - key: str - value: typing.Optional[float] = None - timestamp: typing.Optional[int] = None - step: typing.Optional[int] = 0 + key: str = pydantic.Field() + """ + Name of the metric + """ + + value: typing.Optional[float] = pydantic.Field(default=None) + """ + Value of the metric + """ + + timestamp: typing.Optional[int] = pydantic.Field(default=None) + """ + Timestamp when the metric was recorded (epoch milliseconds) + """ + + step: typing.Optional[int] = pydantic.Field(default=0) + """ + Training step number when the metric was recorded + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/mistral_ai_provider_account.py b/src/truefoundry_sdk/types/mistral_ai_provider_account.py index d1c6040a..a8744b7e 100644 --- a/src/truefoundry_sdk/types/mistral_ai_provider_account.py +++ b/src/truefoundry_sdk/types/mistral_ai_provider_account.py @@ -38,9 +38,9 @@ class MistralAiProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/ml_repo_manifest.py b/src/truefoundry_sdk/types/ml_repo_manifest.py index d683374b..0e91d18d 100644 --- a/src/truefoundry_sdk/types/ml_repo_manifest.py +++ b/src/truefoundry_sdk/types/ml_repo_manifest.py @@ -36,9 +36,9 @@ class MlRepoManifest(UniversalBaseModel): Users and Teams that have access to MLRepo """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/model.py b/src/truefoundry_sdk/types/model.py index 8f6d4e27..b9c4e73e 100644 --- a/src/truefoundry_sdk/types/model.py +++ b/src/truefoundry_sdk/types/model.py @@ -10,16 +10,59 @@ class Model(UniversalBaseModel): - id: str - ml_repo_id: str - type: typing.Optional[typing.Literal["model"]] = None - name: str - fqn: str - created_by_subject: Subject - created_at: typing.Optional[dt.datetime] = None - updated_at: typing.Optional[dt.datetime] = None - latest_version: typing.Optional[ModelVersion] = None - run_steps: typing.Optional[typing.List[int]] = None + """ + Generic artifact API DTO including run-step linkage for ML runs. + """ + + id: str = pydantic.Field() + """ + Unique identifier for the artifact + """ + + ml_repo_id: str = pydantic.Field() + """ + ID of the ML Repo that this artifact belongs to + """ + + type: typing.Optional[typing.Literal["model"]] = pydantic.Field(default=None) + """ + Type of the artifact, always 'model' for Model entities + """ + + name: str = pydantic.Field() + """ + Name of the artifact (alphanumeric characters, hyphens, and underscores only, max 256 characters) + """ + + fqn: str = pydantic.Field() + """ + Fully qualified name of the artifact in the format '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}' + """ + + created_by_subject: Subject = pydantic.Field() + """ + Subject (user, team, or service account) that created this artifact + """ + + created_at: typing.Optional[dt.datetime] = pydantic.Field(default=None) + """ + Timestamp when the artifact was created + """ + + updated_at: typing.Optional[dt.datetime] = pydantic.Field(default=None) + """ + Timestamp when the artifact was last updated + """ + + latest_version: typing.Optional[ModelVersion] = pydantic.Field(default=None) + """ + The most recent version of this model + """ + + run_steps: typing.Optional[typing.List[int]] = pydantic.Field(default=None) + """ + List of run step numbers where this artifact was created or updated + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/model_manifest.py b/src/truefoundry_sdk/types/model_manifest.py index 304cdc1a..d47960a2 100644 --- a/src/truefoundry_sdk/types/model_manifest.py +++ b/src/truefoundry_sdk/types/model_manifest.py @@ -16,23 +16,17 @@ class ModelManifest(UniversalBaseModel): name: str = pydantic.Field() """ - Name of the entity + Name of the model (alphanumeric characters, hyphens, and underscores only, max 256 characters) """ - description: typing.Optional[str] = None metadata: typing.Dict[str, typing.Any] = pydantic.Field() """ Key value metadata. Should be valid JSON. For e.g. `{"business-unit": "sales", "quality": "good", "rating": 4.5}` """ - version_alias: typing.Optional[str] = pydantic.Field(default=None) - """ - Version alias is alternate, ideally human readable, version string to reference an artifact version. It should start with `v` followed by alphanumeric and it can include `.` and `-` in between (e.g. `v1.0.0`, `v1-prod`, `v3-dev`, etc) - """ - ml_repo: str = pydantic.Field() """ - Name of the ML Repo + Name of the ML Repo that this model belongs to (must start and end with alphanumeric, 2-100 characters) """ version: typing.Optional[int] = pydantic.Field(default=None) @@ -41,6 +35,12 @@ class ModelManifest(UniversalBaseModel): """ type: typing.Literal["model-version"] = "model-version" + description: typing.Optional[str] = None + version_alias: typing.Optional[str] = pydantic.Field(default=None) + """ + Version alias is alternate, ideally human readable, version string to reference an artifact version. It should start with `v` followed by alphanumeric and it can include `.` and `-` in between (e.g. `v1.0.0`, `v1-prod`, `v3-dev`, etc) + """ + source: ModelManifestSource framework: typing.Optional[ModelManifestFramework] = pydantic.Field(default=None) """ diff --git a/src/truefoundry_sdk/types/model_provider_account.py b/src/truefoundry_sdk/types/model_provider_account.py index fc6d8c18..90697f0b 100644 --- a/src/truefoundry_sdk/types/model_provider_account.py +++ b/src/truefoundry_sdk/types/model_provider_account.py @@ -8,10 +8,12 @@ from .aws_sagemaker_provider_account import AwsSagemakerProviderAccount from .azure_foundry_provider_account import AzureFoundryProviderAccount from .azure_open_ai_provider_account import AzureOpenAiProviderAccount +from .baseten_provider_account import BasetenProviderAccount from .cartesia_provider_account import CartesiaProviderAccount from .cerebras_provider_account import CerebrasProviderAccount from .cloudera_provider_account import ClouderaProviderAccount from .cohere_provider_account import CohereProviderAccount +from .custom_endpoint_provider_account import CustomEndpointProviderAccount from .databricks_provider_account import DatabricksProviderAccount from .deepgram_provider_account import DeepgramProviderAccount from .deepinfra_provider_account import DeepinfraProviderAccount @@ -57,6 +59,7 @@ OpenRouterProviderAccount, SambaNovaProviderAccount, XaiProviderAccount, + BasetenProviderAccount, AwsSagemakerProviderAccount, CerebrasProviderAccount, SnowflakeCortexProviderAccount, @@ -64,4 +67,5 @@ DeepgramProviderAccount, CartesiaProviderAccount, VirtualModelProviderAccount, + CustomEndpointProviderAccount, ] diff --git a/src/truefoundry_sdk/types/model_type.py b/src/truefoundry_sdk/types/model_type.py index 8cff4f5c..9b1e5aa6 100644 --- a/src/truefoundry_sdk/types/model_type.py +++ b/src/truefoundry_sdk/types/model_type.py @@ -22,6 +22,7 @@ class ModelType(enum.StrEnum): TEXT_TO_SPEECH = "text_to_speech" MODERATION = "moderation" IMAGE = "image" + RESPONSES = "responses" _UNKNOWN = "__MODELTYPE_UNKNOWN__" """ This member is used for forward compatibility. If the value is not recognized by the enum, it will be stored here, and the raw value is accessible through `.value`. @@ -45,6 +46,7 @@ def visit( text_to_speech: typing.Callable[[], T_Result], moderation: typing.Callable[[], T_Result], image: typing.Callable[[], T_Result], + responses: typing.Callable[[], T_Result], _unknown_member: typing.Callable[[str], T_Result], ) -> T_Result: if self is ModelType.CHAT: @@ -67,4 +69,6 @@ def visit( return moderation() if self is ModelType.IMAGE: return image() + if self is ModelType.RESPONSES: + return responses() return _unknown_member(self._value_) diff --git a/src/truefoundry_sdk/types/model_version.py b/src/truefoundry_sdk/types/model_version.py index cdc09ed8..60680199 100644 --- a/src/truefoundry_sdk/types/model_version.py +++ b/src/truefoundry_sdk/types/model_version.py @@ -11,18 +11,74 @@ class ModelVersion(UniversalBaseModel): - id: str - fqn: str - created_by_subject: Subject - created_at: typing.Optional[dt.datetime] = None - updated_at: typing.Optional[dt.datetime] = None - manifest: ModelManifest - usage_code_snippet: typing.Optional[str] = None - ml_repo_id: str - tags: typing.Optional[typing.List[str]] = None - model_id: str - metrics: typing.Optional[typing.List[Metric]] = None - deployable: typing.Optional[bool] = False + """ + Tags, optional version alias, and SDK usage snippet (models, prompts, generic artifacts). + """ + + id: str = pydantic.Field() + """ + Unique identifier for the artifact version + """ + + fqn: str = pydantic.Field() + """ + Fully qualified name of the artifact version in the format '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}:{version}' + """ + + created_by_subject: Subject = pydantic.Field() + """ + Subject (user, team, or service account) that created this artifact version + """ + + created_at: typing.Optional[dt.datetime] = pydantic.Field(default=None) + """ + Timestamp when the artifact version was created + """ + + updated_at: typing.Optional[dt.datetime] = pydantic.Field(default=None) + """ + Timestamp when the artifact version was last updated + """ + + manifest: ModelManifest = pydantic.Field() + """ + Manifest containing metadata specific to the model version + """ + + ml_repo_id: str = pydantic.Field() + """ + ID of the ML Repo that this artifact version belongs to + """ + + tags: typing.Optional[typing.List[str]] = pydantic.Field(default=None) + """ + List of tags associated with this artifact version for filtering and organization + """ + + version_alias: typing.Optional[str] = pydantic.Field(default=None) + """ + Optional human-readable version alias (e.g. v1.0.0) + """ + + usage_code_snippet: typing.Optional[str] = pydantic.Field(default=None) + """ + Code snippet demonstrating how to use this artifact version + """ + + model_id: str = pydantic.Field() + """ + ID of the parent model that this version belongs to + """ + + metrics: typing.Optional[typing.List[Metric]] = pydantic.Field(default=None) + """ + List of metrics associated with this model version + """ + + deployable: typing.Optional[bool] = pydantic.Field(default=False) + """ + Whether this model version is ready for deployment + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/multi_part_upload.py b/src/truefoundry_sdk/types/multi_part_upload.py index 3cb7e554..47646652 100644 --- a/src/truefoundry_sdk/types/multi_part_upload.py +++ b/src/truefoundry_sdk/types/multi_part_upload.py @@ -11,13 +11,30 @@ class MultiPartUpload(UniversalBaseModel): - storage_provider: MultiPartUploadStorageProvider - part_signed_urls: typing.List[SignedUrl] + storage_provider: MultiPartUploadStorageProvider = pydantic.Field() + """ + Storage provider being used for the multipart upload (e.g., 'S3_COMPATIBLE' or 'AZURE_BLOB') + """ + + part_signed_urls: typing.List[SignedUrl] = pydantic.Field() + """ + List of signed URLs for each part of the multipart upload + """ + s3compatible_upload_id: typing_extensions.Annotated[ - typing.Optional[str], FieldMetadata(alias="s3_compatible_upload_id") - ] = pydantic.Field(alias="s3_compatible_upload_id", default=None) - azure_blob_block_ids: typing.Optional[typing.List[str]] = None - finalize_signed_url: SignedUrl + typing.Optional[str], + FieldMetadata(alias="s3_compatible_upload_id"), + pydantic.Field(alias="s3_compatible_upload_id", description="Upload ID for S3-compatible storage providers"), + ] = None + azure_blob_block_ids: typing.Optional[typing.List[str]] = pydantic.Field(default=None) + """ + List of block IDs for Azure Blob Storage multipart upload + """ + + finalize_signed_url: SignedUrl = pydantic.Field() + """ + Signed URL to call after all parts are uploaded to finalize the multipart upload + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/multi_part_upload_response.py b/src/truefoundry_sdk/types/multi_part_upload_response.py index 42c58094..8b50e292 100644 --- a/src/truefoundry_sdk/types/multi_part_upload_response.py +++ b/src/truefoundry_sdk/types/multi_part_upload_response.py @@ -8,7 +8,10 @@ class MultiPartUploadResponse(UniversalBaseModel): - data: MultiPartUpload + data: MultiPartUpload = pydantic.Field() + """ + Multipart upload information including signed URLs for each part + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/nomic_provider_account.py b/src/truefoundry_sdk/types/nomic_provider_account.py index 13f7a77f..e2beadb4 100644 --- a/src/truefoundry_sdk/types/nomic_provider_account.py +++ b/src/truefoundry_sdk/types/nomic_provider_account.py @@ -38,9 +38,9 @@ class NomicProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/notification_target.py b/src/truefoundry_sdk/types/notification_target.py index 8be24ee7..4b7e46ff 100644 --- a/src/truefoundry_sdk/types/notification_target.py +++ b/src/truefoundry_sdk/types/notification_target.py @@ -3,7 +3,8 @@ import typing from .email import Email +from .pager_duty import PagerDuty from .slack_bot import SlackBot from .slack_webhook import SlackWebhook -NotificationTarget = typing.Union[Email, SlackWebhook, SlackBot] +NotificationTarget = typing.Union[Email, SlackWebhook, SlackBot, PagerDuty] diff --git a/src/truefoundry_sdk/types/notification_target_for_alert_rule.py b/src/truefoundry_sdk/types/notification_target_for_alert_rule.py index 08427567..4adfce43 100644 --- a/src/truefoundry_sdk/types/notification_target_for_alert_rule.py +++ b/src/truefoundry_sdk/types/notification_target_for_alert_rule.py @@ -5,5 +5,6 @@ from .email import Email from .pager_duty import PagerDuty from .slack_bot import SlackBot +from .slack_webhook import SlackWebhook -NotificationTargetForAlertRule = typing.Union[Email, SlackBot, PagerDuty] +NotificationTargetForAlertRule = typing.Union[Email, SlackWebhook, SlackBot, PagerDuty] diff --git a/src/truefoundry_sdk/types/ollama_provider_account.py b/src/truefoundry_sdk/types/ollama_provider_account.py index 7e36a568..71ff800c 100644 --- a/src/truefoundry_sdk/types/ollama_provider_account.py +++ b/src/truefoundry_sdk/types/ollama_provider_account.py @@ -38,9 +38,9 @@ class OllamaProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/open_ai_moderations_guardrail_config_config.py b/src/truefoundry_sdk/types/open_ai_moderations_guardrail_config_config.py index 26b20a77..fcd4f372 100644 --- a/src/truefoundry_sdk/types/open_ai_moderations_guardrail_config_config.py +++ b/src/truefoundry_sdk/types/open_ai_moderations_guardrail_config_config.py @@ -4,9 +4,6 @@ import pydantic from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel -from .open_ai_moderations_guardrail_config_config_category_thresholds_value import ( - OpenAiModerationsGuardrailConfigConfigCategoryThresholdsValue, -) class OpenAiModerationsGuardrailConfigConfig(UniversalBaseModel): @@ -25,9 +22,7 @@ class OpenAiModerationsGuardrailConfigConfig(UniversalBaseModel): Optional custom base URL for OpenAI API. If not provided, the default base URL will be used. """ - category_thresholds: typing.Optional[ - typing.Dict[str, OpenAiModerationsGuardrailConfigConfigCategoryThresholdsValue] - ] = None + category_thresholds: typing.Optional[typing.Dict[str, float]] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/open_ai_moderations_guardrail_config_config_category_thresholds_value.py b/src/truefoundry_sdk/types/open_ai_moderations_guardrail_config_config_category_thresholds_value.py deleted file mode 100644 index 6178edee..00000000 --- a/src/truefoundry_sdk/types/open_ai_moderations_guardrail_config_config_category_thresholds_value.py +++ /dev/null @@ -1,11 +0,0 @@ -# This file was auto-generated by Fern from our API Definition. - -import typing - -from .open_ai_moderations_guardrail_config_config_category_thresholds_value_harassment import ( - OpenAiModerationsGuardrailConfigConfigCategoryThresholdsValueHarassment, -) - -OpenAiModerationsGuardrailConfigConfigCategoryThresholdsValue = typing.Union[ - float, OpenAiModerationsGuardrailConfigConfigCategoryThresholdsValueHarassment -] diff --git a/src/truefoundry_sdk/types/open_apimcp_server_manifest.py b/src/truefoundry_sdk/types/open_apimcp_server_manifest.py index 0c3d1821..18cc9095 100644 --- a/src/truefoundry_sdk/types/open_apimcp_server_manifest.py +++ b/src/truefoundry_sdk/types/open_apimcp_server_manifest.py @@ -57,9 +57,9 @@ class OpenApimcpServerManifest(UniversalBaseModel): Users and Teams that have access to this OpenAPI Server """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None tags: typing.Optional[typing.Dict[str, typing.Any]] = pydantic.Field(default=None) """ Key-value pairs to categorize this OpenAPI MCP Server (e.g., by owner or environment). diff --git a/src/truefoundry_sdk/types/open_router_provider_account.py b/src/truefoundry_sdk/types/open_router_provider_account.py index 58ada1c5..f5139124 100644 --- a/src/truefoundry_sdk/types/open_router_provider_account.py +++ b/src/truefoundry_sdk/types/open_router_provider_account.py @@ -38,9 +38,9 @@ class OpenRouterProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/openai_provider_account.py b/src/truefoundry_sdk/types/openai_provider_account.py index 2da6abe4..3cbaa2c2 100644 --- a/src/truefoundry_sdk/types/openai_provider_account.py +++ b/src/truefoundry_sdk/types/openai_provider_account.py @@ -43,9 +43,9 @@ class OpenaiProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/otel_exporter_grpc_config_base.py b/src/truefoundry_sdk/types/otel_exporter_grpc_config_base.py new file mode 100644 index 00000000..f0fbe9f5 --- /dev/null +++ b/src/truefoundry_sdk/types/otel_exporter_grpc_config_base.py @@ -0,0 +1,30 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class OtelExporterGrpcConfigBase(UniversalBaseModel): + """ + Base gRPC exporter fields (without type discriminator) + """ + + endpoint: str = pydantic.Field() + """ + Endpoint URL where OpenTelemetry data will be sent + """ + + headers: typing.Optional[typing.Dict[str, str]] = pydantic.Field(default=None) + """ + gRPC metadata to include in OpenTelemetry export requests + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/otel_exporter_http_config.py b/src/truefoundry_sdk/types/otel_exporter_http_config.py deleted file mode 100644 index dd6f2f97..00000000 --- a/src/truefoundry_sdk/types/otel_exporter_http_config.py +++ /dev/null @@ -1,57 +0,0 @@ -# This file was auto-generated by Fern from our API Definition. - -import typing - -import pydantic -from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel -from .otel_exporter_http_config_encoding import OtelExporterHttpConfigEncoding -from .otel_exporter_span_attribute_filter import OtelExporterSpanAttributeFilter - - -class OtelExporterHttpConfig(UniversalBaseModel): - """ - HTTP Configuration - """ - - type: typing.Literal["http"] = pydantic.Field(default="http") - """ - Configuration type - """ - - endpoint: str = pydantic.Field() - """ - Traces endpoint URL where OpenTelemetry data will be sent (typical format: https://://v1/traces) - """ - - encoding: OtelExporterHttpConfigEncoding = pydantic.Field() - """ - Encoding for OpenTelemetry data - """ - - headers: typing.Optional[typing.Dict[str, str]] = pydantic.Field(default=None) - """ - HTTP headers to include in OpenTelemetry export requests - """ - - additional_resource_attributes: typing.Optional[typing.Dict[str, str]] = pydantic.Field(default=None) - """ - Set additional attributes to append them to existing resource attributes of every exported trace - """ - - exclude_request_data: typing.Optional[bool] = pydantic.Field(default=None) - """ - Enable to prevent forwarding the LLM or MCP request and response body in exported traces. The following span attributes are dropped: tfy.input, tfy.output, tfy.input_short_hand - """ - - when: typing.Optional[typing.List[OtelExporterSpanAttributeFilter]] = pydantic.Field(default=None) - """ - Export spans only when they match all of the following filters. Only matching on spanAttributes with string values in supported. - """ - - if IS_PYDANTIC_V2: - model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 - else: - - class Config: - smart_union = True - extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/otel_exporter_http_config_base.py b/src/truefoundry_sdk/types/otel_exporter_http_config_base.py new file mode 100644 index 00000000..29ad8d28 --- /dev/null +++ b/src/truefoundry_sdk/types/otel_exporter_http_config_base.py @@ -0,0 +1,36 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .otel_exporter_http_config_base_encoding import OtelExporterHttpConfigBaseEncoding + + +class OtelExporterHttpConfigBase(UniversalBaseModel): + """ + Base HTTP exporter fields (without type discriminator) + """ + + endpoint: str = pydantic.Field() + """ + Endpoint URL where OpenTelemetry data will be sent + """ + + encoding: OtelExporterHttpConfigBaseEncoding = pydantic.Field() + """ + Encoding for OpenTelemetry data + """ + + headers: typing.Optional[typing.Dict[str, str]] = pydantic.Field(default=None) + """ + HTTP headers to include in OpenTelemetry export requests + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/otel_exporter_http_config_encoding.py b/src/truefoundry_sdk/types/otel_exporter_http_config_base_encoding.py similarity index 77% rename from src/truefoundry_sdk/types/otel_exporter_http_config_encoding.py rename to src/truefoundry_sdk/types/otel_exporter_http_config_base_encoding.py index 692e9728..ef2363d1 100644 --- a/src/truefoundry_sdk/types/otel_exporter_http_config_encoding.py +++ b/src/truefoundry_sdk/types/otel_exporter_http_config_base_encoding.py @@ -7,20 +7,20 @@ T_Result = typing.TypeVar("T_Result") -class OtelExporterHttpConfigEncoding(enum.StrEnum): +class OtelExporterHttpConfigBaseEncoding(enum.StrEnum): """ Encoding for OpenTelemetry data """ PROTO = "proto" JSON = "json" - _UNKNOWN = "__OTELEXPORTERHTTPCONFIGENCODING_UNKNOWN__" + _UNKNOWN = "__OTELEXPORTERHTTPCONFIGBASEENCODING_UNKNOWN__" """ This member is used for forward compatibility. If the value is not recognized by the enum, it will be stored here, and the raw value is accessible through `.value`. """ @classmethod - def _missing_(cls, value: typing.Any) -> "OtelExporterHttpConfigEncoding": + def _missing_(cls, value: typing.Any) -> "OtelExporterHttpConfigBaseEncoding": unknown = cls._UNKNOWN unknown._value_ = value return unknown @@ -31,8 +31,8 @@ def visit( json: typing.Callable[[], T_Result], _unknown_member: typing.Callable[[str], T_Result], ) -> T_Result: - if self is OtelExporterHttpConfigEncoding.PROTO: + if self is OtelExporterHttpConfigBaseEncoding.PROTO: return proto() - if self is OtelExporterHttpConfigEncoding.JSON: + if self is OtelExporterHttpConfigBaseEncoding.JSON: return json() return _unknown_member(self._value_) diff --git a/src/truefoundry_sdk/types/otel_metrics_exporter_grpc_config.py b/src/truefoundry_sdk/types/otel_metrics_exporter_grpc_config.py new file mode 100644 index 00000000..b6278902 --- /dev/null +++ b/src/truefoundry_sdk/types/otel_metrics_exporter_grpc_config.py @@ -0,0 +1,26 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2 +from .otel_exporter_grpc_config_base import OtelExporterGrpcConfigBase + + +class OtelMetricsExporterGrpcConfig(OtelExporterGrpcConfigBase): + """ + gRPC Configuration + """ + + type: typing.Literal["grpc"] = pydantic.Field(default="grpc") + """ + Configuration type + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/otel_metrics_exporter_http_config.py b/src/truefoundry_sdk/types/otel_metrics_exporter_http_config.py new file mode 100644 index 00000000..a1660a10 --- /dev/null +++ b/src/truefoundry_sdk/types/otel_metrics_exporter_http_config.py @@ -0,0 +1,26 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2 +from .otel_exporter_http_config_base import OtelExporterHttpConfigBase + + +class OtelMetricsExporterHttpConfig(OtelExporterHttpConfigBase): + """ + HTTP Configuration + """ + + type: typing.Literal["http"] = pydantic.Field(default="http") + """ + Configuration type + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/otel_exporter_grpc_config.py b/src/truefoundry_sdk/types/otel_traces_exporter_common_config.py similarity index 61% rename from src/truefoundry_sdk/types/otel_exporter_grpc_config.py rename to src/truefoundry_sdk/types/otel_traces_exporter_common_config.py index e9309604..d5146eda 100644 --- a/src/truefoundry_sdk/types/otel_exporter_grpc_config.py +++ b/src/truefoundry_sdk/types/otel_traces_exporter_common_config.py @@ -4,27 +4,12 @@ import pydantic from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel -from .otel_exporter_span_attribute_filter import OtelExporterSpanAttributeFilter +from .otel_traces_exporter_span_attribute_filter import OtelTracesExporterSpanAttributeFilter -class OtelExporterGrpcConfig(UniversalBaseModel): +class OtelTracesExporterCommonConfig(UniversalBaseModel): """ - gRPC Configuration - """ - - type: typing.Literal["grpc"] = pydantic.Field(default="grpc") - """ - Configuration type - """ - - endpoint: str = pydantic.Field() - """ - Traces endpoint URL where OpenTelemetry data will be sent (format: https://:) - """ - - headers: typing.Optional[typing.Dict[str, str]] = pydantic.Field(default=None) - """ - gRPC metadata to include in OpenTelemetry export requests + Common fields shared by HTTP and gRPC exporter configs """ additional_resource_attributes: typing.Optional[typing.Dict[str, str]] = pydantic.Field(default=None) @@ -37,7 +22,7 @@ class OtelExporterGrpcConfig(UniversalBaseModel): Enable to prevent forwarding the LLM or MCP request and response body in exported traces. The following span attributes are dropped: tfy.input, tfy.output, tfy.input_short_hand """ - when: typing.Optional[typing.List[OtelExporterSpanAttributeFilter]] = pydantic.Field(default=None) + when: typing.Optional[typing.List[OtelTracesExporterSpanAttributeFilter]] = pydantic.Field(default=None) """ Export spans only when they match all of the following filters. Only matching on spanAttributes with string values in supported. """ diff --git a/src/truefoundry_sdk/types/otel_traces_exporter_grpc_config.py b/src/truefoundry_sdk/types/otel_traces_exporter_grpc_config.py new file mode 100644 index 00000000..d2d69e85 --- /dev/null +++ b/src/truefoundry_sdk/types/otel_traces_exporter_grpc_config.py @@ -0,0 +1,27 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2 +from .otel_exporter_grpc_config_base import OtelExporterGrpcConfigBase +from .otel_traces_exporter_common_config import OtelTracesExporterCommonConfig + + +class OtelTracesExporterGrpcConfig(OtelExporterGrpcConfigBase, OtelTracesExporterCommonConfig): + """ + gRPC Configuration + """ + + type: typing.Literal["grpc"] = pydantic.Field(default="grpc") + """ + Configuration type + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/otel_traces_exporter_http_config.py b/src/truefoundry_sdk/types/otel_traces_exporter_http_config.py new file mode 100644 index 00000000..a817b267 --- /dev/null +++ b/src/truefoundry_sdk/types/otel_traces_exporter_http_config.py @@ -0,0 +1,27 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2 +from .otel_exporter_http_config_base import OtelExporterHttpConfigBase +from .otel_traces_exporter_common_config import OtelTracesExporterCommonConfig + + +class OtelTracesExporterHttpConfig(OtelExporterHttpConfigBase, OtelTracesExporterCommonConfig): + """ + HTTP Configuration + """ + + type: typing.Literal["http"] = pydantic.Field(default="http") + """ + Configuration type + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/otel_exporter_span_attribute_filter.py b/src/truefoundry_sdk/types/otel_traces_exporter_span_attribute_filter.py similarity index 93% rename from src/truefoundry_sdk/types/otel_exporter_span_attribute_filter.py rename to src/truefoundry_sdk/types/otel_traces_exporter_span_attribute_filter.py index f0fb4127..ba1e3317 100644 --- a/src/truefoundry_sdk/types/otel_exporter_span_attribute_filter.py +++ b/src/truefoundry_sdk/types/otel_traces_exporter_span_attribute_filter.py @@ -6,7 +6,7 @@ from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel -class OtelExporterSpanAttributeFilter(UniversalBaseModel): +class OtelTracesExporterSpanAttributeFilter(UniversalBaseModel): """ Filter configuration for filtering spans by attributes before exporting """ diff --git a/src/truefoundry_sdk/types/pager_duty_provider_account.py b/src/truefoundry_sdk/types/pager_duty_provider_account.py index 9e4c54a9..53202738 100644 --- a/src/truefoundry_sdk/types/pager_duty_provider_account.py +++ b/src/truefoundry_sdk/types/pager_duty_provider_account.py @@ -30,9 +30,9 @@ class PagerDutyProviderAccount(UniversalBaseModel): List of integrations that are associated with the PagerDuty provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/palm_provider_account.py b/src/truefoundry_sdk/types/palm_provider_account.py index 8cb316a0..413cc183 100644 --- a/src/truefoundry_sdk/types/palm_provider_account.py +++ b/src/truefoundry_sdk/types/palm_provider_account.py @@ -38,9 +38,9 @@ class PalmProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/palo_alto_prisma_airs_guardrail_config_config.py b/src/truefoundry_sdk/types/palo_alto_prisma_airs_guardrail_config_config.py index 56d852a7..4f2fb220 100644 --- a/src/truefoundry_sdk/types/palo_alto_prisma_airs_guardrail_config_config.py +++ b/src/truefoundry_sdk/types/palo_alto_prisma_airs_guardrail_config_config.py @@ -28,6 +28,11 @@ class PaloAltoPrismaAirsGuardrailConfigConfig(UniversalBaseModel): Execution mode for the guardrail. Sync waits for the guardrail check to complete before proceeding. Async triggers the check without waiting. Defaults to sync. """ + metadata_key_mapping: typing.Optional[typing.Dict[str, str]] = pydantic.Field(default=None) + """ + Map Palo Alto AIRS metadata fields to TrueFoundry request metadata keys. Key is the Palo Alto AIRS metadata field name, value is the corresponding key from X-TFY-METADATA header on the TrueFoundry side. Example: {"app_user": "user_email", "ai_model": "model_name"}. Reserved AIRS keys: ai_model, app_user, app_name. [Docs](https://www.truefoundry.com/docs/ai-gateway/palo-alto-airs) + """ + if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 else: diff --git a/src/truefoundry_sdk/types/perplexity_ai_provider_account.py b/src/truefoundry_sdk/types/perplexity_ai_provider_account.py index 648745ae..f32ff3f1 100644 --- a/src/truefoundry_sdk/types/perplexity_ai_provider_account.py +++ b/src/truefoundry_sdk/types/perplexity_ai_provider_account.py @@ -38,9 +38,9 @@ class PerplexityAiProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/personal_access_token_manifest.py b/src/truefoundry_sdk/types/personal_access_token_manifest.py index 071630e0..ee80ff22 100644 --- a/src/truefoundry_sdk/types/personal_access_token_manifest.py +++ b/src/truefoundry_sdk/types/personal_access_token_manifest.py @@ -30,9 +30,9 @@ class PersonalAccessTokenManifest(UniversalBaseModel): The fully qualified name of the user """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/policy_entity_types.py b/src/truefoundry_sdk/types/policy_entity_types.py index 362a13b0..9c7f7607 100644 --- a/src/truefoundry_sdk/types/policy_entity_types.py +++ b/src/truefoundry_sdk/types/policy_entity_types.py @@ -15,6 +15,7 @@ class PolicyEntityTypes(enum.StrEnum): SSH_SERVER = "ssh-server" WORKFLOW = "workflow" HELM = "helm" + VOLUME = "volume" _UNKNOWN = "__POLICYENTITYTYPES_UNKNOWN__" """ This member is used for forward compatibility. If the value is not recognized by the enum, it will be stored here, and the raw value is accessible through `.value`. @@ -35,6 +36,7 @@ def visit( ssh_server: typing.Callable[[], T_Result], workflow: typing.Callable[[], T_Result], helm: typing.Callable[[], T_Result], + volume: typing.Callable[[], T_Result], _unknown_member: typing.Callable[[str], T_Result], ) -> T_Result: if self is PolicyEntityTypes.SERVICE: @@ -51,4 +53,6 @@ def visit( return workflow() if self is PolicyEntityTypes.HELM: return helm() + if self is PolicyEntityTypes.VOLUME: + return volume() return _unknown_member(self._value_) diff --git a/src/truefoundry_sdk/types/priority_based_load_balance_target.py b/src/truefoundry_sdk/types/priority_based_load_balance_target.py index bbc42a76..bfc86549 100644 --- a/src/truefoundry_sdk/types/priority_based_load_balance_target.py +++ b/src/truefoundry_sdk/types/priority_based_load_balance_target.py @@ -4,6 +4,7 @@ import pydantic from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .headers_override import HeadersOverride from .retry_config import RetryConfig from .sla_cutoff import SlaCutoff @@ -36,6 +37,12 @@ class PriorityBasedLoadBalanceTarget(UniversalBaseModel): Optional parameters to override in the request """ + headers_override: typing.Optional[HeadersOverride] = None + metadata_match: typing.Optional[typing.Dict[str, str]] = pydantic.Field(default=None) + """ + Optional metadata key-value pairs that must match incoming request metadata headers for this target to be considered for routing. + """ + if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 else: diff --git a/src/truefoundry_sdk/types/private_pricing_tier.py b/src/truefoundry_sdk/types/private_pricing_tier.py index 74fff83a..0e051964 100644 --- a/src/truefoundry_sdk/types/private_pricing_tier.py +++ b/src/truefoundry_sdk/types/private_pricing_tier.py @@ -14,11 +14,14 @@ class PrivatePricingTier(UniversalBaseModel): Pricing tier for volume-based pricing (per 1000 tokens) """ - from_: typing_extensions.Annotated[int, FieldMetadata(alias="from")] = pydantic.Field(alias="from") - """ - Token count threshold where this pricing tier begins (e.g., 200000 for 200k tokens) - """ - + from_: typing_extensions.Annotated[ + int, + FieldMetadata(alias="from"), + pydantic.Field( + alias="from", + description="Token count threshold where this pricing tier begins (e.g., 200000 for 200k tokens)", + ), + ] cost_per_token: NonNegativeFloat if IS_PYDANTIC_V2: diff --git a/src/truefoundry_sdk/types/prometheus_alert_rule.py b/src/truefoundry_sdk/types/prometheus_alert_rule.py index f9d47e25..0dbb1fbc 100644 --- a/src/truefoundry_sdk/types/prometheus_alert_rule.py +++ b/src/truefoundry_sdk/types/prometheus_alert_rule.py @@ -29,11 +29,14 @@ class PrometheusAlertRule(UniversalBaseModel): Enter a valid PromQL expression that defines the condition for triggering this alert. The alert will fire when this expression evaluates to true for the duration specified in the duration to trigger alert field. """ - for_: typing_extensions.Annotated[float, FieldMetadata(alias="for")] = pydantic.Field(alias="for") - """ - The prometheus expression must remain true for this duration (in seconds) before the alert is triggered. If the condition becomes false before this time elapses, the alert will not fire. - """ - + for_: typing_extensions.Annotated[ + float, + FieldMetadata(alias="for"), + pydantic.Field( + alias="for", + description="The prometheus expression must remain true for this duration (in seconds) before the alert is triggered. If the condition becomes false before this time elapses, the alert will not fire.", + ), + ] severity: AlertSeverity description: typing.Optional[str] = pydantic.Field(default=None) """ diff --git a/src/truefoundry_sdk/types/prompt.py b/src/truefoundry_sdk/types/prompt.py index 870b2e1e..e770af8a 100644 --- a/src/truefoundry_sdk/types/prompt.py +++ b/src/truefoundry_sdk/types/prompt.py @@ -10,16 +10,59 @@ class Prompt(UniversalBaseModel): - id: str - ml_repo_id: str - type: typing.Optional[typing.Literal["chat_prompt"]] = None - name: str - fqn: str - created_by_subject: Subject - created_at: typing.Optional[dt.datetime] = None - updated_at: typing.Optional[dt.datetime] = None - latest_version: typing.Optional[PromptVersion] = None - run_steps: typing.Optional[typing.List[int]] = None + """ + Generic artifact API DTO including run-step linkage for ML runs. + """ + + id: str = pydantic.Field() + """ + Unique identifier for the artifact + """ + + ml_repo_id: str = pydantic.Field() + """ + ID of the ML Repo that this artifact belongs to + """ + + type: typing.Optional[typing.Literal["chat_prompt"]] = pydantic.Field(default=None) + """ + Type of the artifact, always 'chat_prompt' for Prompt entities + """ + + name: str = pydantic.Field() + """ + Name of the artifact (alphanumeric characters, hyphens, and underscores only, max 256 characters) + """ + + fqn: str = pydantic.Field() + """ + Fully qualified name of the artifact in the format '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}' + """ + + created_by_subject: Subject = pydantic.Field() + """ + Subject (user, team, or service account) that created this artifact + """ + + created_at: typing.Optional[dt.datetime] = pydantic.Field(default=None) + """ + Timestamp when the artifact was created + """ + + updated_at: typing.Optional[dt.datetime] = pydantic.Field(default=None) + """ + Timestamp when the artifact was last updated + """ + + latest_version: typing.Optional[PromptVersion] = pydantic.Field(default=None) + """ + The most recent version of this prompt + """ + + run_steps: typing.Optional[typing.List[int]] = pydantic.Field(default=None) + """ + List of run step numbers where this artifact was created or updated + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/prompt_foo_guard_type.py b/src/truefoundry_sdk/types/prompt_foo_guard_type.py deleted file mode 100644 index 6ff24582..00000000 --- a/src/truefoundry_sdk/types/prompt_foo_guard_type.py +++ /dev/null @@ -1,38 +0,0 @@ -# This file was auto-generated by Fern from our API Definition. - -import typing - -from ..core import enum - -T_Result = typing.TypeVar("T_Result") - - -class PromptFooGuardType(enum.StrEnum): - GUARD_CHECK = "guard_check" - PII_REDACTION = "pii_redaction" - HARMFUL_DETECTION = "harmful_detection" - _UNKNOWN = "__PROMPTFOOGUARDTYPE_UNKNOWN__" - """ - This member is used for forward compatibility. If the value is not recognized by the enum, it will be stored here, and the raw value is accessible through `.value`. - """ - - @classmethod - def _missing_(cls, value: typing.Any) -> "PromptFooGuardType": - unknown = cls._UNKNOWN - unknown._value_ = value - return unknown - - def visit( - self, - guard_check: typing.Callable[[], T_Result], - pii_redaction: typing.Callable[[], T_Result], - harmful_detection: typing.Callable[[], T_Result], - _unknown_member: typing.Callable[[str], T_Result], - ) -> T_Result: - if self is PromptFooGuardType.GUARD_CHECK: - return guard_check() - if self is PromptFooGuardType.PII_REDACTION: - return pii_redaction() - if self is PromptFooGuardType.HARMFUL_DETECTION: - return harmful_detection() - return _unknown_member(self._value_) diff --git a/src/truefoundry_sdk/types/prompt_version.py b/src/truefoundry_sdk/types/prompt_version.py index f5a90605..5a81084e 100644 --- a/src/truefoundry_sdk/types/prompt_version.py +++ b/src/truefoundry_sdk/types/prompt_version.py @@ -11,17 +11,69 @@ class PromptVersion(UniversalBaseModel): - id: str - fqn: str - created_by_subject: Subject - created_at: typing.Optional[dt.datetime] = None - updated_at: typing.Optional[dt.datetime] = None - manifest: ChatPromptManifest - usage_code_snippet: typing.Optional[str] = None - ml_repo_id: str - tags: typing.Optional[typing.List[str]] = None - usage_code_snippets: typing.Optional[typing.List[UsageCodeSnippet]] = None - prompt_id: str + """ + Tags, optional version alias, and SDK usage snippet (models, prompts, generic artifacts). + """ + + id: str = pydantic.Field() + """ + Unique identifier for the artifact version + """ + + fqn: str = pydantic.Field() + """ + Fully qualified name of the artifact version in the format '{artifact_type}:{tenant_name}/{ml_repo_name}/{artifact_name}:{version}' + """ + + created_by_subject: Subject = pydantic.Field() + """ + Subject (user, team, or service account) that created this artifact version + """ + + created_at: typing.Optional[dt.datetime] = pydantic.Field(default=None) + """ + Timestamp when the artifact version was created + """ + + updated_at: typing.Optional[dt.datetime] = pydantic.Field(default=None) + """ + Timestamp when the artifact version was last updated + """ + + manifest: ChatPromptManifest = pydantic.Field() + """ + Manifest containing metadata specific to the chat prompt version + """ + + ml_repo_id: str = pydantic.Field() + """ + ID of the ML Repo that this artifact version belongs to + """ + + tags: typing.Optional[typing.List[str]] = pydantic.Field(default=None) + """ + List of tags associated with this artifact version for filtering and organization + """ + + version_alias: typing.Optional[str] = pydantic.Field(default=None) + """ + Optional human-readable version alias (e.g. v1.0.0) + """ + + usage_code_snippet: typing.Optional[str] = pydantic.Field(default=None) + """ + Code snippet demonstrating how to use this artifact version + """ + + usage_code_snippets: typing.Optional[typing.List[UsageCodeSnippet]] = pydantic.Field(default=None) + """ + List of code snippets demonstrating how to use this prompt version in different languages + """ + + prompt_id: str = pydantic.Field() + """ + ID of the parent prompt that this version belongs to + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/py_spark_task_config.py b/src/truefoundry_sdk/types/py_spark_task_config.py index 9ca67345..d38e3344 100644 --- a/src/truefoundry_sdk/types/py_spark_task_config.py +++ b/src/truefoundry_sdk/types/py_spark_task_config.py @@ -19,7 +19,7 @@ class PySparkTaskConfig(UniversalBaseModel): image: TaskPySparkBuild driver_config: SparkDriverConfig executor_config: SparkExecutorConfig - spark_conf: typing.Optional[typing.Dict[str, typing.Any]] = pydantic.Field(default=None) + spark_conf: typing.Optional[typing.Dict[str, typing.Optional[str]]] = pydantic.Field(default=None) """ Extra configuration properties to be passed to the spark job. [Docs](https://spark.apache.org/docs/latest/configuration.html) """ diff --git a/src/truefoundry_sdk/types/quay_provider_account.py b/src/truefoundry_sdk/types/quay_provider_account.py index 80737060..5b091d95 100644 --- a/src/truefoundry_sdk/types/quay_provider_account.py +++ b/src/truefoundry_sdk/types/quay_provider_account.py @@ -37,9 +37,9 @@ class QuayProviderAccount(UniversalBaseModel): List of integrations that are associated with the provider account. """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/recommendation.py b/src/truefoundry_sdk/types/recommendation.py index c6f01d76..1efdf721 100644 --- a/src/truefoundry_sdk/types/recommendation.py +++ b/src/truefoundry_sdk/types/recommendation.py @@ -11,36 +11,38 @@ class Recommendation(UniversalBaseModel): id: typing.Optional[str] = None - cluster_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="clusterId")] = pydantic.Field( - alias="clusterId", default=None - ) - application_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="applicationId")] = ( - pydantic.Field(alias="applicationId", default=None) - ) - deployment_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="deploymentId")] = ( - pydantic.Field(alias="deploymentId", default=None) - ) + cluster_id: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="clusterId"), pydantic.Field(alias="clusterId") + ] = None + application_id: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="applicationId"), pydantic.Field(alias="applicationId") + ] = None + deployment_id: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="deploymentId"), pydantic.Field(alias="deploymentId") + ] = None application_version: typing_extensions.Annotated[ - typing.Optional[int], FieldMetadata(alias="applicationVersion") - ] = pydantic.Field(alias="applicationVersion", default=None) + typing.Optional[int], FieldMetadata(alias="applicationVersion"), pydantic.Field(alias="applicationVersion") + ] = None recommendation_data: typing_extensions.Annotated[ - typing.Dict[str, typing.Any], FieldMetadata(alias="recommendationData") - ] = pydantic.Field(alias="recommendationData") - recommendation_type: typing_extensions.Annotated[str, FieldMetadata(alias="recommendationType")] = pydantic.Field( - alias="recommendationType" - ) + typing.Dict[str, typing.Any], + FieldMetadata(alias="recommendationData"), + pydantic.Field(alias="recommendationData"), + ] + recommendation_type: typing_extensions.Annotated[ + str, FieldMetadata(alias="recommendationType"), pydantic.Field(alias="recommendationType") + ] applied_deployment_id: typing_extensions.Annotated[ - typing.Optional[str], FieldMetadata(alias="appliedDeploymentId") - ] = pydantic.Field(alias="appliedDeploymentId", default=None) - expiry_timestamp: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="expiryTimestamp")] = pydantic.Field( - alias="expiryTimestamp" - ) - created_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="createdAt")] = ( - pydantic.Field(alias="createdAt", default=None) - ) - updated_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt")] = ( - pydantic.Field(alias="updatedAt", default=None) - ) + typing.Optional[str], FieldMetadata(alias="appliedDeploymentId"), pydantic.Field(alias="appliedDeploymentId") + ] = None + expiry_timestamp: typing_extensions.Annotated[ + dt.datetime, FieldMetadata(alias="expiryTimestamp"), pydantic.Field(alias="expiryTimestamp") + ] + created_at: typing_extensions.Annotated[ + typing.Optional[dt.datetime], FieldMetadata(alias="createdAt"), pydantic.Field(alias="createdAt") + ] = None + updated_at: typing_extensions.Annotated[ + typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt"), pydantic.Field(alias="updatedAt") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/remote_agent.py b/src/truefoundry_sdk/types/remote_agent.py new file mode 100644 index 00000000..4b20c506 --- /dev/null +++ b/src/truefoundry_sdk/types/remote_agent.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +from .self_hosted_agent import SelfHostedAgent + +RemoteAgent = SelfHostedAgent diff --git a/src/truefoundry_sdk/types/remote_mcp_server_manifest.py b/src/truefoundry_sdk/types/remote_mcp_server_manifest.py index 549758ad..b58aa230 100644 --- a/src/truefoundry_sdk/types/remote_mcp_server_manifest.py +++ b/src/truefoundry_sdk/types/remote_mcp_server_manifest.py @@ -50,9 +50,9 @@ class RemoteMcpServerManifest(UniversalBaseModel): Users and Teams that have access to this MCP Server """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None tags: typing.Optional[typing.Dict[str, typing.Any]] = pydantic.Field(default=None) """ Key-value pairs to categorize this MCP Server (e.g., by owner or environment). diff --git a/src/truefoundry_sdk/types/open_ai_moderations_guardrail_config_config_category_thresholds_value_harassment.py b/src/truefoundry_sdk/types/response_format_json_object.py similarity index 72% rename from src/truefoundry_sdk/types/open_ai_moderations_guardrail_config_config_category_thresholds_value_harassment.py rename to src/truefoundry_sdk/types/response_format_json_object.py index 60986964..f697db89 100644 --- a/src/truefoundry_sdk/types/open_ai_moderations_guardrail_config_config_category_thresholds_value_harassment.py +++ b/src/truefoundry_sdk/types/response_format_json_object.py @@ -6,10 +6,8 @@ from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel -class OpenAiModerationsGuardrailConfigConfigCategoryThresholdsValueHarassment(UniversalBaseModel): - harassment: float - sexual: float - violence: float +class ResponseFormatJsonObject(UniversalBaseModel): + type: typing.Literal["json_object"] = "json_object" if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/response_format_json_schema.py b/src/truefoundry_sdk/types/response_format_json_schema.py new file mode 100644 index 00000000..cb481a59 --- /dev/null +++ b/src/truefoundry_sdk/types/response_format_json_schema.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .response_format_json_schema_json_schema import ResponseFormatJsonSchemaJsonSchema + + +class ResponseFormatJsonSchema(UniversalBaseModel): + type: typing.Literal["json_schema"] = "json_schema" + json_schema: ResponseFormatJsonSchemaJsonSchema + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/response_format_json_schema_json_schema.py b/src/truefoundry_sdk/types/response_format_json_schema_json_schema.py new file mode 100644 index 00000000..2b92dd23 --- /dev/null +++ b/src/truefoundry_sdk/types/response_format_json_schema_json_schema.py @@ -0,0 +1,25 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +import typing_extensions +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from ..core.serialization import FieldMetadata + + +class ResponseFormatJsonSchemaJsonSchema(UniversalBaseModel): + name: str + description: typing.Optional[str] = None + schema_: typing_extensions.Annotated[ + typing.Optional[typing.Dict[str, typing.Any]], FieldMetadata(alias="schema"), pydantic.Field(alias="schema") + ] = None + strict: typing.Optional[bool] = None + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/response_format_text.py b/src/truefoundry_sdk/types/response_format_text.py new file mode 100644 index 00000000..1bb49798 --- /dev/null +++ b/src/truefoundry_sdk/types/response_format_text.py @@ -0,0 +1,18 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class ResponseFormatText(UniversalBaseModel): + type: typing.Literal["text"] = "text" + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/role_binding_manifest.py b/src/truefoundry_sdk/types/role_binding_manifest.py new file mode 100644 index 00000000..e6ae232e --- /dev/null +++ b/src/truefoundry_sdk/types/role_binding_manifest.py @@ -0,0 +1,38 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .role_binding_permission import RoleBindingPermission +from .role_binding_subject import RoleBindingSubject + + +class RoleBindingManifest(UniversalBaseModel): + type: typing.Literal["role-binding"] = pydantic.Field(default="role-binding") + """ + +value=role-binding + """ + + name: str = pydantic.Field() + """ + Unique name for this role binding. + """ + + subjects: typing.List[RoleBindingSubject] = pydantic.Field() + """ + One row per principal; set type and name (email, team name, virtual account name, or external identity name). + """ + + permissions: typing.List[RoleBindingPermission] = pydantic.Field() + """ + Resource-scoped role grants (resource type, FQN, and role name). + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/role_binding_permission.py b/src/truefoundry_sdk/types/role_binding_permission.py new file mode 100644 index 00000000..2be7a42d --- /dev/null +++ b/src/truefoundry_sdk/types/role_binding_permission.py @@ -0,0 +1,37 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +import typing_extensions +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from ..core.serialization import FieldMetadata + + +class RoleBindingPermission(UniversalBaseModel): + """ + Grants a named account role on a specific resource identified by FQN. + """ + + resource_type: typing_extensions.Annotated[ + str, + FieldMetadata(alias="resourceType"), + pydantic.Field(alias="resourceType", description="Target resource kind (e.g. workspace, cluster, ml-repo)."), + ] + resource_fqn: typing_extensions.Annotated[ + str, + FieldMetadata(alias="resourceFqn"), + pydantic.Field(alias="resourceFqn", description="Fully qualified name of the resource."), + ] + role: str = pydantic.Field() + """ + Name of the role to bind (e.g. workspace-editor, model-user). + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/role_binding_subject.py b/src/truefoundry_sdk/types/role_binding_subject.py new file mode 100644 index 00000000..46c1827e --- /dev/null +++ b/src/truefoundry_sdk/types/role_binding_subject.py @@ -0,0 +1,32 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .role_binding_subject_type import RoleBindingSubjectType + + +class RoleBindingSubject(UniversalBaseModel): + """ + Single row per principal: type selects how to interpret name (email vs names). + Field names mirror the manifest root (type + name) for consistency in the UI and YAML. + """ + + type: RoleBindingSubjectType = pydantic.Field() + """ + Whether this row identifies a user (email), a team (name), a virtual account (name), or an external identity (name). + """ + + name: str = pydantic.Field() + """ + User email when type is user; team or virtual account name when type is team or virtualaccount; external identity name when type is external-identity. + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/role_binding_subject_type.py b/src/truefoundry_sdk/types/role_binding_subject_type.py new file mode 100644 index 00000000..66561e9a --- /dev/null +++ b/src/truefoundry_sdk/types/role_binding_subject_type.py @@ -0,0 +1,46 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +from ..core import enum + +T_Result = typing.TypeVar("T_Result") + + +class RoleBindingSubjectType(enum.StrEnum): + """ + Whether this row identifies a user (email), a team (name), a virtual account (name), or an external identity (name). + """ + + USER = "user" + TEAM = "team" + VIRTUALACCOUNT = "virtualaccount" + EXTERNAL_IDENTITY = "external-identity" + _UNKNOWN = "__ROLEBINDINGSUBJECTTYPE_UNKNOWN__" + """ + This member is used for forward compatibility. If the value is not recognized by the enum, it will be stored here, and the raw value is accessible through `.value`. + """ + + @classmethod + def _missing_(cls, value: typing.Any) -> "RoleBindingSubjectType": + unknown = cls._UNKNOWN + unknown._value_ = value + return unknown + + def visit( + self, + user: typing.Callable[[], T_Result], + team: typing.Callable[[], T_Result], + virtualaccount: typing.Callable[[], T_Result], + external_identity: typing.Callable[[], T_Result], + _unknown_member: typing.Callable[[str], T_Result], + ) -> T_Result: + if self is RoleBindingSubjectType.USER: + return user() + if self is RoleBindingSubjectType.TEAM: + return team() + if self is RoleBindingSubjectType.VIRTUALACCOUNT: + return virtualaccount() + if self is RoleBindingSubjectType.EXTERNAL_IDENTITY: + return external_identity() + return _unknown_member(self._value_) diff --git a/src/truefoundry_sdk/types/role_manifest.py b/src/truefoundry_sdk/types/role_manifest.py index d842d280..be75e241 100644 --- a/src/truefoundry_sdk/types/role_manifest.py +++ b/src/truefoundry_sdk/types/role_manifest.py @@ -19,25 +19,21 @@ class RoleManifest(UniversalBaseModel): Unique identifier of the role across the organization """ - display_name: typing_extensions.Annotated[str, FieldMetadata(alias="displayName")] = pydantic.Field( - alias="displayName" - ) - """ - Human-readable name for the role - """ - + display_name: typing_extensions.Annotated[ + str, + FieldMetadata(alias="displayName"), + pydantic.Field(alias="displayName", description="Human-readable name for the role"), + ] description: str = pydantic.Field() """ Description of the role that explains its purpose and permissions """ - resource_type: typing_extensions.Annotated[str, FieldMetadata(alias="resourceType")] = pydantic.Field( - alias="resourceType" - ) - """ - Type of resource this role applies to - """ - + resource_type: typing_extensions.Annotated[ + str, + FieldMetadata(alias="resourceType"), + pydantic.Field(alias="resourceType", description="Type of resource this role applies to"), + ] permissions: typing.List[str] = pydantic.Field() """ Define the resource type and the corresponding actions this role can perform on the resource diff --git a/src/truefoundry_sdk/types/role_with_resource.py b/src/truefoundry_sdk/types/role_with_resource.py index 4b81d251..6bde6343 100644 --- a/src/truefoundry_sdk/types/role_with_resource.py +++ b/src/truefoundry_sdk/types/role_with_resource.py @@ -10,13 +10,11 @@ class RoleWithResource(UniversalBaseModel): - role_id: typing_extensions.Annotated[str, FieldMetadata(alias="roleId")] = pydantic.Field(alias="roleId") - resource_type: typing_extensions.Annotated[RoleWithResourceResourceType, FieldMetadata(alias="resourceType")] = ( - pydantic.Field(alias="resourceType") - ) - resource_id: typing_extensions.Annotated[str, FieldMetadata(alias="resourceId")] = pydantic.Field( - alias="resourceId" - ) + role_id: typing_extensions.Annotated[str, FieldMetadata(alias="roleId"), pydantic.Field(alias="roleId")] + resource_type: typing_extensions.Annotated[ + RoleWithResourceResourceType, FieldMetadata(alias="resourceType"), pydantic.Field(alias="resourceType") + ] + resource_id: typing_extensions.Annotated[str, FieldMetadata(alias="resourceId"), pydantic.Field(alias="resourceId")] if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/role_with_resource_resource_type.py b/src/truefoundry_sdk/types/role_with_resource_resource_type.py index e8e8bbd8..6a7ab07d 100644 --- a/src/truefoundry_sdk/types/role_with_resource_resource_type.py +++ b/src/truefoundry_sdk/types/role_with_resource_resource_type.py @@ -27,6 +27,7 @@ class RoleWithResourceResourceType(enum.StrEnum): SERVICE_ACCOUNT = "service-account" LLM_GATEWAY = "llm-gateway" POLICY = "policy" + ROLE_BINDING = "role-binding" SETTINGS = "settings" PROVIDER_ACCOUNT = "provider-account" USER = "user" @@ -76,6 +77,7 @@ def visit( service_account: typing.Callable[[], T_Result], llm_gateway: typing.Callable[[], T_Result], policy: typing.Callable[[], T_Result], + role_binding: typing.Callable[[], T_Result], settings: typing.Callable[[], T_Result], provider_account: typing.Callable[[], T_Result], user: typing.Callable[[], T_Result], @@ -133,6 +135,8 @@ def visit( return llm_gateway() if self is RoleWithResourceResourceType.POLICY: return policy() + if self is RoleWithResourceResourceType.ROLE_BINDING: + return role_binding() if self is RoleWithResourceResourceType.SETTINGS: return settings() if self is RoleWithResourceResourceType.PROVIDER_ACCOUNT: diff --git a/src/truefoundry_sdk/types/sagemaker_assumed_role_based_auth.py b/src/truefoundry_sdk/types/sagemaker_assumed_role_based_auth.py new file mode 100644 index 00000000..ca0803f7 --- /dev/null +++ b/src/truefoundry_sdk/types/sagemaker_assumed_role_based_auth.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +from .aws_bedrock_assumed_role_based_auth import AwsBedrockAssumedRoleBasedAuth + +SagemakerAssumedRoleBasedAuth = AwsBedrockAssumedRoleBasedAuth diff --git a/src/truefoundry_sdk/types/samba_nova_provider_account.py b/src/truefoundry_sdk/types/samba_nova_provider_account.py index 8e27b74d..f2e5f46e 100644 --- a/src/truefoundry_sdk/types/samba_nova_provider_account.py +++ b/src/truefoundry_sdk/types/samba_nova_provider_account.py @@ -38,9 +38,9 @@ class SambaNovaProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/secret.py b/src/truefoundry_sdk/types/secret.py index 029a74c5..814ec15c 100644 --- a/src/truefoundry_sdk/types/secret.py +++ b/src/truefoundry_sdk/types/secret.py @@ -16,28 +16,32 @@ class Secret(UniversalBaseModel): id: str fqn: str name: str - secret_group_id: typing_extensions.Annotated[str, FieldMetadata(alias="secretGroupId")] = pydantic.Field( - alias="secretGroupId" - ) + secret_group_id: typing_extensions.Annotated[ + str, FieldMetadata(alias="secretGroupId"), pydantic.Field(alias="secretGroupId") + ] value: typing.Optional[str] = None created_by_subject: typing_extensions.Annotated[ - typing.Optional[Subject], FieldMetadata(alias="createdBySubject") - ] = pydantic.Field(alias="createdBySubject", default=None) - created_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="createdAt")] = ( - pydantic.Field(alias="createdAt", default=None) - ) - updated_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt")] = ( - pydantic.Field(alias="updatedAt", default=None) - ) + typing.Optional[Subject], FieldMetadata(alias="createdBySubject"), pydantic.Field(alias="createdBySubject") + ] = None + created_at: typing_extensions.Annotated[ + typing.Optional[dt.datetime], FieldMetadata(alias="createdAt"), pydantic.Field(alias="createdAt") + ] = None + updated_at: typing_extensions.Annotated[ + typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt"), pydantic.Field(alias="updatedAt") + ] = None secret_versions: typing_extensions.Annotated[ - typing.Optional[typing.List["SecretVersion"]], FieldMetadata(alias="secretVersions") - ] = pydantic.Field(alias="secretVersions", default=None) + typing.Optional[typing.List["SecretVersion"]], + FieldMetadata(alias="secretVersions"), + pydantic.Field(alias="secretVersions"), + ] = None active_deployments_count: typing_extensions.Annotated[ - typing.Optional[int], FieldMetadata(alias="activeDeploymentsCount") - ] = pydantic.Field(alias="activeDeploymentsCount", default=None) - created_by: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="createdBy")] = pydantic.Field( - alias="createdBy", default=None - ) + typing.Optional[int], + FieldMetadata(alias="activeDeploymentsCount"), + pydantic.Field(alias="activeDeploymentsCount"), + ] = None + created_by: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="createdBy"), pydantic.Field(alias="createdBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/secret_detection_guardrail_config.py b/src/truefoundry_sdk/types/secret_detection_guardrail_config.py index 72918e89..b6a7b69c 100644 --- a/src/truefoundry_sdk/types/secret_detection_guardrail_config.py +++ b/src/truefoundry_sdk/types/secret_detection_guardrail_config.py @@ -45,7 +45,7 @@ class SecretDetectionGuardrailConfig(UniversalBaseModel): """ enforcing_strategy: EnforcingStrategy - config: SecretDetectionGuardrailConfigConfig = pydantic.Field() + config: typing.Optional[SecretDetectionGuardrailConfigConfig] = pydantic.Field(default=None) """ +uiType=Ignore +uiProps={"forwardJsonKey": true} diff --git a/src/truefoundry_sdk/types/secret_group.py b/src/truefoundry_sdk/types/secret_group.py index 29f69239..dcf4c6b3 100644 --- a/src/truefoundry_sdk/types/secret_group.py +++ b/src/truefoundry_sdk/types/secret_group.py @@ -15,29 +15,27 @@ class SecretGroup(UniversalBaseModel): id: typing.Optional[str] = None fqn: typing.Optional[str] = None - tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName")] = pydantic.Field( - alias="tenantName" - ) - created_by_subject: typing_extensions.Annotated[Subject, FieldMetadata(alias="createdBySubject")] = pydantic.Field( - alias="createdBySubject" - ) - associated_secrets: typing_extensions.Annotated[typing.List["Secret"], FieldMetadata(alias="associatedSecrets")] = ( - pydantic.Field(alias="associatedSecrets") - ) - integration_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="integrationId")] = ( - pydantic.Field(alias="integrationId", default=None) - ) + tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName"), pydantic.Field(alias="tenantName")] + created_by_subject: typing_extensions.Annotated[ + Subject, FieldMetadata(alias="createdBySubject"), pydantic.Field(alias="createdBySubject") + ] + associated_secrets: typing_extensions.Annotated[ + typing.List["Secret"], FieldMetadata(alias="associatedSecrets"), pydantic.Field(alias="associatedSecrets") + ] + integration_id: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="integrationId"), pydantic.Field(alias="integrationId") + ] = None manifest: typing.Optional[typing.Dict[str, typing.Any]] = None - account_id: typing_extensions.Annotated[str, FieldMetadata(alias="accountId")] = pydantic.Field(alias="accountId") - created_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="createdAt")] = pydantic.Field( - alias="createdAt" - ) - updated_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="updatedAt")] = pydantic.Field( - alias="updatedAt" - ) - created_by: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="createdBy")] = pydantic.Field( - alias="createdBy", default=None - ) + account_id: typing_extensions.Annotated[str, FieldMetadata(alias="accountId"), pydantic.Field(alias="accountId")] + created_at: typing_extensions.Annotated[ + dt.datetime, FieldMetadata(alias="createdAt"), pydantic.Field(alias="createdAt") + ] + updated_at: typing_extensions.Annotated[ + dt.datetime, FieldMetadata(alias="updatedAt"), pydantic.Field(alias="updatedAt") + ] + created_by: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="createdBy"), pydantic.Field(alias="createdBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/secret_group_manifest.py b/src/truefoundry_sdk/types/secret_group_manifest.py index d144013f..d26636c5 100644 --- a/src/truefoundry_sdk/types/secret_group_manifest.py +++ b/src/truefoundry_sdk/types/secret_group_manifest.py @@ -31,9 +31,9 @@ class SecretGroupManifest(UniversalBaseModel): Users and Teams that have access to Secret Group """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/secret_version.py b/src/truefoundry_sdk/types/secret_version.py index 9e91c225..11ca0d25 100644 --- a/src/truefoundry_sdk/types/secret_version.py +++ b/src/truefoundry_sdk/types/secret_version.py @@ -17,15 +17,15 @@ class SecretVersion(UniversalBaseModel): value: typing.Optional[str] = None version: typing.Optional[float] = None secret: typing.Optional["Secret"] = None - secret_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="secretId")] = pydantic.Field( - alias="secretId", default=None - ) - created_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="createdAt")] = ( - pydantic.Field(alias="createdAt", default=None) - ) - updated_at: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt")] = ( - pydantic.Field(alias="updatedAt", default=None) - ) + secret_id: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="secretId"), pydantic.Field(alias="secretId") + ] = None + created_at: typing_extensions.Annotated[ + typing.Optional[dt.datetime], FieldMetadata(alias="createdAt"), pydantic.Field(alias="createdAt") + ] = None + updated_at: typing_extensions.Annotated[ + typing.Optional[dt.datetime], FieldMetadata(alias="updatedAt"), pydantic.Field(alias="updatedAt") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/self_hosted_agent.py b/src/truefoundry_sdk/types/self_hosted_agent.py new file mode 100644 index 00000000..adba6365 --- /dev/null +++ b/src/truefoundry_sdk/types/self_hosted_agent.py @@ -0,0 +1,36 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2 +from .agent_framework import AgentFramework +from .base_remote_agent import BaseRemoteAgent +from .custom_agent_server_auth import CustomAgentServerAuth + + +class SelfHostedAgent(BaseRemoteAgent): + """ + Self Hosted + """ + + type: typing.Literal["remote-agent/self-hosted"] = pydantic.Field(default="remote-agent/self-hosted") + """ + Type of the manifest + """ + + url: str = pydantic.Field() + """ + The URL of the server + """ + + auth_data: typing.Optional[CustomAgentServerAuth] = None + framework: AgentFramework + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/self_hosted_model_provider_account.py b/src/truefoundry_sdk/types/self_hosted_model_provider_account.py index caf9aa1a..be6a1601 100644 --- a/src/truefoundry_sdk/types/self_hosted_model_provider_account.py +++ b/src/truefoundry_sdk/types/self_hosted_model_provider_account.py @@ -38,9 +38,9 @@ class SelfHostedModelProviderAccount(UniversalBaseModel): Collaborators """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/session.py b/src/truefoundry_sdk/types/session.py index 7903bca8..b51f0de9 100644 --- a/src/truefoundry_sdk/types/session.py +++ b/src/truefoundry_sdk/types/session.py @@ -15,42 +15,46 @@ class Session(UniversalBaseModel): id: str - user_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="userName")] = pydantic.Field( - alias="userName", default=None - ) - subject_slug: typing_extensions.Annotated[str, FieldMetadata(alias="subjectSlug")] = pydantic.Field( - alias="subjectSlug" - ) + user_name: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="userName"), pydantic.Field(alias="userName") + ] = None + subject_slug: typing_extensions.Annotated[ + str, FieldMetadata(alias="subjectSlug"), pydantic.Field(alias="subjectSlug") + ] subject_controller_name: typing_extensions.Annotated[ - typing.Optional[str], FieldMetadata(alias="subjectControllerName") - ] = pydantic.Field(alias="subjectControllerName", default=None) - subject_pat_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="subjectPatName")] = ( - pydantic.Field(alias="subjectPatName", default=None) - ) + typing.Optional[str], + FieldMetadata(alias="subjectControllerName"), + pydantic.Field(alias="subjectControllerName"), + ] = None + subject_pat_name: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="subjectPatName"), pydantic.Field(alias="subjectPatName") + ] = None email: typing.Optional[str] = None - subject_type: typing_extensions.Annotated[SubjectType, FieldMetadata(alias="subjectType")] = pydantic.Field( - alias="subjectType" - ) - tenant_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="tenantName")] = pydantic.Field( - alias="tenantName", default=None - ) + subject_type: typing_extensions.Annotated[ + SubjectType, FieldMetadata(alias="subjectType"), pydantic.Field(alias="subjectType") + ] + tenant_name: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="tenantName"), pydantic.Field(alias="tenantName") + ] = None roles: typing.List[str] teams: typing.List[SessionTeam] accounts: typing.List[SessionAccount] metadata: typing.Optional[UserMetadata] = None - is_billing_enabled: typing_extensions.Annotated[typing.Optional[bool], FieldMetadata(alias="isBillingEnabled")] = ( - pydantic.Field(alias="isBillingEnabled", default=None) - ) + is_billing_enabled: typing_extensions.Annotated[ + typing.Optional[bool], FieldMetadata(alias="isBillingEnabled"), pydantic.Field(alias="isBillingEnabled") + ] = None service_account_metadata: typing_extensions.Annotated[ - typing.Optional[typing.Dict[str, typing.Any]], FieldMetadata(alias="serviceAccountMetadata") - ] = pydantic.Field(alias="serviceAccountMetadata", default=None) + typing.Optional[typing.Dict[str, typing.Any]], + FieldMetadata(alias="serviceAccountMetadata"), + pydantic.Field(alias="serviceAccountMetadata"), + ] = None account: typing.Optional[Account] = None - root_account: typing_extensions.Annotated[typing.Optional[Account], FieldMetadata(alias="rootAccount")] = ( - pydantic.Field(alias="rootAccount", default=None) - ) - effective_user_id: typing_extensions.Annotated[str, FieldMetadata(alias="effectiveUserId")] = pydantic.Field( - alias="effectiveUserId" - ) + root_account: typing_extensions.Annotated[ + typing.Optional[Account], FieldMetadata(alias="rootAccount"), pydantic.Field(alias="rootAccount") + ] = None + effective_user_id: typing_extensions.Annotated[ + str, FieldMetadata(alias="effectiveUserId"), pydantic.Field(alias="effectiveUserId") + ] if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/signed_url.py b/src/truefoundry_sdk/types/signed_url.py index 728c0519..fab76ab5 100644 --- a/src/truefoundry_sdk/types/signed_url.py +++ b/src/truefoundry_sdk/types/signed_url.py @@ -7,8 +7,15 @@ class SignedUrl(UniversalBaseModel): - path: str - signed_url: str + path: str = pydantic.Field() + """ + Relative path of the file within the artifact storage + """ + + signed_url: str = pydantic.Field() + """ + Pre-signed URL that can be used to access the file directly + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/slack_provider_account.py b/src/truefoundry_sdk/types/slack_provider_account.py index c52f1a8d..67eb61dc 100644 --- a/src/truefoundry_sdk/types/slack_provider_account.py +++ b/src/truefoundry_sdk/types/slack_provider_account.py @@ -30,9 +30,9 @@ class SlackProviderAccount(UniversalBaseModel): List of integrations that are associated with the provider account. """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/snowflake_cortex_provider_account.py b/src/truefoundry_sdk/types/snowflake_cortex_provider_account.py index 7a3df225..0ee4c7c0 100644 --- a/src/truefoundry_sdk/types/snowflake_cortex_provider_account.py +++ b/src/truefoundry_sdk/types/snowflake_cortex_provider_account.py @@ -45,9 +45,9 @@ class SnowflakeCortexProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/span_attribute_filter.py b/src/truefoundry_sdk/types/span_attribute_filter.py index 11edeaa2..e3df424d 100644 --- a/src/truefoundry_sdk/types/span_attribute_filter.py +++ b/src/truefoundry_sdk/types/span_attribute_filter.py @@ -11,9 +11,9 @@ class SpanAttributeFilter(UniversalBaseModel): - span_attribute_key: typing_extensions.Annotated[str, FieldMetadata(alias="spanAttributeKey")] = pydantic.Field( - alias="spanAttributeKey" - ) + span_attribute_key: typing_extensions.Annotated[ + str, FieldMetadata(alias="spanAttributeKey"), pydantic.Field(alias="spanAttributeKey") + ] operator: SpanAttributeFilterOperator value: SpanAttributeFilterValue diff --git a/src/truefoundry_sdk/types/span_field_filter.py b/src/truefoundry_sdk/types/span_field_filter.py index a4eebee7..b29e5632 100644 --- a/src/truefoundry_sdk/types/span_field_filter.py +++ b/src/truefoundry_sdk/types/span_field_filter.py @@ -12,9 +12,9 @@ class SpanFieldFilter(UniversalBaseModel): - span_field_name: typing_extensions.Annotated[SpanFieldFilterSpanFieldName, FieldMetadata(alias="spanFieldName")] = ( - pydantic.Field(alias="spanFieldName") - ) + span_field_name: typing_extensions.Annotated[ + SpanFieldFilterSpanFieldName, FieldMetadata(alias="spanFieldName"), pydantic.Field(alias="spanFieldName") + ] operator: SpanFieldFilterOperator value: SpanFieldFilterValue diff --git a/src/truefoundry_sdk/types/spark_job.py b/src/truefoundry_sdk/types/spark_job.py index 5b99107a..b20ab8df 100644 --- a/src/truefoundry_sdk/types/spark_job.py +++ b/src/truefoundry_sdk/types/spark_job.py @@ -40,7 +40,7 @@ class SparkJob(UniversalBaseModel): Configure environment variables to be injected in the service either as plain text. [Docs](https://docs.truefoundry.com/docs/env-variables) """ - spark_conf: typing.Optional[typing.Dict[str, typing.Any]] = pydantic.Field(default=None) + spark_conf: typing.Optional[typing.Dict[str, typing.Optional[str]]] = pydantic.Field(default=None) """ Extra configuration properties to be passed to the spark job. [Docs](https://spark.apache.org/docs/latest/configuration.html) """ diff --git a/src/truefoundry_sdk/types/spark_job_trigger_input.py b/src/truefoundry_sdk/types/spark_job_trigger_input.py index 57c3fc89..964ba8c4 100644 --- a/src/truefoundry_sdk/types/spark_job_trigger_input.py +++ b/src/truefoundry_sdk/types/spark_job_trigger_input.py @@ -9,20 +9,16 @@ class SparkJobTriggerInput(UniversalBaseModel): - main_class: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="mainClass")] = pydantic.Field( - alias="mainClass", default=None - ) - """ - Main Class for Spark Job - """ - + main_class: typing_extensions.Annotated[ + typing.Optional[str], + FieldMetadata(alias="mainClass"), + pydantic.Field(alias="mainClass", description="Main Class for Spark Job"), + ] = None main_application_file: typing_extensions.Annotated[ - typing.Optional[str], FieldMetadata(alias="mainApplicationFile") - ] = pydantic.Field(alias="mainApplicationFile", default=None) - """ - Main Application File for Spark Job - """ - + typing.Optional[str], + FieldMetadata(alias="mainApplicationFile"), + pydantic.Field(alias="mainApplicationFile", description="Main Application File for Spark Job"), + ] = None arguments: typing.Optional[str] = pydantic.Field(default=None) """ Arguments to pass to the main application file diff --git a/src/truefoundry_sdk/types/stage_artifact_response.py b/src/truefoundry_sdk/types/stage_artifact_response.py index a0e807e5..c62bcdba 100644 --- a/src/truefoundry_sdk/types/stage_artifact_response.py +++ b/src/truefoundry_sdk/types/stage_artifact_response.py @@ -7,9 +7,20 @@ class StageArtifactResponse(UniversalBaseModel): - id: str - storage_root: str - artifact_id: str + id: str = pydantic.Field() + """ + ID of the staged artifact version + """ + + storage_root: str = pydantic.Field() + """ + Root storage path where the artifact version files should be uploaded + """ + + artifact_id: str = pydantic.Field() + """ + ID of the artifact that the staged version belongs to + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/stdio_mcp_server_manifest.py b/src/truefoundry_sdk/types/stdio_mcp_server_manifest.py new file mode 100644 index 00000000..15838ec8 --- /dev/null +++ b/src/truefoundry_sdk/types/stdio_mcp_server_manifest.py @@ -0,0 +1,65 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +import typing_extensions +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from ..core.serialization import FieldMetadata +from .collaborator import Collaborator +from .mcp_server_env_auth import McpServerEnvAuth +from .owned_by import OwnedBy + + +class StdioMcpServerManifest(UniversalBaseModel): + """ + Stdio MCP server configuration. + """ + + name: str = pydantic.Field() + """ + The name of the MCP Server. + """ + + description: str = pydantic.Field() + """ + Provide a brief description of the purpose of this MCP Server. + """ + + collaborators: typing.List[Collaborator] = pydantic.Field() + """ + Users and Teams that have access to this MCP Server + """ + + type: typing.Literal["mcp-server/stdio"] = pydantic.Field(default="mcp-server/stdio") + """ + +value=mcp-server/stdio + +sort=400 + """ + + command: str = pydantic.Field(default="npx") + """ + Executable to run for the stdio MCP server process. + """ + + args: typing.Optional[typing.List[str]] = pydantic.Field(default=None) + """ + Arguments passed to the stdio MCP server command. + """ + + auth_data: typing.Optional[McpServerEnvAuth] = None + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None + tags: typing.Optional[typing.Dict[str, typing.Any]] = pydantic.Field(default=None) + """ + Key-value pairs to categorize this MCP Server (e.g., by owner or environment). + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/sticky_routing.py b/src/truefoundry_sdk/types/sticky_routing.py new file mode 100644 index 00000000..e1668a1d --- /dev/null +++ b/src/truefoundry_sdk/types/sticky_routing.py @@ -0,0 +1,31 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .sticky_session_identifier import StickySessionIdentifier + + +class StickyRouting(UniversalBaseModel): + """ + Sticky Routing + """ + + ttl_seconds: int = pydantic.Field() + """ + Sticky mapping TTL in seconds + """ + + session_identifiers: typing.List[StickySessionIdentifier] = pydantic.Field() + """ + List of identifier selectors used to build sticky key + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/sticky_session_identifier.py b/src/truefoundry_sdk/types/sticky_session_identifier.py new file mode 100644 index 00000000..32b762dc --- /dev/null +++ b/src/truefoundry_sdk/types/sticky_session_identifier.py @@ -0,0 +1,31 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .sticky_session_identifier_source import StickySessionIdentifierSource + + +class StickySessionIdentifier(UniversalBaseModel): + """ + Sticky Session Identifier + """ + + source: StickySessionIdentifierSource = pydantic.Field() + """ + Source from which session identifier value will be extracted + """ + + key: str = pydantic.Field() + """ + Key to read from selected source + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/sticky_session_identifier_source.py b/src/truefoundry_sdk/types/sticky_session_identifier_source.py new file mode 100644 index 00000000..948ad24e --- /dev/null +++ b/src/truefoundry_sdk/types/sticky_session_identifier_source.py @@ -0,0 +1,38 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +from ..core import enum + +T_Result = typing.TypeVar("T_Result") + + +class StickySessionIdentifierSource(enum.StrEnum): + """ + Source from which session identifier value will be extracted + """ + + HEADERS = "headers" + METADATA = "metadata" + _UNKNOWN = "__STICKYSESSIONIDENTIFIERSOURCE_UNKNOWN__" + """ + This member is used for forward compatibility. If the value is not recognized by the enum, it will be stored here, and the raw value is accessible through `.value`. + """ + + @classmethod + def _missing_(cls, value: typing.Any) -> "StickySessionIdentifierSource": + unknown = cls._UNKNOWN + unknown._value_ = value + return unknown + + def visit( + self, + headers: typing.Callable[[], T_Result], + metadata: typing.Callable[[], T_Result], + _unknown_member: typing.Callable[[str], T_Result], + ) -> T_Result: + if self is StickySessionIdentifierSource.HEADERS: + return headers() + if self is StickySessionIdentifierSource.METADATA: + return metadata() + return _unknown_member(self._value_) diff --git a/src/truefoundry_sdk/types/subject.py b/src/truefoundry_sdk/types/subject.py index 2418a409..96152430 100644 --- a/src/truefoundry_sdk/types/subject.py +++ b/src/truefoundry_sdk/types/subject.py @@ -10,31 +10,39 @@ class Subject(UniversalBaseModel): - subject_id: typing_extensions.Annotated[str, FieldMetadata(alias="subjectId")] = pydantic.Field(alias="subjectId") - """ - Subject ID - """ - - subject_type: typing_extensions.Annotated[SubjectType, FieldMetadata(alias="subjectType")] = pydantic.Field( - alias="subjectType" - ) - """ - Subject type - """ - - subject_slug: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="subjectSlug")] = ( - pydantic.Field(alias="subjectSlug", default=None) - ) - """ - Subject slug - """ - + subject_id: typing_extensions.Annotated[ + str, FieldMetadata(alias="subjectId"), pydantic.Field(alias="subjectId", description="Subject ID") + ] + subject_type: typing_extensions.Annotated[ + SubjectType, FieldMetadata(alias="subjectType"), pydantic.Field(alias="subjectType", description="Subject type") + ] + subject_slug: typing_extensions.Annotated[ + typing.Optional[str], + FieldMetadata(alias="subjectSlug"), + pydantic.Field(alias="subjectSlug", description="Subject slug"), + ] = None subject_display_name: typing_extensions.Annotated[ - typing.Optional[str], FieldMetadata(alias="subjectDisplayName") - ] = pydantic.Field(alias="subjectDisplayName", default=None) - """ - Subject display name - """ + typing.Optional[str], + FieldMetadata(alias="subjectDisplayName"), + pydantic.Field(alias="subjectDisplayName", description="Subject display name"), + ] = None + subject_pat_name: typing_extensions.Annotated[ + typing.Optional[str], + FieldMetadata(alias="subjectPatName"), + pydantic.Field(alias="subjectPatName", description="Subject PAT name"), + ] = None + subject_controller_name: typing_extensions.Annotated[ + typing.Optional[str], + FieldMetadata(alias="subjectControllerName"), + pydantic.Field(alias="subjectControllerName"), + ] = None + subject_external_identity_slug: typing_extensions.Annotated[ + typing.Optional[str], + FieldMetadata(alias="subjectExternalIdentitySlug"), + pydantic.Field( + alias="subjectExternalIdentitySlug", description="External identity slug (external_identity_id:sub:email)" + ), + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/subject_clause.py b/src/truefoundry_sdk/types/subject_clause.py index 51804360..2ae55ec2 100644 --- a/src/truefoundry_sdk/types/subject_clause.py +++ b/src/truefoundry_sdk/types/subject_clause.py @@ -9,9 +9,9 @@ class SubjectClause(UniversalBaseModel): - in_: typing_extensions.Annotated[typing.Optional[typing.List[str]], FieldMetadata(alias="in")] = pydantic.Field( - alias="in", default=None - ) + in_: typing_extensions.Annotated[ + typing.Optional[typing.List[str]], FieldMetadata(alias="in"), pydantic.Field(alias="in") + ] = None not_in: typing.Optional[typing.List[str]] = None if IS_PYDANTIC_V2: diff --git a/src/truefoundry_sdk/types/subject_permission.py b/src/truefoundry_sdk/types/subject_permission.py new file mode 100644 index 00000000..df851765 --- /dev/null +++ b/src/truefoundry_sdk/types/subject_permission.py @@ -0,0 +1,51 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +import typing_extensions +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from ..core.serialization import FieldMetadata + + +class SubjectPermission(UniversalBaseModel): + resource_type: typing_extensions.Annotated[ + str, FieldMetadata(alias="resourceType"), pydantic.Field(alias="resourceType", description="Resource Type") + ] + resource_id: typing_extensions.Annotated[ + str, FieldMetadata(alias="resourceId"), pydantic.Field(alias="resourceId", description="Resource ID") + ] + resource_name: typing_extensions.Annotated[ + typing.Optional[str], + FieldMetadata(alias="resourceName"), + pydantic.Field(alias="resourceName", description="Resource Name (if available)"), + ] = None + resource_fqn: typing_extensions.Annotated[ + typing.Optional[str], + FieldMetadata(alias="resourceFqn"), + pydantic.Field(alias="resourceFqn", description="Resource FQN (if available)"), + ] = None + role_id: typing_extensions.Annotated[ + str, FieldMetadata(alias="roleId"), pydantic.Field(alias="roleId", description="Role ID") + ] + role_name: typing_extensions.Annotated[ + str, FieldMetadata(alias="roleName"), pydantic.Field(alias="roleName", description="Role Name") + ] + subject_id: typing_extensions.Annotated[ + str, + FieldMetadata(alias="subjectId"), + pydantic.Field(alias="subjectId", description="Subject ID (user or team)"), + ] + subject_type: typing_extensions.Annotated[ + str, + FieldMetadata(alias="subjectType"), + pydantic.Field(alias="subjectType", description="Subject Type (user or team)"), + ] + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/subject_type.py b/src/truefoundry_sdk/types/subject_type.py index 54113263..722f739e 100644 --- a/src/truefoundry_sdk/types/subject_type.py +++ b/src/truefoundry_sdk/types/subject_type.py @@ -13,6 +13,7 @@ class SubjectType(enum.StrEnum): SERVICEACCOUNT = "serviceaccount" VIRTUALACCOUNT = "virtualaccount" EXTERNAL_IDENTITY = "external-identity" + ROLE = "role" _UNKNOWN = "__SUBJECTTYPE_UNKNOWN__" """ This member is used for forward compatibility. If the value is not recognized by the enum, it will be stored here, and the raw value is accessible through `.value`. @@ -31,6 +32,7 @@ def visit( serviceaccount: typing.Callable[[], T_Result], virtualaccount: typing.Callable[[], T_Result], external_identity: typing.Callable[[], T_Result], + role: typing.Callable[[], T_Result], _unknown_member: typing.Callable[[str], T_Result], ) -> T_Result: if self is SubjectType.USER: @@ -43,4 +45,6 @@ def visit( return virtualaccount() if self is SubjectType.EXTERNAL_IDENTITY: return external_identity() + if self is SubjectType.ROLE: + return role() return _unknown_member(self._value_) diff --git a/src/truefoundry_sdk/types/sync_token_in_secret_store_info.py b/src/truefoundry_sdk/types/sync_token_in_secret_store_info.py index 96bfb467..bb2ded51 100644 --- a/src/truefoundry_sdk/types/sync_token_in_secret_store_info.py +++ b/src/truefoundry_sdk/types/sync_token_in_secret_store_info.py @@ -9,11 +9,11 @@ class SyncTokenInSecretStoreInfo(UniversalBaseModel): - updated_at: typing_extensions.Annotated[str, FieldMetadata(alias="updatedAt")] = pydantic.Field(alias="updatedAt") - """ - ISO timestamp of when the token was synced - """ - + updated_at: typing_extensions.Annotated[ + str, + FieldMetadata(alias="updatedAt"), + pydantic.Field(alias="updatedAt", description="ISO timestamp of when the token was synced"), + ] error: typing.Optional[str] = pydantic.Field(default=None) """ Error message if sync failed diff --git a/src/truefoundry_sdk/types/sync_virtual_account_token_response.py b/src/truefoundry_sdk/types/sync_virtual_account_token_response.py index ce2caa38..f59eeccd 100644 --- a/src/truefoundry_sdk/types/sync_virtual_account_token_response.py +++ b/src/truefoundry_sdk/types/sync_virtual_account_token_response.py @@ -11,11 +11,12 @@ class SyncVirtualAccountTokenResponse(UniversalBaseModel): sync_token_in_secret_store_info: typing_extensions.Annotated[ - SyncTokenInSecretStoreInfo, FieldMetadata(alias="syncTokenInSecretStoreInfo") - ] = pydantic.Field(alias="syncTokenInSecretStoreInfo") - """ - Sync status including timestamp and error (if any) - """ + SyncTokenInSecretStoreInfo, + FieldMetadata(alias="syncTokenInSecretStoreInfo"), + pydantic.Field( + alias="syncTokenInSecretStoreInfo", description="Sync status including timestamp and error (if any)" + ), + ] if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/target_clause.py b/src/truefoundry_sdk/types/target_clause.py index fa9d16e6..faff21f5 100644 --- a/src/truefoundry_sdk/types/target_clause.py +++ b/src/truefoundry_sdk/types/target_clause.py @@ -7,15 +7,16 @@ from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel from ..core.serialization import FieldMetadata from .in_not_in_operator import InNotInOperator +from .mcp_tools_operator import McpToolsOperator class TargetClause(UniversalBaseModel): - mcp_servers: typing_extensions.Annotated[typing.Optional[InNotInOperator], FieldMetadata(alias="mcpServers")] = ( - pydantic.Field(alias="mcpServers", default=None) - ) - mcp_tools: typing_extensions.Annotated[typing.Optional[InNotInOperator], FieldMetadata(alias="mcpTools")] = ( - pydantic.Field(alias="mcpTools", default=None) - ) + mcp_servers: typing_extensions.Annotated[ + typing.Optional[InNotInOperator], FieldMetadata(alias="mcpServers"), pydantic.Field(alias="mcpServers") + ] = None + mcp_tools: typing_extensions.Annotated[ + typing.Optional[McpToolsOperator], FieldMetadata(alias="mcpTools"), pydantic.Field(alias="mcpTools") + ] = None model: typing.Optional[InNotInOperator] = None if IS_PYDANTIC_V2: diff --git a/src/truefoundry_sdk/types/task_docker_file_build.py b/src/truefoundry_sdk/types/task_docker_file_build.py index 796fbdef..c1a30714 100644 --- a/src/truefoundry_sdk/types/task_docker_file_build.py +++ b/src/truefoundry_sdk/types/task_docker_file_build.py @@ -13,6 +13,7 @@ class TaskDockerFileBuild(UniversalBaseModel): type: typing.Literal["task-dockerfile-build"] = pydantic.Field(default="task-dockerfile-build") """ + +uiType=Hidden +value=dockerfile """ diff --git a/src/truefoundry_sdk/types/task_py_spark_build.py b/src/truefoundry_sdk/types/task_py_spark_build.py index 53657fd7..594c3533 100644 --- a/src/truefoundry_sdk/types/task_py_spark_build.py +++ b/src/truefoundry_sdk/types/task_py_spark_build.py @@ -13,6 +13,7 @@ class TaskPySparkBuild(UniversalBaseModel): type: typing.Literal["task-pyspark-build"] = pydantic.Field(default="task-pyspark-build") """ + +uiType=Hidden +value=task-pyspark-build """ @@ -21,6 +22,13 @@ class TaskPySparkBuild(UniversalBaseModel): Spark version should match the spark version installed in the image. """ + container_image: typing.Optional[str] = pydantic.Field(default=None) + """ + Custom container image URI. If provided, this image is used instead of the + default Spark base image (public.ecr.aws/bitnami/spark). The image must be + Debian-based and have Python and Spark pre-installed. + """ + docker_registry: typing.Optional[str] = pydantic.Field(default=None) """ FQN of the container registry. If you can't find your registry here, diff --git a/src/truefoundry_sdk/types/task_python_build.py b/src/truefoundry_sdk/types/task_python_build.py index 732cf131..b1d599d3 100644 --- a/src/truefoundry_sdk/types/task_python_build.py +++ b/src/truefoundry_sdk/types/task_python_build.py @@ -13,6 +13,7 @@ class TaskPythonBuild(UniversalBaseModel): type: typing.Literal["task-python-build"] = pydantic.Field(default="task-python-build") """ + +uiType=Hidden +value=task-python-build """ diff --git a/src/truefoundry_sdk/types/team.py b/src/truefoundry_sdk/types/team.py index 93702685..4c32ca0d 100644 --- a/src/truefoundry_sdk/types/team.py +++ b/src/truefoundry_sdk/types/team.py @@ -15,25 +15,23 @@ class Team(UniversalBaseModel): id: str description: str - tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName")] = pydantic.Field( - alias="tenantName" - ) - account_id: typing_extensions.Annotated[str, FieldMetadata(alias="accountId")] = pydantic.Field(alias="accountId") - created_by_subject: typing_extensions.Annotated[Subject, FieldMetadata(alias="createdBySubject")] = pydantic.Field( - alias="createdBySubject" - ) + tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName"), pydantic.Field(alias="tenantName")] + account_id: typing_extensions.Annotated[str, FieldMetadata(alias="accountId"), pydantic.Field(alias="accountId")] + created_by_subject: typing_extensions.Annotated[ + Subject, FieldMetadata(alias="createdBySubject"), pydantic.Field(alias="createdBySubject") + ] members: typing.Optional[typing.List[str]] = None - created_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="createdAt")] = pydantic.Field( - alias="createdAt" - ) - updated_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="updatedAt")] = pydantic.Field( - alias="updatedAt" - ) + created_at: typing_extensions.Annotated[ + dt.datetime, FieldMetadata(alias="createdAt"), pydantic.Field(alias="createdAt") + ] + updated_at: typing_extensions.Annotated[ + dt.datetime, FieldMetadata(alias="updatedAt"), pydantic.Field(alias="updatedAt") + ] manifest: TeamManifest metadata: typing.Optional[TeamMetadata] = None - is_editable: typing_extensions.Annotated[bool, FieldMetadata(alias="isEditable")] = pydantic.Field( - alias="isEditable" - ) + is_editable: typing_extensions.Annotated[ + bool, FieldMetadata(alias="isEditable"), pydantic.Field(alias="isEditable") + ] if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/team_manifest.py b/src/truefoundry_sdk/types/team_manifest.py index 210ad43b..76b5419d 100644 --- a/src/truefoundry_sdk/types/team_manifest.py +++ b/src/truefoundry_sdk/types/team_manifest.py @@ -30,9 +30,13 @@ class TeamManifest(UniversalBaseModel): Enter email of each of the user you want to add in the team. """ - owned_by: typing_extensions.Annotated[typing.Optional[TeamOwnedBy], FieldMetadata(alias="ownedBy")] = ( - pydantic.Field(alias="ownedBy", default=None) - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[TeamOwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None + tags: typing.Optional[typing.Dict[str, typing.Any]] = pydantic.Field(default=None) + """ + Key-value pairs to categorize this Team (e.g., by owner or environment). + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/team_metadata.py b/src/truefoundry_sdk/types/team_metadata.py index d373e195..dc267166 100644 --- a/src/truefoundry_sdk/types/team_metadata.py +++ b/src/truefoundry_sdk/types/team_metadata.py @@ -9,9 +9,9 @@ class TeamMetadata(UniversalBaseModel): - created_by_scim: typing_extensions.Annotated[typing.Optional[bool], FieldMetadata(alias="createdByScim")] = ( - pydantic.Field(alias="createdByScim", default=None) - ) + created_by_scim: typing_extensions.Annotated[ + typing.Optional[bool], FieldMetadata(alias="createdByScim"), pydantic.Field(alias="createdByScim") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/terminate_job_response.py b/src/truefoundry_sdk/types/terminate_job_response.py index e7d4ed90..32fde267 100644 --- a/src/truefoundry_sdk/types/terminate_job_response.py +++ b/src/truefoundry_sdk/types/terminate_job_response.py @@ -15,12 +15,11 @@ class TerminateJobResponse(UniversalBaseModel): Terminate Job Message """ - job_run_status: typing_extensions.Annotated[JobRunStatus, FieldMetadata(alias="jobRunStatus")] = pydantic.Field( - alias="jobRunStatus" - ) - """ - Job run status - """ + job_run_status: typing_extensions.Annotated[ + JobRunStatus, + FieldMetadata(alias="jobRunStatus"), + pydantic.Field(alias="jobRunStatus", description="Job run status"), + ] if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/together_ai_provider_account.py b/src/truefoundry_sdk/types/together_ai_provider_account.py index bd3332eb..656d5593 100644 --- a/src/truefoundry_sdk/types/together_ai_provider_account.py +++ b/src/truefoundry_sdk/types/together_ai_provider_account.py @@ -38,9 +38,9 @@ class TogetherAiProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/token_pagination.py b/src/truefoundry_sdk/types/token_pagination.py index ccb08a2b..cdfc5286 100644 --- a/src/truefoundry_sdk/types/token_pagination.py +++ b/src/truefoundry_sdk/types/token_pagination.py @@ -14,19 +14,16 @@ class TokenPagination(UniversalBaseModel): Number of items per page """ - next_page_token: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="nextPageToken")] = ( - pydantic.Field(alias="nextPageToken", default=None) - ) - """ - Base64 encoded token for the next page - """ - - previous_page_token: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="previousPageToken")] = ( - pydantic.Field(alias="previousPageToken", default=None) - ) - """ - Base64 encoded token for the previous page - """ + next_page_token: typing_extensions.Annotated[ + typing.Optional[str], + FieldMetadata(alias="nextPageToken"), + pydantic.Field(alias="nextPageToken", description="Base64 encoded token for the next page"), + ] = None + previous_page_token: typing_extensions.Annotated[ + typing.Optional[str], + FieldMetadata(alias="previousPageToken"), + pydantic.Field(alias="previousPageToken", description="Base64 encoded token for the previous page"), + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/trace_span.py b/src/truefoundry_sdk/types/trace_span.py index dc287c4d..020a6b53 100644 --- a/src/truefoundry_sdk/types/trace_span.py +++ b/src/truefoundry_sdk/types/trace_span.py @@ -10,97 +10,87 @@ class TraceSpan(UniversalBaseModel): - span_id: typing_extensions.Annotated[str, FieldMetadata(alias="spanId")] = pydantic.Field(alias="spanId") - """ - Unique identifier for the span within the trace. - """ - - trace_id: typing_extensions.Annotated[str, FieldMetadata(alias="traceId")] = pydantic.Field(alias="traceId") - """ - Unique identifier for the trace that contains this span. - """ - - parent_span_id: typing_extensions.Annotated[str, FieldMetadata(alias="parentSpanId")] = pydantic.Field( - alias="parentSpanId" - ) - """ - Identifier of the parent span in the trace hierarchy. - """ - - service_name: typing_extensions.Annotated[str, FieldMetadata(alias="serviceName")] = pydantic.Field( - alias="serviceName" - ) - """ - Name of the service that generated this span. - """ - - span_name: typing_extensions.Annotated[str, FieldMetadata(alias="spanName")] = pydantic.Field(alias="spanName") - """ - Name of the span - """ - - span_kind: typing_extensions.Annotated[str, FieldMetadata(alias="spanKind")] = pydantic.Field(alias="spanKind") - """ - Type of span (e.g., CLIENT, SERVER, INTERNAL, PRODUCER, CONSUMER). - """ - - scope_name: typing_extensions.Annotated[str, FieldMetadata(alias="scopeName")] = pydantic.Field(alias="scopeName") - """ - Name of the instrumentation scope that created this span. - """ - - scope_version: typing_extensions.Annotated[str, FieldMetadata(alias="scopeVersion")] = pydantic.Field( - alias="scopeVersion" - ) - """ - Version of the instrumentation scope that created this span. - """ - + span_id: typing_extensions.Annotated[ + str, + FieldMetadata(alias="spanId"), + pydantic.Field(alias="spanId", description="Unique identifier for the span within the trace."), + ] + trace_id: typing_extensions.Annotated[ + str, + FieldMetadata(alias="traceId"), + pydantic.Field(alias="traceId", description="Unique identifier for the trace that contains this span."), + ] + parent_span_id: typing_extensions.Annotated[ + str, + FieldMetadata(alias="parentSpanId"), + pydantic.Field(alias="parentSpanId", description="Identifier of the parent span in the trace hierarchy."), + ] + service_name: typing_extensions.Annotated[ + str, + FieldMetadata(alias="serviceName"), + pydantic.Field(alias="serviceName", description="Name of the service that generated this span."), + ] + span_name: typing_extensions.Annotated[ + str, FieldMetadata(alias="spanName"), pydantic.Field(alias="spanName", description="Name of the span") + ] + span_kind: typing_extensions.Annotated[ + str, + FieldMetadata(alias="spanKind"), + pydantic.Field( + alias="spanKind", description="Type of span (e.g., CLIENT, SERVER, INTERNAL, PRODUCER, CONSUMER)." + ), + ] + scope_name: typing_extensions.Annotated[ + str, + FieldMetadata(alias="scopeName"), + pydantic.Field(alias="scopeName", description="Name of the instrumentation scope that created this span."), + ] + scope_version: typing_extensions.Annotated[ + str, + FieldMetadata(alias="scopeVersion"), + pydantic.Field( + alias="scopeVersion", description="Version of the instrumentation scope that created this span." + ), + ] timestamp: str = pydantic.Field() """ Timestamp in ISO 8601 format (e.g., 2025-03-12T00:00:09.872Z). """ - duration_ns: typing_extensions.Annotated[float, FieldMetadata(alias="durationNs")] = pydantic.Field( - alias="durationNs" - ) - """ - Duration of the span in nanoseconds. - """ - - status_code: typing_extensions.Annotated[str, FieldMetadata(alias="statusCode")] = pydantic.Field( - alias="statusCode" - ) - """ - Status code of the span (e.g., OK, ERROR, UNSET). - """ - - status_message: typing_extensions.Annotated[str, FieldMetadata(alias="statusMessage")] = pydantic.Field( - alias="statusMessage" - ) - """ - Human-readable status message describing the span result. - """ - + duration_ns: typing_extensions.Annotated[ + float, + FieldMetadata(alias="durationNs"), + pydantic.Field(alias="durationNs", description="Duration of the span in nanoseconds."), + ] + status_code: typing_extensions.Annotated[ + str, + FieldMetadata(alias="statusCode"), + pydantic.Field(alias="statusCode", description="Status code of the span (e.g., OK, ERROR, UNSET)."), + ] + status_message: typing_extensions.Annotated[ + str, + FieldMetadata(alias="statusMessage"), + pydantic.Field(alias="statusMessage", description="Human-readable status message describing the span result."), + ] span_attributes: typing_extensions.Annotated[ - typing.Dict[str, typing.Any], FieldMetadata(alias="spanAttributes") - ] = pydantic.Field(alias="spanAttributes") - """ - Key-value pairs containing additional metadata about the span. - """ - + typing.Dict[str, typing.Any], + FieldMetadata(alias="spanAttributes"), + pydantic.Field( + alias="spanAttributes", description="Key-value pairs containing additional metadata about the span." + ), + ] events: typing.List[typing.Dict[str, typing.Any]] = pydantic.Field() """ Array of events that occurred during the span execution. """ - created_by_subject: typing_extensions.Annotated[Subject, FieldMetadata(alias="createdBySubject")] = pydantic.Field( - alias="createdBySubject" - ) - """ - Subject (user or virtualaccount) that created this span. - """ - + created_by_subject: typing_extensions.Annotated[ + Subject, + FieldMetadata(alias="createdBySubject"), + pydantic.Field( + alias="createdBySubject", description="Subject (user or virtualaccount) that created this span." + ), + ] feedbacks: typing.Optional[typing.List[typing.List[typing.Any]]] = pydantic.Field(default=None) """ Gateway feedbacks associated with this span (if any). diff --git a/src/truefoundry_sdk/types/tracing_project_manifest.py b/src/truefoundry_sdk/types/tracing_project_manifest.py index 821956ed..fe440331 100644 --- a/src/truefoundry_sdk/types/tracing_project_manifest.py +++ b/src/truefoundry_sdk/types/tracing_project_manifest.py @@ -45,9 +45,9 @@ class TracingProjectManifest(UniversalBaseModel): Note: Metrics will be retained regardless of this setting. """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/trigger_job_run_response.py b/src/truefoundry_sdk/types/trigger_job_run_response.py index 89ddd003..df313aac 100644 --- a/src/truefoundry_sdk/types/trigger_job_run_response.py +++ b/src/truefoundry_sdk/types/trigger_job_run_response.py @@ -15,13 +15,9 @@ class TriggerJobRunResponse(UniversalBaseModel): Job triggered """ - job_run_name: typing_extensions.Annotated[str, FieldMetadata(alias="jobRunName")] = pydantic.Field( - alias="jobRunName" - ) - """ - Name of the job run - """ - + job_run_name: typing_extensions.Annotated[ + str, FieldMetadata(alias="jobRunName"), pydantic.Field(alias="jobRunName", description="Name of the job run") + ] data: JobRun = pydantic.Field() """ Details of the triggered job run diff --git a/src/truefoundry_sdk/types/troj_ai_client_id_auth.py b/src/truefoundry_sdk/types/troj_ai_client_id_auth.py new file mode 100644 index 00000000..58c875a6 --- /dev/null +++ b/src/truefoundry_sdk/types/troj_ai_client_id_auth.py @@ -0,0 +1,30 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class TrojAiClientIdAuth(UniversalBaseModel): + """ + Authentication using a TrojAI firewall client ID (x-eag-clientid) + """ + + type: typing.Literal["client-id"] = pydantic.Field(default="client-id") + """ + +value=client-id + """ + + client_id: str = pydantic.Field() + """ + The client ID that identifies your TrojAI firewall policy (sent as x-eag-clientid header) + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/prompt_foo_guardrail_config.py b/src/truefoundry_sdk/types/troj_ai_guardrail_config.py similarity index 58% rename from src/truefoundry_sdk/types/prompt_foo_guardrail_config.py rename to src/truefoundry_sdk/types/troj_ai_guardrail_config.py index 4b9f297f..57b1c058 100644 --- a/src/truefoundry_sdk/types/prompt_foo_guardrail_config.py +++ b/src/truefoundry_sdk/types/troj_ai_guardrail_config.py @@ -5,13 +5,14 @@ import pydantic from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel from .enforcing_strategy import EnforcingStrategy -from .prompt_foo_guardrail_config_config import PromptFooGuardrailConfigConfig -from .prompt_foo_guardrail_config_operation import PromptFooGuardrailConfigOperation +from .troj_ai_client_id_auth import TrojAiClientIdAuth +from .troj_ai_guardrail_config_config import TrojAiGuardrailConfigConfig +from .troj_ai_guardrail_config_operation import TrojAiGuardrailConfigOperation -class PromptFooGuardrailConfig(UniversalBaseModel): +class TrojAiGuardrailConfig(UniversalBaseModel): """ - PromptFoo + TrojAI """ name: str = pydantic.Field() @@ -19,24 +20,24 @@ class PromptFooGuardrailConfig(UniversalBaseModel): The name of the Guardrail Config. """ - description: typing.Optional[str] = pydantic.Field( - default="PromptFoo guardrails: guard check, PII redaction, or harmful content detection" - ) + description: typing.Optional[str] = pydantic.Field(default="TrojAI DEFEND firewall for real-time AI security") """ Optional description for this Guardrail Config. """ - type: typing.Literal["integration/guardrail-config/promptfoo"] = pydantic.Field( - default="integration/guardrail-config/promptfoo" + type: typing.Literal["integration/guardrail-config/trojai"] = pydantic.Field( + default="integration/guardrail-config/trojai" ) """ +uiType=Hidden - +value=integration/guardrail-config/promptfoo + +value=integration/guardrail-config/trojai """ - operation: PromptFooGuardrailConfigOperation = pydantic.Field() + auth_data: TrojAiClientIdAuth + operation: TrojAiGuardrailConfigOperation = pydantic.Field() """ The operation type to use for the Guardrail. Validate guardrails are used to validate requests and mutate can validate as well as mutate requests. + Validate guardrails are run in parallel while mutate guardrails are run sequentially. """ priority: typing.Optional[int] = pydantic.Field(default=1) @@ -45,7 +46,7 @@ class PromptFooGuardrailConfig(UniversalBaseModel): """ enforcing_strategy: EnforcingStrategy - config: PromptFooGuardrailConfigConfig = pydantic.Field() + config: TrojAiGuardrailConfigConfig = pydantic.Field() """ +uiType=Ignore +uiProps={"forwardJsonKey": true} diff --git a/src/truefoundry_sdk/types/troj_ai_guardrail_config_config.py b/src/truefoundry_sdk/types/troj_ai_guardrail_config_config.py new file mode 100644 index 00000000..c9662ab2 --- /dev/null +++ b/src/truefoundry_sdk/types/troj_ai_guardrail_config_config.py @@ -0,0 +1,26 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class TrojAiGuardrailConfigConfig(UniversalBaseModel): + """ + +uiType=Ignore + +uiProps={"forwardJsonKey": true} + """ + + base_url: str = pydantic.Field() + """ + The base URL of the TrojAI firewall (e.g. https://your-trojai-firewall-host) + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/troj_ai_guardrail_config_operation.py b/src/truefoundry_sdk/types/troj_ai_guardrail_config_operation.py new file mode 100644 index 00000000..fa52dc38 --- /dev/null +++ b/src/truefoundry_sdk/types/troj_ai_guardrail_config_operation.py @@ -0,0 +1,39 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +from ..core import enum + +T_Result = typing.TypeVar("T_Result") + + +class TrojAiGuardrailConfigOperation(enum.StrEnum): + """ + The operation type to use for the Guardrail. Validate guardrails are used to validate requests and mutate can validate as well as mutate requests. + Validate guardrails are run in parallel while mutate guardrails are run sequentially. + """ + + VALIDATE = "validate" + MUTATE = "mutate" + _UNKNOWN = "__TROJAIGUARDRAILCONFIGOPERATION_UNKNOWN__" + """ + This member is used for forward compatibility. If the value is not recognized by the enum, it will be stored here, and the raw value is accessible through `.value`. + """ + + @classmethod + def _missing_(cls, value: typing.Any) -> "TrojAiGuardrailConfigOperation": + unknown = cls._UNKNOWN + unknown._value_ = value + return unknown + + def visit( + self, + validate: typing.Callable[[], T_Result], + mutate: typing.Callable[[], T_Result], + _unknown_member: typing.Callable[[str], T_Result], + ) -> T_Result: + if self is TrojAiGuardrailConfigOperation.VALIDATE: + return validate() + if self is TrojAiGuardrailConfigOperation.MUTATE: + return mutate() + return _unknown_member(self._value_) diff --git a/src/truefoundry_sdk/types/true_foundry_agent_manifest.py b/src/truefoundry_sdk/types/true_foundry_agent_manifest.py new file mode 100644 index 00000000..e35bfe3c --- /dev/null +++ b/src/truefoundry_sdk/types/true_foundry_agent_manifest.py @@ -0,0 +1,106 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +import typing_extensions +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from ..core.serialization import FieldMetadata +from .collaborator import Collaborator +from .owned_by import OwnedBy +from .true_foundry_agent_manifest_model_params import TrueFoundryAgentManifestModelParams +from .true_foundry_agent_manifest_response_format import TrueFoundryAgentManifestResponseFormat +from .true_foundry_agent_manifest_sandbox import TrueFoundryAgentManifestSandbox +from .true_foundry_agent_mcp_server import TrueFoundryAgentMcpServer +from .true_foundry_agent_skill import TrueFoundryAgentSkill +from .true_foundry_agent_user_message import TrueFoundryAgentUserMessage +from .true_foundry_agent_variable import TrueFoundryAgentVariable + + +class TrueFoundryAgentManifest(UniversalBaseModel): + type: typing.Literal["truefoundry-agent"] = pydantic.Field(default="truefoundry-agent") + """ + Type of the manifest + """ + + name: str = pydantic.Field() + """ + The name of the Agent + """ + + description: str = pydantic.Field() + """ + The description of the Agent + """ + + tags: typing.Optional[typing.Dict[str, typing.Any]] = pydantic.Field(default=None) + """ + Tags for the Agent + """ + + model: str = pydantic.Field() + """ + Model for the Agent + """ + + model_params: typing.Optional[TrueFoundryAgentManifestModelParams] = pydantic.Field(default=None) + """ + Model parameters (default and extra). Keys are param names, values are float, int, bool, or string. + """ + + skills: typing.Optional[typing.List[TrueFoundryAgentSkill]] = pydantic.Field(default=None) + """ + List of agent skills to attach to this agent + """ + + mcp_servers: typing.Optional[typing.List[TrueFoundryAgentMcpServer]] = pydantic.Field(default=None) + """ + List of MCP servers with name, enable_all_tools, and optional tools filter + """ + + instruction: typing.Optional[str] = pydantic.Field(default=None) + """ + System instruction or prompt for the agent + """ + + messages: typing.Optional[typing.List[TrueFoundryAgentUserMessage]] = pydantic.Field(default=None) + """ + Pre-defined initial messages for the agent. Supports template variable replacement. + """ + + variables: typing.Optional[typing.Dict[str, TrueFoundryAgentVariable]] = pydantic.Field(default=None) + """ + Variables keyed by name. Each has optional default_value and optional description. + """ + + response_format: typing.Optional[TrueFoundryAgentManifestResponseFormat] = pydantic.Field(default=None) + """ + JSON schema or structure for the agent response format + """ + + sandbox: typing.Optional[TrueFoundryAgentManifestSandbox] = pydantic.Field(default=None) + """ + Sandbox execution settings + """ + + iteration_limit: typing.Optional[int] = pydantic.Field(default=None) + """ + Maximum number of iterations for the agent + """ + + collaborators: typing.List[Collaborator] = pydantic.Field() + """ + List of users who have access to this Agent + """ + + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/true_foundry_agent_manifest_model_params.py b/src/truefoundry_sdk/types/true_foundry_agent_manifest_model_params.py new file mode 100644 index 00000000..8655b888 --- /dev/null +++ b/src/truefoundry_sdk/types/true_foundry_agent_manifest_model_params.py @@ -0,0 +1,43 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .true_foundry_agent_manifest_model_params_reasoning_effort import ( + TrueFoundryAgentManifestModelParamsReasoningEffort, +) + + +class TrueFoundryAgentManifestModelParams(UniversalBaseModel): + """ + Model parameters (default and extra). Keys are param names, values are float, int, bool, or string. + """ + + max_tokens: typing.Optional[int] = pydantic.Field(default=None) + """ + Maximum number of tokens to generate. + """ + + reasoning_effort: typing.Optional[TrueFoundryAgentManifestModelParamsReasoningEffort] = pydantic.Field(default=None) + """ + Reasoning depth when the model and provider support this parameter. + """ + + temperature: typing.Optional[float] = pydantic.Field(default=None) + """ + Sampling temperature (0–2). Higher values increase randomness. + """ + + top_p: typing.Optional[float] = pydantic.Field(default=None) + """ + Nucleus sampling threshold (0–1). Alternative to temperature. + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/true_foundry_agent_manifest_model_params_reasoning_effort.py b/src/truefoundry_sdk/types/true_foundry_agent_manifest_model_params_reasoning_effort.py new file mode 100644 index 00000000..f291f296 --- /dev/null +++ b/src/truefoundry_sdk/types/true_foundry_agent_manifest_model_params_reasoning_effort.py @@ -0,0 +1,50 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +from ..core import enum + +T_Result = typing.TypeVar("T_Result") + + +class TrueFoundryAgentManifestModelParamsReasoningEffort(enum.StrEnum): + """ + Reasoning depth when the model and provider support this parameter. + """ + + NONE = "none" + MINIMAL = "minimal" + LOW = "low" + MEDIUM = "medium" + HIGH = "high" + _UNKNOWN = "__TRUEFOUNDRYAGENTMANIFESTMODELPARAMSREASONINGEFFORT_UNKNOWN__" + """ + This member is used for forward compatibility. If the value is not recognized by the enum, it will be stored here, and the raw value is accessible through `.value`. + """ + + @classmethod + def _missing_(cls, value: typing.Any) -> "TrueFoundryAgentManifestModelParamsReasoningEffort": + unknown = cls._UNKNOWN + unknown._value_ = value + return unknown + + def visit( + self, + none: typing.Callable[[], T_Result], + minimal: typing.Callable[[], T_Result], + low: typing.Callable[[], T_Result], + medium: typing.Callable[[], T_Result], + high: typing.Callable[[], T_Result], + _unknown_member: typing.Callable[[str], T_Result], + ) -> T_Result: + if self is TrueFoundryAgentManifestModelParamsReasoningEffort.NONE: + return none() + if self is TrueFoundryAgentManifestModelParamsReasoningEffort.MINIMAL: + return minimal() + if self is TrueFoundryAgentManifestModelParamsReasoningEffort.LOW: + return low() + if self is TrueFoundryAgentManifestModelParamsReasoningEffort.MEDIUM: + return medium() + if self is TrueFoundryAgentManifestModelParamsReasoningEffort.HIGH: + return high() + return _unknown_member(self._value_) diff --git a/src/truefoundry_sdk/types/true_foundry_agent_manifest_response_format.py b/src/truefoundry_sdk/types/true_foundry_agent_manifest_response_format.py new file mode 100644 index 00000000..7051e044 --- /dev/null +++ b/src/truefoundry_sdk/types/true_foundry_agent_manifest_response_format.py @@ -0,0 +1,11 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +from .response_format_json_object import ResponseFormatJsonObject +from .response_format_json_schema import ResponseFormatJsonSchema +from .response_format_text import ResponseFormatText + +TrueFoundryAgentManifestResponseFormat = typing.Union[ + ResponseFormatText, ResponseFormatJsonSchema, ResponseFormatJsonObject +] diff --git a/src/truefoundry_sdk/types/true_foundry_agent_manifest_sandbox.py b/src/truefoundry_sdk/types/true_foundry_agent_manifest_sandbox.py new file mode 100644 index 00000000..d2bfef38 --- /dev/null +++ b/src/truefoundry_sdk/types/true_foundry_agent_manifest_sandbox.py @@ -0,0 +1,22 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class TrueFoundryAgentManifestSandbox(UniversalBaseModel): + """ + Sandbox execution settings + """ + + enabled: bool + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/true_foundry_agent_mcp_server.py b/src/truefoundry_sdk/types/true_foundry_agent_mcp_server.py new file mode 100644 index 00000000..809fd645 --- /dev/null +++ b/src/truefoundry_sdk/types/true_foundry_agent_mcp_server.py @@ -0,0 +1,32 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .true_foundry_agent_mcp_tool import TrueFoundryAgentMcpTool + + +class TrueFoundryAgentMcpServer(UniversalBaseModel): + name: str = pydantic.Field() + """ + MCP server name + """ + + deferred: typing.Optional[bool] = pydantic.Field(default=False) + """ + When true, tools from this server are loaded lazily (deferred loading). + """ + + tools: typing.Optional[typing.List[TrueFoundryAgentMcpTool]] = pydantic.Field(default=None) + """ + List of tools to enable from this server + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/true_foundry_agent_mcp_tool.py b/src/truefoundry_sdk/types/true_foundry_agent_mcp_tool.py new file mode 100644 index 00000000..d46efa3c --- /dev/null +++ b/src/truefoundry_sdk/types/true_foundry_agent_mcp_tool.py @@ -0,0 +1,18 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class TrueFoundryAgentMcpTool(UniversalBaseModel): + name: str + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/true_foundry_agent_skill.py b/src/truefoundry_sdk/types/true_foundry_agent_skill.py new file mode 100644 index 00000000..74d6bed3 --- /dev/null +++ b/src/truefoundry_sdk/types/true_foundry_agent_skill.py @@ -0,0 +1,26 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class TrueFoundryAgentSkill(UniversalBaseModel): + fqn: str = pydantic.Field() + """ + Fully qualified name of the agent skill + """ + + eager: typing.Optional[bool] = pydantic.Field(default=False) + """ + When true, the skill's markdown content is loaded into the agent context before the first turn + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/true_foundry_agent_user_message.py b/src/truefoundry_sdk/types/true_foundry_agent_user_message.py new file mode 100644 index 00000000..f97a130d --- /dev/null +++ b/src/truefoundry_sdk/types/true_foundry_agent_user_message.py @@ -0,0 +1,26 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class TrueFoundryAgentUserMessage(UniversalBaseModel): + role: typing.Literal["user"] = pydantic.Field(default="user") + """ + Role of the message sender. + """ + + content: str = pydantic.Field() + """ + Content of the user message. Supports template variables like {{variable_name}}. + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/true_foundry_agent_variable.py b/src/truefoundry_sdk/types/true_foundry_agent_variable.py new file mode 100644 index 00000000..454bf3fe --- /dev/null +++ b/src/truefoundry_sdk/types/true_foundry_agent_variable.py @@ -0,0 +1,26 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class TrueFoundryAgentVariable(UniversalBaseModel): + default_value: typing.Optional[str] = pydantic.Field(default=None) + """ + Default value for the variable + """ + + description: typing.Optional[str] = pydantic.Field(default=None) + """ + Description of the variable + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/true_foundry_apply_request_manifest.py b/src/truefoundry_sdk/types/true_foundry_apply_request_manifest.py index a4463808..60d6ba7d 100644 --- a/src/truefoundry_sdk/types/true_foundry_apply_request_manifest.py +++ b/src/truefoundry_sdk/types/true_foundry_apply_request_manifest.py @@ -23,6 +23,7 @@ from .policy_manifest import PolicyManifest from .provider_accounts import ProviderAccounts from .r_studio import RStudio +from .role_binding_manifest import RoleBindingManifest from .role_manifest import RoleManifest from .secret_group_manifest import SecretGroupManifest from .service import Service @@ -68,4 +69,5 @@ EnvironmentManifest, TracingProjectManifest, McpServerManifest, + RoleBindingManifest, ] diff --git a/src/truefoundry_sdk/types/true_foundry_apply_response.py b/src/truefoundry_sdk/types/true_foundry_apply_response.py index 9b553de8..715cce78 100644 --- a/src/truefoundry_sdk/types/true_foundry_apply_response.py +++ b/src/truefoundry_sdk/types/true_foundry_apply_response.py @@ -12,12 +12,10 @@ class TrueFoundryApplyResponse(UniversalBaseModel): existing_manifest: typing_extensions.Annotated[ - typing.Optional[TrueFoundryApplyResponseExistingManifest], FieldMetadata(alias="existingManifest") - ] = pydantic.Field(alias="existingManifest", default=None) - """ - The existing manifest of the resource - """ - + typing.Optional[TrueFoundryApplyResponseExistingManifest], + FieldMetadata(alias="existingManifest"), + pydantic.Field(alias="existingManifest", description="The existing manifest of the resource"), + ] = None action: typing.Optional[TrueFoundryApplyResponseAction] = pydantic.Field(default=None) """ The action performed: CREATE or UPDATE diff --git a/src/truefoundry_sdk/types/true_foundry_apply_response_existing_manifest.py b/src/truefoundry_sdk/types/true_foundry_apply_response_existing_manifest.py index 8074d876..a5643db2 100644 --- a/src/truefoundry_sdk/types/true_foundry_apply_response_existing_manifest.py +++ b/src/truefoundry_sdk/types/true_foundry_apply_response_existing_manifest.py @@ -23,6 +23,7 @@ from .policy_manifest import PolicyManifest from .provider_accounts import ProviderAccounts from .r_studio import RStudio +from .role_binding_manifest import RoleBindingManifest from .role_manifest import RoleManifest from .secret_group_manifest import SecretGroupManifest from .service import Service @@ -68,4 +69,5 @@ EnvironmentManifest, TracingProjectManifest, McpServerManifest, + RoleBindingManifest, ] diff --git a/src/truefoundry_sdk/types/true_foundry_delete_request_manifest.py b/src/truefoundry_sdk/types/true_foundry_delete_request_manifest.py index 58af7fbc..c81282a6 100644 --- a/src/truefoundry_sdk/types/true_foundry_delete_request_manifest.py +++ b/src/truefoundry_sdk/types/true_foundry_delete_request_manifest.py @@ -23,6 +23,7 @@ from .policy_manifest import PolicyManifest from .provider_accounts import ProviderAccounts from .r_studio import RStudio +from .role_binding_manifest import RoleBindingManifest from .role_manifest import RoleManifest from .secret_group_manifest import SecretGroupManifest from .service import Service @@ -68,4 +69,5 @@ EnvironmentManifest, TracingProjectManifest, McpServerManifest, + RoleBindingManifest, ] diff --git a/src/truefoundry_sdk/types/true_foundry_provider_account.py b/src/truefoundry_sdk/types/true_foundry_provider_account.py index 609677d8..2a58759b 100644 --- a/src/truefoundry_sdk/types/true_foundry_provider_account.py +++ b/src/truefoundry_sdk/types/true_foundry_provider_account.py @@ -30,9 +30,9 @@ class TrueFoundryProviderAccount(UniversalBaseModel): List of integrations that are associated with the provider account. """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/ttl_provider_account.py b/src/truefoundry_sdk/types/ttl_provider_account.py index 23eb6fdf..ce41cb6b 100644 --- a/src/truefoundry_sdk/types/ttl_provider_account.py +++ b/src/truefoundry_sdk/types/ttl_provider_account.py @@ -30,9 +30,9 @@ class TtlProviderAccount(UniversalBaseModel): List of integrations that are associated with the provider account. """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/upgrade_data.py b/src/truefoundry_sdk/types/upgrade_data.py index 0a7a1f8a..9819736a 100644 --- a/src/truefoundry_sdk/types/upgrade_data.py +++ b/src/truefoundry_sdk/types/upgrade_data.py @@ -13,21 +13,21 @@ class UpgradeData(UniversalBaseModel): diff: typing.Optional[typing.List["IChange"]] = None - current_manifest: typing_extensions.Annotated[typing.Optional[Helm], FieldMetadata(alias="currentManifest")] = ( - pydantic.Field(alias="currentManifest", default=None) - ) - desired_manifest: typing_extensions.Annotated[typing.Optional[Helm], FieldMetadata(alias="desiredManifest")] = ( - pydantic.Field(alias="desiredManifest", default=None) - ) - upgrade_possible: typing_extensions.Annotated[typing.Optional[bool], FieldMetadata(alias="upgradePossible")] = ( - pydantic.Field(alias="upgradePossible", default=None) - ) + current_manifest: typing_extensions.Annotated[ + typing.Optional[Helm], FieldMetadata(alias="currentManifest"), pydantic.Field(alias="currentManifest") + ] = None + desired_manifest: typing_extensions.Annotated[ + typing.Optional[Helm], FieldMetadata(alias="desiredManifest"), pydantic.Field(alias="desiredManifest") + ] = None + upgrade_possible: typing_extensions.Annotated[ + typing.Optional[bool], FieldMetadata(alias="upgradePossible"), pydantic.Field(alias="upgradePossible") + ] = None conflict_fields: typing_extensions.Annotated[ - typing.Optional[typing.List[str]], FieldMetadata(alias="conflictFields") - ] = pydantic.Field(alias="conflictFields", default=None) - has_conflict: typing_extensions.Annotated[typing.Optional[bool], FieldMetadata(alias="hasConflict")] = ( - pydantic.Field(alias="hasConflict", default=None) - ) + typing.Optional[typing.List[str]], FieldMetadata(alias="conflictFields"), pydantic.Field(alias="conflictFields") + ] = None + has_conflict: typing_extensions.Annotated[ + typing.Optional[bool], FieldMetadata(alias="hasConflict"), pydantic.Field(alias="hasConflict") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/usage_code_snippet.py b/src/truefoundry_sdk/types/usage_code_snippet.py index 33f697f6..0464e6ab 100644 --- a/src/truefoundry_sdk/types/usage_code_snippet.py +++ b/src/truefoundry_sdk/types/usage_code_snippet.py @@ -7,14 +7,25 @@ class UsageCodeSnippet(UniversalBaseModel): - display_name: str - language: str + display_name: str = pydantic.Field() + """ + Display name for the code snippet (e.g., 'Python', 'JavaScript') + """ + + language: str = pydantic.Field() + """ + Programming language of the code snippet (e.g., 'python', 'javascript') + """ + libraries: typing.Optional[typing.List[str]] = pydantic.Field(default=None) """ - Libraries used in the code snippet + List of libraries/frameworks used in the code snippet """ - code: str + code: str = pydantic.Field() + """ + Code snippet demonstrating how to use the prompt version + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/user.py b/src/truefoundry_sdk/types/user.py index 42283a15..586b396a 100644 --- a/src/truefoundry_sdk/types/user.py +++ b/src/truefoundry_sdk/types/user.py @@ -15,25 +15,25 @@ class User(UniversalBaseModel): id: str email: str - tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName")] = pydantic.Field( - alias="tenantName" - ) + tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName"), pydantic.Field(alias="tenantName")] metadata: UserMetadata roles: typing.Optional[typing.List[str]] = None roles_with_resource: typing_extensions.Annotated[ - typing.Optional[typing.List[RoleWithResource]], FieldMetadata(alias="rolesWithResource") - ] = pydantic.Field(alias="rolesWithResource", default=None) + typing.Optional[typing.List[RoleWithResource]], + FieldMetadata(alias="rolesWithResource"), + pydantic.Field(alias="rolesWithResource"), + ] = None accounts: typing.Optional[typing.List[AccountInfo]] = None active: bool - is_editable: typing_extensions.Annotated[bool, FieldMetadata(alias="isEditable")] = pydantic.Field( - alias="isEditable" - ) - created_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="createdAt")] = pydantic.Field( - alias="createdAt" - ) - updated_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="updatedAt")] = pydantic.Field( - alias="updatedAt" - ) + is_editable: typing_extensions.Annotated[ + bool, FieldMetadata(alias="isEditable"), pydantic.Field(alias="isEditable") + ] + created_at: typing_extensions.Annotated[ + dt.datetime, FieldMetadata(alias="createdAt"), pydantic.Field(alias="createdAt") + ] + updated_at: typing_extensions.Annotated[ + dt.datetime, FieldMetadata(alias="updatedAt"), pydantic.Field(alias="updatedAt") + ] if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/user_metadata.py b/src/truefoundry_sdk/types/user_metadata.py index 6981bb38..d6f65df1 100644 --- a/src/truefoundry_sdk/types/user_metadata.py +++ b/src/truefoundry_sdk/types/user_metadata.py @@ -11,41 +11,47 @@ class UserMetadata(UniversalBaseModel): sub: typing.Optional[str] = None - image_url: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="imageURL")] = pydantic.Field( - alias="imageURL", default=None - ) + image_url: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="imageURL"), pydantic.Field(alias="imageURL") + ] = None picture_download_path: typing_extensions.Annotated[ - typing.Optional[str], FieldMetadata(alias="pictureDownloadPath") - ] = pydantic.Field(alias="pictureDownloadPath", default=None) - display_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="displayName")] = ( - pydantic.Field(alias="displayName", default=None) - ) + typing.Optional[str], FieldMetadata(alias="pictureDownloadPath"), pydantic.Field(alias="pictureDownloadPath") + ] = None + display_name: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="displayName"), pydantic.Field(alias="displayName") + ] = None user_object: typing_extensions.Annotated[ - typing.Optional[typing.Dict[str, typing.Any]], FieldMetadata(alias="userObject") - ] = pydantic.Field(alias="userObject", default=None) - invite_accepted: typing_extensions.Annotated[typing.Optional[bool], FieldMetadata(alias="inviteAccepted")] = ( - pydantic.Field(alias="inviteAccepted", default=None) - ) - registered_in_idp: typing_extensions.Annotated[typing.Optional[bool], FieldMetadata(alias="registeredInIdp")] = ( - pydantic.Field(alias="registeredInIdp", default=None) - ) + typing.Optional[typing.Dict[str, typing.Any]], + FieldMetadata(alias="userObject"), + pydantic.Field(alias="userObject"), + ] = None + invite_accepted: typing_extensions.Annotated[ + typing.Optional[bool], FieldMetadata(alias="inviteAccepted"), pydantic.Field(alias="inviteAccepted") + ] = None + registered_in_idp: typing_extensions.Annotated[ + typing.Optional[bool], FieldMetadata(alias="registeredInIdp"), pydantic.Field(alias="registeredInIdp") + ] = None preference: typing.Optional[typing.Dict[str, typing.Any]] = None groups: typing.Optional[typing.List[str]] = None tenant_role_managed_by: typing_extensions.Annotated[ - typing.Optional[UserMetadataTenantRoleManagedBy], FieldMetadata(alias="tenantRoleManagedBy") - ] = pydantic.Field(alias="tenantRoleManagedBy", default=None) - sso_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="ssoName")] = pydantic.Field( - alias="ssoName", default=None - ) - is_primary_sso: typing_extensions.Annotated[typing.Optional[bool], FieldMetadata(alias="isPrimarySSO")] = ( - pydantic.Field(alias="isPrimarySSO", default=None) - ) + typing.Optional[UserMetadataTenantRoleManagedBy], + FieldMetadata(alias="tenantRoleManagedBy"), + pydantic.Field(alias="tenantRoleManagedBy"), + ] = None + sso_name: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="ssoName"), pydantic.Field(alias="ssoName") + ] = None + is_primary_sso: typing_extensions.Annotated[ + typing.Optional[bool], FieldMetadata(alias="isPrimarySSO"), pydantic.Field(alias="isPrimarySSO") + ] = None scim_user_object: typing_extensions.Annotated[ - typing.Optional[typing.Dict[str, typing.Any]], FieldMetadata(alias="scimUserObject") - ] = pydantic.Field(alias="scimUserObject", default=None) - created_by_scim: typing_extensions.Annotated[typing.Optional[bool], FieldMetadata(alias="createdByScim")] = ( - pydantic.Field(alias="createdByScim", default=None) - ) + typing.Optional[typing.Dict[str, typing.Any]], + FieldMetadata(alias="scimUserObject"), + pydantic.Field(alias="scimUserObject"), + ] = None + created_by_scim: typing_extensions.Annotated[ + typing.Optional[bool], FieldMetadata(alias="createdByScim"), pydantic.Field(alias="createdByScim") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/user_resource.py b/src/truefoundry_sdk/types/user_resource.py index b801485f..d597ab5e 100644 --- a/src/truefoundry_sdk/types/user_resource.py +++ b/src/truefoundry_sdk/types/user_resource.py @@ -9,31 +9,20 @@ class UserResource(UniversalBaseModel): - resource_type: typing_extensions.Annotated[str, FieldMetadata(alias="resourceType")] = pydantic.Field( - alias="resourceType" - ) - """ - Resource Type - """ - - resource_id: typing_extensions.Annotated[str, FieldMetadata(alias="resourceId")] = pydantic.Field( - alias="resourceId" - ) - """ - Resource ID - """ - - role_id: typing_extensions.Annotated[str, FieldMetadata(alias="roleId")] = pydantic.Field(alias="roleId") - """ - Role ID - """ - - resource_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="resourceName")] = ( - pydantic.Field(alias="resourceName", default=None) - ) - """ - Resource Name (if available) - """ + resource_type: typing_extensions.Annotated[ + str, FieldMetadata(alias="resourceType"), pydantic.Field(alias="resourceType", description="Resource Type") + ] + resource_id: typing_extensions.Annotated[ + str, FieldMetadata(alias="resourceId"), pydantic.Field(alias="resourceId", description="Resource ID") + ] + role_id: typing_extensions.Annotated[ + str, FieldMetadata(alias="roleId"), pydantic.Field(alias="roleId", description="Role ID") + ] + resource_name: typing_extensions.Annotated[ + typing.Optional[str], + FieldMetadata(alias="resourceName"), + pydantic.Field(alias="resourceName", description="Resource Name (if available)"), + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/user_team_info.py b/src/truefoundry_sdk/types/user_team_info.py new file mode 100644 index 00000000..00dccddc --- /dev/null +++ b/src/truefoundry_sdk/types/user_team_info.py @@ -0,0 +1,26 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +import typing_extensions +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from ..core.serialization import FieldMetadata + + +class UserTeamInfo(UniversalBaseModel): + team_name: typing_extensions.Annotated[ + str, FieldMetadata(alias="teamName"), pydantic.Field(alias="teamName", description="Name of the team") + ] + roles: typing.List[str] = pydantic.Field() + """ + Roles of the user in the team + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 + else: + + class Config: + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/truefoundry_sdk/types/virtual_account.py b/src/truefoundry_sdk/types/virtual_account.py index 8305f642..fc527a82 100644 --- a/src/truefoundry_sdk/types/virtual_account.py +++ b/src/truefoundry_sdk/types/virtual_account.py @@ -16,40 +16,42 @@ class VirtualAccount(UniversalBaseModel): id: str type: str - tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName")] = pydantic.Field( - alias="tenantName" - ) + tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName"), pydantic.Field(alias="tenantName")] manifest: typing.Optional[VirtualAccountManifest] = None - jwt_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="jwtId")] = pydantic.Field( - alias="jwtId", default=None - ) - created_by_subject: typing_extensions.Annotated[Subject, FieldMetadata(alias="createdBySubject")] = pydantic.Field( - alias="createdBySubject" - ) - created_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="createdAt")] = pydantic.Field( - alias="createdAt" - ) - updated_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="updatedAt")] = pydantic.Field( - alias="updatedAt" - ) - is_expired: typing_extensions.Annotated[typing.Optional[bool], FieldMetadata(alias="isExpired")] = pydantic.Field( - alias="isExpired", default=None - ) + jwt_id: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="jwtId"), pydantic.Field(alias="jwtId") + ] = None + created_by_subject: typing_extensions.Annotated[ + Subject, FieldMetadata(alias="createdBySubject"), pydantic.Field(alias="createdBySubject") + ] + created_at: typing_extensions.Annotated[ + dt.datetime, FieldMetadata(alias="createdAt"), pydantic.Field(alias="createdAt") + ] + updated_at: typing_extensions.Annotated[ + dt.datetime, FieldMetadata(alias="updatedAt"), pydantic.Field(alias="updatedAt") + ] + is_expired: typing_extensions.Annotated[ + typing.Optional[bool], FieldMetadata(alias="isExpired"), pydantic.Field(alias="isExpired") + ] = None jwts: typing.Optional[typing.List[Jwt]] = None - account_id: typing_extensions.Annotated[str, FieldMetadata(alias="accountId")] = pydantic.Field(alias="accountId") + account_id: typing_extensions.Annotated[str, FieldMetadata(alias="accountId"), pydantic.Field(alias="accountId")] metadata: typing.Optional[typing.Dict[str, typing.Any]] = None - role_ids: typing_extensions.Annotated[typing.Optional[typing.List[str]], FieldMetadata(alias="roleIds")] = ( - pydantic.Field(alias="roleIds", default=None) - ) + role_ids: typing_extensions.Annotated[ + typing.Optional[typing.List[str]], FieldMetadata(alias="roleIds"), pydantic.Field(alias="roleIds") + ] = None roles_with_resource: typing_extensions.Annotated[ - typing.Optional[typing.List[RoleWithResource]], FieldMetadata(alias="rolesWithResource") - ] = pydantic.Field(alias="rolesWithResource", default=None) - created_by: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="createdBy")] = pydantic.Field( - alias="createdBy", default=None - ) + typing.Optional[typing.List[RoleWithResource]], + FieldMetadata(alias="rolesWithResource"), + pydantic.Field(alias="rolesWithResource"), + ] = None + created_by: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="createdBy"), pydantic.Field(alias="createdBy") + ] = None next_scheduled_rotation: typing_extensions.Annotated[ - typing.Optional[str], FieldMetadata(alias="nextScheduledRotation") - ] = pydantic.Field(alias="nextScheduledRotation", default=None) + typing.Optional[str], + FieldMetadata(alias="nextScheduledRotation"), + pydantic.Field(alias="nextScheduledRotation"), + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/virtual_account_manifest.py b/src/truefoundry_sdk/types/virtual_account_manifest.py index 3e9ec523..f09e7368 100644 --- a/src/truefoundry_sdk/types/virtual_account_manifest.py +++ b/src/truefoundry_sdk/types/virtual_account_manifest.py @@ -37,9 +37,13 @@ class VirtualAccountManifest(UniversalBaseModel): auto_rotate: typing.Optional[AutoRotate] = None notification_target: typing.Optional[NotificationTarget] = None secret_store_config: typing.Optional[SecretStoreConfig] = None - owned_by: typing_extensions.Annotated[typing.Optional[VirtualAccountOwnedBy], FieldMetadata(alias="ownedBy")] = ( - pydantic.Field(alias="ownedBy", default=None) - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[VirtualAccountOwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None + tags: typing.Optional[typing.Dict[str, typing.Any]] = pydantic.Field(default=None) + """ + Key-value pairs to categorize this Virtual Account (e.g., by owner or environment). + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/virtual_mcp_server_manifest.py b/src/truefoundry_sdk/types/virtual_mcp_server_manifest.py index 96932cef..a0c2c3e8 100644 --- a/src/truefoundry_sdk/types/virtual_mcp_server_manifest.py +++ b/src/truefoundry_sdk/types/virtual_mcp_server_manifest.py @@ -41,9 +41,9 @@ class VirtualMcpServerManifest(UniversalBaseModel): Users and Teams that have access to this Virtual MCP Server """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None tags: typing.Optional[typing.Dict[str, typing.Any]] = pydantic.Field(default=None) """ Key-value pairs to categorize this Virtual MCP Server (e.g., by owner or environment). diff --git a/src/truefoundry_sdk/types/virtual_model_provider_account.py b/src/truefoundry_sdk/types/virtual_model_provider_account.py index a34824c2..0fb457a5 100644 --- a/src/truefoundry_sdk/types/virtual_model_provider_account.py +++ b/src/truefoundry_sdk/types/virtual_model_provider_account.py @@ -36,9 +36,9 @@ class VirtualModelProviderAccount(UniversalBaseModel): List of users who have access to this Virtual Model Provider Group """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/webhook_provider_account.py b/src/truefoundry_sdk/types/webhook_provider_account.py index 206972b1..a8eeca87 100644 --- a/src/truefoundry_sdk/types/webhook_provider_account.py +++ b/src/truefoundry_sdk/types/webhook_provider_account.py @@ -30,9 +30,9 @@ class WebhookProviderAccount(UniversalBaseModel): List of integrations that are associated with the provider account. """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/weight_based_load_balancing.py b/src/truefoundry_sdk/types/weight_based_load_balancing.py index 114edc9f..69313ea0 100644 --- a/src/truefoundry_sdk/types/weight_based_load_balancing.py +++ b/src/truefoundry_sdk/types/weight_based_load_balancing.py @@ -5,6 +5,7 @@ import pydantic from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel from .load_balance_target import LoadBalanceTarget +from .sticky_routing import StickyRouting class WeightBasedLoadBalancing(UniversalBaseModel): @@ -18,6 +19,8 @@ class WeightBasedLoadBalancing(UniversalBaseModel): List of targets for load balancing with weights """ + sticky_routing: typing.Optional[StickyRouting] = None + if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 else: diff --git a/src/truefoundry_sdk/types/workspace.py b/src/truefoundry_sdk/types/workspace.py index 0f95e604..9b7f7127 100644 --- a/src/truefoundry_sdk/types/workspace.py +++ b/src/truefoundry_sdk/types/workspace.py @@ -14,30 +14,28 @@ class Workspace(UniversalBaseModel): id: str fqn: str - tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName")] = pydantic.Field( - alias="tenantName" - ) - cluster_id: typing_extensions.Annotated[str, FieldMetadata(alias="clusterId")] = pydantic.Field(alias="clusterId") - created_by_subject: typing_extensions.Annotated[Subject, FieldMetadata(alias="createdBySubject")] = pydantic.Field( - alias="createdBySubject" - ) - created_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="createdAt")] = pydantic.Field( - alias="createdAt" - ) - updated_at: typing_extensions.Annotated[dt.datetime, FieldMetadata(alias="updatedAt")] = pydantic.Field( - alias="updatedAt" - ) - environment_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="environmentId")] = ( - pydantic.Field(alias="environmentId", default=None) - ) + tenant_name: typing_extensions.Annotated[str, FieldMetadata(alias="tenantName"), pydantic.Field(alias="tenantName")] + cluster_id: typing_extensions.Annotated[str, FieldMetadata(alias="clusterId"), pydantic.Field(alias="clusterId")] + created_by_subject: typing_extensions.Annotated[ + Subject, FieldMetadata(alias="createdBySubject"), pydantic.Field(alias="createdBySubject") + ] + created_at: typing_extensions.Annotated[ + dt.datetime, FieldMetadata(alias="createdAt"), pydantic.Field(alias="createdAt") + ] + updated_at: typing_extensions.Annotated[ + dt.datetime, FieldMetadata(alias="updatedAt"), pydantic.Field(alias="updatedAt") + ] + environment_id: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="environmentId"), pydantic.Field(alias="environmentId") + ] = None manifest: WorkspaceManifest - account_id: typing_extensions.Annotated[str, FieldMetadata(alias="accountId")] = pydantic.Field(alias="accountId") - is_system_ws: typing_extensions.Annotated[typing.Optional[bool], FieldMetadata(alias="isSystemWs")] = ( - pydantic.Field(alias="isSystemWs", default=None) - ) - created_by: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="createdBy")] = pydantic.Field( - alias="createdBy", default=None - ) + account_id: typing_extensions.Annotated[str, FieldMetadata(alias="accountId"), pydantic.Field(alias="accountId")] + is_system_ws: typing_extensions.Annotated[ + typing.Optional[bool], FieldMetadata(alias="isSystemWs"), pydantic.Field(alias="isSystemWs") + ] = None + created_by: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="createdBy"), pydantic.Field(alias="createdBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/workspace_manifest.py b/src/truefoundry_sdk/types/workspace_manifest.py index c113410e..48360ce4 100644 --- a/src/truefoundry_sdk/types/workspace_manifest.py +++ b/src/truefoundry_sdk/types/workspace_manifest.py @@ -52,9 +52,9 @@ class WorkspaceManifest(UniversalBaseModel): Permissions """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/types/xai_provider_account.py b/src/truefoundry_sdk/types/xai_provider_account.py index e067ef27..771c80d3 100644 --- a/src/truefoundry_sdk/types/xai_provider_account.py +++ b/src/truefoundry_sdk/types/xai_provider_account.py @@ -38,9 +38,9 @@ class XaiProviderAccount(UniversalBaseModel): List of users who have access to this provider account """ - owned_by: typing_extensions.Annotated[typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy")] = pydantic.Field( - alias="ownedBy", default=None - ) + owned_by: typing_extensions.Annotated[ + typing.Optional[OwnedBy], FieldMetadata(alias="ownedBy"), pydantic.Field(alias="ownedBy") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow") # type: ignore # Pydantic v2 diff --git a/src/truefoundry_sdk/users/client.py b/src/truefoundry_sdk/users/client.py index 6c50a90a..308386f9 100644 --- a/src/truefoundry_sdk/users/client.py +++ b/src/truefoundry_sdk/users/client.py @@ -9,6 +9,7 @@ from ..types.change_password_response import ChangePasswordResponse from ..types.deactivate_user_response import DeactivateUserResponse from ..types.delete_user_response import DeleteUserResponse +from ..types.get_user_permissions_response import GetUserPermissionsResponse from ..types.get_user_resources_response import GetUserResourcesResponse from ..types.get_user_response import GetUserResponse from ..types.get_user_teams_response import GetUserTeamsResponse @@ -239,7 +240,13 @@ def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = Non _response = self._raw_client.get(id, request_options=request_options) return _response.data - def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> DeleteUserResponse: + def delete( + self, + id: str, + *, + tenant_name: typing.Optional[str] = None, + request_options: typing.Optional[RequestOptions] = None, + ) -> DeleteUserResponse: """ Delete user if they are not a collaborator in any resource and not part of any team other than everyone. @@ -248,6 +255,9 @@ def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] = id : str User Id + tenant_name : typing.Optional[str] + Tenant name + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -266,9 +276,10 @@ def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] = ) client.users.delete( id="id", + tenant_name="tenantName", ) """ - _response = self._raw_client.delete(id, request_options=request_options) + _response = self._raw_client.delete(id, tenant_name=tenant_name, request_options=request_options) return _response.data def invite_user( @@ -312,7 +323,11 @@ def invite_user( return _response.data def deactivate( - self, *, email: str, request_options: typing.Optional[RequestOptions] = None + self, + *, + email: str, + tenant_name: typing.Optional[str] = OMIT, + request_options: typing.Optional[RequestOptions] = None, ) -> DeactivateUserResponse: """ Deactivate user associated with the provided email within the tenant. @@ -322,6 +337,9 @@ def deactivate( email : str Email of the user + tenant_name : typing.Optional[str] + Tenant name + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -342,10 +360,16 @@ def deactivate( email="email", ) """ - _response = self._raw_client.deactivate(email=email, request_options=request_options) + _response = self._raw_client.deactivate(email=email, tenant_name=tenant_name, request_options=request_options) return _response.data - def activate(self, *, email: str, request_options: typing.Optional[RequestOptions] = None) -> ActivateUserResponse: + def activate( + self, + *, + email: str, + tenant_name: typing.Optional[str] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> ActivateUserResponse: """ Activate user associated with the provided email within the tenant. @@ -354,6 +378,9 @@ def activate(self, *, email: str, request_options: typing.Optional[RequestOption email : str Email of the user + tenant_name : typing.Optional[str] + Tenant name + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -374,7 +401,7 @@ def activate(self, *, email: str, request_options: typing.Optional[RequestOption email="email", ) """ - _response = self._raw_client.activate(email=email, request_options=request_options) + _response = self._raw_client.activate(email=email, tenant_name=tenant_name, request_options=request_options) return _response.data def change_password( @@ -460,9 +487,43 @@ def get_resources( _response = self._raw_client.get_resources(id, request_options=request_options) return _response.data + def get_permissions( + self, id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> GetUserPermissionsResponse: + """ + Get all role bindings associated with a user, including team-inherited bindings. + + Parameters + ---------- + id : str + User Id + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + GetUserPermissionsResponse + Returns role bindings for the user (including team-inherited). + + Examples + -------- + from truefoundry_sdk import TrueFoundry + + client = TrueFoundry( + api_key="YOUR_API_KEY", + base_url="https://yourhost.com/path/to/api", + ) + client.users.get_permissions( + id="id", + ) + """ + _response = self._raw_client.get_permissions(id, request_options=request_options) + return _response.data + def get_teams(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> GetUserTeamsResponse: """ - Get all manual teams associated with a user. + Get all teams associated with a user, including their role in each team. Parameters ---------- @@ -475,7 +536,7 @@ def get_teams(self, id: str, *, request_options: typing.Optional[RequestOptions] Returns ------- GetUserTeamsResponse - Returns all manual teams for the user. + Returns all teams for the user with their roles. Examples -------- @@ -742,7 +803,13 @@ async def main() -> None: _response = await self._raw_client.get(id, request_options=request_options) return _response.data - async def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> DeleteUserResponse: + async def delete( + self, + id: str, + *, + tenant_name: typing.Optional[str] = None, + request_options: typing.Optional[RequestOptions] = None, + ) -> DeleteUserResponse: """ Delete user if they are not a collaborator in any resource and not part of any team other than everyone. @@ -751,6 +818,9 @@ async def delete(self, id: str, *, request_options: typing.Optional[RequestOptio id : str User Id + tenant_name : typing.Optional[str] + Tenant name + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -774,12 +844,13 @@ async def delete(self, id: str, *, request_options: typing.Optional[RequestOptio async def main() -> None: await client.users.delete( id="id", + tenant_name="tenantName", ) asyncio.run(main()) """ - _response = await self._raw_client.delete(id, request_options=request_options) + _response = await self._raw_client.delete(id, tenant_name=tenant_name, request_options=request_options) return _response.data async def invite_user( @@ -831,7 +902,11 @@ async def main() -> None: return _response.data async def deactivate( - self, *, email: str, request_options: typing.Optional[RequestOptions] = None + self, + *, + email: str, + tenant_name: typing.Optional[str] = OMIT, + request_options: typing.Optional[RequestOptions] = None, ) -> DeactivateUserResponse: """ Deactivate user associated with the provided email within the tenant. @@ -841,6 +916,9 @@ async def deactivate( email : str Email of the user + tenant_name : typing.Optional[str] + Tenant name + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -869,11 +947,17 @@ async def main() -> None: asyncio.run(main()) """ - _response = await self._raw_client.deactivate(email=email, request_options=request_options) + _response = await self._raw_client.deactivate( + email=email, tenant_name=tenant_name, request_options=request_options + ) return _response.data async def activate( - self, *, email: str, request_options: typing.Optional[RequestOptions] = None + self, + *, + email: str, + tenant_name: typing.Optional[str] = OMIT, + request_options: typing.Optional[RequestOptions] = None, ) -> ActivateUserResponse: """ Activate user associated with the provided email within the tenant. @@ -883,6 +967,9 @@ async def activate( email : str Email of the user + tenant_name : typing.Optional[str] + Tenant name + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -911,7 +998,9 @@ async def main() -> None: asyncio.run(main()) """ - _response = await self._raw_client.activate(email=email, request_options=request_options) + _response = await self._raw_client.activate( + email=email, tenant_name=tenant_name, request_options=request_options + ) return _response.data async def change_password( @@ -1013,11 +1102,53 @@ async def main() -> None: _response = await self._raw_client.get_resources(id, request_options=request_options) return _response.data + async def get_permissions( + self, id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> GetUserPermissionsResponse: + """ + Get all role bindings associated with a user, including team-inherited bindings. + + Parameters + ---------- + id : str + User Id + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + GetUserPermissionsResponse + Returns role bindings for the user (including team-inherited). + + Examples + -------- + import asyncio + + from truefoundry_sdk import AsyncTrueFoundry + + client = AsyncTrueFoundry( + api_key="YOUR_API_KEY", + base_url="https://yourhost.com/path/to/api", + ) + + + async def main() -> None: + await client.users.get_permissions( + id="id", + ) + + + asyncio.run(main()) + """ + _response = await self._raw_client.get_permissions(id, request_options=request_options) + return _response.data + async def get_teams( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> GetUserTeamsResponse: """ - Get all manual teams associated with a user. + Get all teams associated with a user, including their role in each team. Parameters ---------- @@ -1030,7 +1161,7 @@ async def get_teams( Returns ------- GetUserTeamsResponse - Returns all manual teams for the user. + Returns all teams for the user with their roles. Examples -------- diff --git a/src/truefoundry_sdk/users/raw_client.py b/src/truefoundry_sdk/users/raw_client.py index 4d4a94d3..05212206 100644 --- a/src/truefoundry_sdk/users/raw_client.py +++ b/src/truefoundry_sdk/users/raw_client.py @@ -20,6 +20,7 @@ from ..types.change_password_response import ChangePasswordResponse from ..types.deactivate_user_response import DeactivateUserResponse from ..types.delete_user_response import DeleteUserResponse +from ..types.get_user_permissions_response import GetUserPermissionsResponse from ..types.get_user_resources_response import GetUserResourcesResponse from ..types.get_user_response import GetUserResponse from ..types.get_user_teams_response import GetUserTeamsResponse @@ -351,7 +352,11 @@ def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = Non raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) def delete( - self, id: str, *, request_options: typing.Optional[RequestOptions] = None + self, + id: str, + *, + tenant_name: typing.Optional[str] = None, + request_options: typing.Optional[RequestOptions] = None, ) -> HttpResponse[DeleteUserResponse]: """ Delete user if they are not a collaborator in any resource and not part of any team other than everyone. @@ -361,6 +366,9 @@ def delete( id : str User Id + tenant_name : typing.Optional[str] + Tenant name + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -372,6 +380,9 @@ def delete( _response = self._client_wrapper.httpx_client.request( f"api/svc/v1/users/{jsonable_encoder(id)}", method="DELETE", + params={ + "tenantName": tenant_name, + }, request_options=request_options, ) try: @@ -506,7 +517,11 @@ def invite_user( raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) def deactivate( - self, *, email: str, request_options: typing.Optional[RequestOptions] = None + self, + *, + email: str, + tenant_name: typing.Optional[str] = OMIT, + request_options: typing.Optional[RequestOptions] = None, ) -> HttpResponse[DeactivateUserResponse]: """ Deactivate user associated with the provided email within the tenant. @@ -516,6 +531,9 @@ def deactivate( email : str Email of the user + tenant_name : typing.Optional[str] + Tenant name + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -529,6 +547,7 @@ def deactivate( method="PATCH", json={ "email": email, + "tenantName": tenant_name, }, headers={ "content-type": "application/json", @@ -574,7 +593,11 @@ def deactivate( raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) def activate( - self, *, email: str, request_options: typing.Optional[RequestOptions] = None + self, + *, + email: str, + tenant_name: typing.Optional[str] = OMIT, + request_options: typing.Optional[RequestOptions] = None, ) -> HttpResponse[ActivateUserResponse]: """ Activate user associated with the provided email within the tenant. @@ -584,6 +607,9 @@ def activate( email : str Email of the user + tenant_name : typing.Optional[str] + Tenant name + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -597,6 +623,7 @@ def activate( method="PATCH", json={ "email": email, + "tenantName": tenant_name, }, headers={ "content-type": "application/json", @@ -761,11 +788,72 @@ def get_resources( raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + def get_permissions( + self, id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> HttpResponse[GetUserPermissionsResponse]: + """ + Get all role bindings associated with a user, including team-inherited bindings. + + Parameters + ---------- + id : str + User Id + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + HttpResponse[GetUserPermissionsResponse] + Returns role bindings for the user (including team-inherited). + """ + _response = self._client_wrapper.httpx_client.request( + f"api/svc/v1/users/{jsonable_encoder(id)}/permissions", + method="GET", + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + GetUserPermissionsResponse, + parse_obj_as( + type_=GetUserPermissionsResponse, # type: ignore + object_=_response.json(), + ), + ) + return HttpResponse(response=_response, data=_data) + if _response.status_code == 403: + raise ForbiddenError( + headers=dict(_response.headers), + body=typing.cast( + HttpError, + parse_obj_as( + type_=HttpError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + def get_teams( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> HttpResponse[GetUserTeamsResponse]: """ - Get all manual teams associated with a user. + Get all teams associated with a user, including their role in each team. Parameters ---------- @@ -778,7 +866,7 @@ def get_teams( Returns ------- HttpResponse[GetUserTeamsResponse] - Returns all manual teams for the user. + Returns all teams for the user with their roles. """ _response = self._client_wrapper.httpx_client.request( f"api/svc/v1/users/{jsonable_encoder(id)}/teams", @@ -1145,7 +1233,11 @@ async def get( raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) async def delete( - self, id: str, *, request_options: typing.Optional[RequestOptions] = None + self, + id: str, + *, + tenant_name: typing.Optional[str] = None, + request_options: typing.Optional[RequestOptions] = None, ) -> AsyncHttpResponse[DeleteUserResponse]: """ Delete user if they are not a collaborator in any resource and not part of any team other than everyone. @@ -1155,6 +1247,9 @@ async def delete( id : str User Id + tenant_name : typing.Optional[str] + Tenant name + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -1166,6 +1261,9 @@ async def delete( _response = await self._client_wrapper.httpx_client.request( f"api/svc/v1/users/{jsonable_encoder(id)}", method="DELETE", + params={ + "tenantName": tenant_name, + }, request_options=request_options, ) try: @@ -1300,7 +1398,11 @@ async def invite_user( raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) async def deactivate( - self, *, email: str, request_options: typing.Optional[RequestOptions] = None + self, + *, + email: str, + tenant_name: typing.Optional[str] = OMIT, + request_options: typing.Optional[RequestOptions] = None, ) -> AsyncHttpResponse[DeactivateUserResponse]: """ Deactivate user associated with the provided email within the tenant. @@ -1310,6 +1412,9 @@ async def deactivate( email : str Email of the user + tenant_name : typing.Optional[str] + Tenant name + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -1323,6 +1428,7 @@ async def deactivate( method="PATCH", json={ "email": email, + "tenantName": tenant_name, }, headers={ "content-type": "application/json", @@ -1368,7 +1474,11 @@ async def deactivate( raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) async def activate( - self, *, email: str, request_options: typing.Optional[RequestOptions] = None + self, + *, + email: str, + tenant_name: typing.Optional[str] = OMIT, + request_options: typing.Optional[RequestOptions] = None, ) -> AsyncHttpResponse[ActivateUserResponse]: """ Activate user associated with the provided email within the tenant. @@ -1378,6 +1488,9 @@ async def activate( email : str Email of the user + tenant_name : typing.Optional[str] + Tenant name + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -1391,6 +1504,7 @@ async def activate( method="PATCH", json={ "email": email, + "tenantName": tenant_name, }, headers={ "content-type": "application/json", @@ -1555,11 +1669,72 @@ async def get_resources( raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + async def get_permissions( + self, id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> AsyncHttpResponse[GetUserPermissionsResponse]: + """ + Get all role bindings associated with a user, including team-inherited bindings. + + Parameters + ---------- + id : str + User Id + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AsyncHttpResponse[GetUserPermissionsResponse] + Returns role bindings for the user (including team-inherited). + """ + _response = await self._client_wrapper.httpx_client.request( + f"api/svc/v1/users/{jsonable_encoder(id)}/permissions", + method="GET", + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + GetUserPermissionsResponse, + parse_obj_as( + type_=GetUserPermissionsResponse, # type: ignore + object_=_response.json(), + ), + ) + return AsyncHttpResponse(response=_response, data=_data) + if _response.status_code == 403: + raise ForbiddenError( + headers=dict(_response.headers), + body=typing.cast( + HttpError, + parse_obj_as( + type_=HttpError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + async def get_teams( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> AsyncHttpResponse[GetUserTeamsResponse]: """ - Get all manual teams associated with a user. + Get all teams associated with a user, including their role in each team. Parameters ---------- @@ -1572,7 +1747,7 @@ async def get_teams( Returns ------- AsyncHttpResponse[GetUserTeamsResponse] - Returns all manual teams for the user. + Returns all teams for the user with their roles. """ _response = await self._client_wrapper.httpx_client.request( f"api/svc/v1/users/{jsonable_encoder(id)}/teams", diff --git a/src/truefoundry_sdk/virtual_accounts/client.py b/src/truefoundry_sdk/virtual_accounts/client.py index 93cf7b24..d15cbb59 100644 --- a/src/truefoundry_sdk/virtual_accounts/client.py +++ b/src/truefoundry_sdk/virtual_accounts/client.py @@ -39,6 +39,9 @@ def list( limit: typing.Optional[int] = 100, offset: typing.Optional[int] = 0, name_search_query: typing.Optional[str] = None, + owned_by_teams: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, + is_expired: typing.Optional[bool] = None, + filter: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None, ) -> SyncPager[VirtualAccount, ListVirtualAccountResponse]: """ @@ -55,6 +58,15 @@ def list( name_search_query : typing.Optional[str] Return virtual accounts with names that contain this string + owned_by_teams : typing.Optional[typing.Union[str, typing.Sequence[str]]] + Return virtual accounts owned by these teams + + is_expired : typing.Optional[bool] + Filter virtual accounts by expiration status. true = expired, false = not expired + + filter : typing.Optional[str] + JSON string: structured filter tree (AND/OR groups, column leaves on `name`, json_map leaves on manifest.tags). + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -75,6 +87,8 @@ def list( limit=10, offset=0, name_search_query="nameSearchQuery", + is_expired=True, + filter="filter", ) for item in response: yield item @@ -83,7 +97,13 @@ def list( yield page """ return self._raw_client.list( - limit=limit, offset=offset, name_search_query=name_search_query, request_options=request_options + limit=limit, + offset=offset, + name_search_query=name_search_query, + owned_by_teams=owned_by_teams, + is_expired=is_expired, + filter=filter, + request_options=request_options, ) def create_or_update( @@ -369,6 +389,9 @@ async def list( limit: typing.Optional[int] = 100, offset: typing.Optional[int] = 0, name_search_query: typing.Optional[str] = None, + owned_by_teams: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, + is_expired: typing.Optional[bool] = None, + filter: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None, ) -> AsyncPager[VirtualAccount, ListVirtualAccountResponse]: """ @@ -385,6 +408,15 @@ async def list( name_search_query : typing.Optional[str] Return virtual accounts with names that contain this string + owned_by_teams : typing.Optional[typing.Union[str, typing.Sequence[str]]] + Return virtual accounts owned by these teams + + is_expired : typing.Optional[bool] + Filter virtual accounts by expiration status. true = expired, false = not expired + + filter : typing.Optional[str] + JSON string: structured filter tree (AND/OR groups, column leaves on `name`, json_map leaves on manifest.tags). + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -410,6 +442,8 @@ async def main() -> None: limit=10, offset=0, name_search_query="nameSearchQuery", + is_expired=True, + filter="filter", ) async for item in response: yield item @@ -422,7 +456,13 @@ async def main() -> None: asyncio.run(main()) """ return await self._raw_client.list( - limit=limit, offset=offset, name_search_query=name_search_query, request_options=request_options + limit=limit, + offset=offset, + name_search_query=name_search_query, + owned_by_teams=owned_by_teams, + is_expired=is_expired, + filter=filter, + request_options=request_options, ) async def create_or_update( diff --git a/src/truefoundry_sdk/virtual_accounts/raw_client.py b/src/truefoundry_sdk/virtual_accounts/raw_client.py index 0e509576..659adf86 100644 --- a/src/truefoundry_sdk/virtual_accounts/raw_client.py +++ b/src/truefoundry_sdk/virtual_accounts/raw_client.py @@ -36,6 +36,9 @@ def list( limit: typing.Optional[int] = 100, offset: typing.Optional[int] = 0, name_search_query: typing.Optional[str] = None, + owned_by_teams: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, + is_expired: typing.Optional[bool] = None, + filter: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None, ) -> SyncPager[VirtualAccount, ListVirtualAccountResponse]: """ @@ -52,6 +55,15 @@ def list( name_search_query : typing.Optional[str] Return virtual accounts with names that contain this string + owned_by_teams : typing.Optional[typing.Union[str, typing.Sequence[str]]] + Return virtual accounts owned by these teams + + is_expired : typing.Optional[bool] + Filter virtual accounts by expiration status. true = expired, false = not expired + + filter : typing.Optional[str] + JSON string: structured filter tree (AND/OR groups, column leaves on `name`, json_map leaves on manifest.tags). + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -69,6 +81,9 @@ def list( "limit": limit, "offset": offset, "nameSearchQuery": name_search_query, + "ownedByTeams": owned_by_teams, + "isExpired": is_expired, + "filter": filter, }, request_options=request_options, ) @@ -87,6 +102,9 @@ def list( limit=limit, offset=offset + len(_items or []), name_search_query=name_search_query, + owned_by_teams=owned_by_teams, + is_expired=is_expired, + filter=filter, request_options=request_options, ) return SyncPager(has_next=_has_next, items=_items, get_next=_get_next, response=_parsed_response) @@ -467,6 +485,9 @@ async def list( limit: typing.Optional[int] = 100, offset: typing.Optional[int] = 0, name_search_query: typing.Optional[str] = None, + owned_by_teams: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, + is_expired: typing.Optional[bool] = None, + filter: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None, ) -> AsyncPager[VirtualAccount, ListVirtualAccountResponse]: """ @@ -483,6 +504,15 @@ async def list( name_search_query : typing.Optional[str] Return virtual accounts with names that contain this string + owned_by_teams : typing.Optional[typing.Union[str, typing.Sequence[str]]] + Return virtual accounts owned by these teams + + is_expired : typing.Optional[bool] + Filter virtual accounts by expiration status. true = expired, false = not expired + + filter : typing.Optional[str] + JSON string: structured filter tree (AND/OR groups, column leaves on `name`, json_map leaves on manifest.tags). + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -500,6 +530,9 @@ async def list( "limit": limit, "offset": offset, "nameSearchQuery": name_search_query, + "ownedByTeams": owned_by_teams, + "isExpired": is_expired, + "filter": filter, }, request_options=request_options, ) @@ -520,6 +553,9 @@ async def _get_next(): limit=limit, offset=offset + len(_items or []), name_search_query=name_search_query, + owned_by_teams=owned_by_teams, + is_expired=is_expired, + filter=filter, request_options=request_options, ) diff --git a/src/truefoundry_sdk/workspaces/client.py b/src/truefoundry_sdk/workspaces/client.py index 64ef2604..c8e232dd 100644 --- a/src/truefoundry_sdk/workspaces/client.py +++ b/src/truefoundry_sdk/workspaces/client.py @@ -39,10 +39,11 @@ def list( cluster_id: typing.Optional[str] = None, name: typing.Optional[str] = None, fqn: typing.Optional[str] = None, + include_cluster: typing.Optional[bool] = None, request_options: typing.Optional[RequestOptions] = None, ) -> SyncPager[Workspace, ListWorkspacesResponse]: """ - List workspaces associated with the user. Optional filters include clusterId, fqn, and workspace name. Pagination is available based on query parameters. + List workspaces associated with the user. Optional filters include clusterId, fqn, and workspace name. Parameters ---------- @@ -61,6 +62,9 @@ def list( fqn : typing.Optional[str] Workspace FQN + include_cluster : typing.Optional[bool] + When true, each workspace includes cluster information + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -83,6 +87,7 @@ def list( cluster_id="clusterId", name="name", fqn="fqn", + include_cluster=True, ) for item in response: yield item @@ -91,7 +96,13 @@ def list( yield page """ return self._raw_client.list( - limit=limit, offset=offset, cluster_id=cluster_id, name=name, fqn=fqn, request_options=request_options + limit=limit, + offset=offset, + cluster_id=cluster_id, + name=name, + fqn=fqn, + include_cluster=include_cluster, + request_options=request_options, ) def create_or_update( @@ -142,6 +153,64 @@ def create_or_update( ) return _response.data + def search( + self, + *, + limit: typing.Optional[int] = 100, + offset: typing.Optional[int] = 0, + filter: typing.Optional[str] = None, + include_cluster: typing.Optional[bool] = None, + request_options: typing.Optional[RequestOptions] = None, + ) -> SyncPager[Workspace, ListWorkspacesResponse]: + """ + List workspaces the user can read with optional structured `filter` (name, id, environmentId, cluster_fqn) and pagination. + + Parameters + ---------- + limit : typing.Optional[int] + Number of items per page + + offset : typing.Optional[int] + Number of items to skip + + filter : typing.Optional[str] + JSON string containing array of search filters with string, type and operator + + include_cluster : typing.Optional[bool] + When true, each workspace includes cluster information + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + SyncPager[Workspace, ListWorkspacesResponse] + Paginated workspaces matching the filter. + + Examples + -------- + from truefoundry_sdk import TrueFoundry + + client = TrueFoundry( + api_key="YOUR_API_KEY", + base_url="https://yourhost.com/path/to/api", + ) + response = client.workspaces.search( + limit=10, + offset=0, + filter="filter", + include_cluster=True, + ) + for item in response: + yield item + # alternatively, you can paginate page-by-page + for page in response.iter_pages(): + yield page + """ + return self._raw_client.search( + limit=limit, offset=offset, filter=filter, include_cluster=include_cluster, request_options=request_options + ) + def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> GetWorkspaceResponse: """ Get workspace associated with provided workspace id @@ -232,10 +301,11 @@ async def list( cluster_id: typing.Optional[str] = None, name: typing.Optional[str] = None, fqn: typing.Optional[str] = None, + include_cluster: typing.Optional[bool] = None, request_options: typing.Optional[RequestOptions] = None, ) -> AsyncPager[Workspace, ListWorkspacesResponse]: """ - List workspaces associated with the user. Optional filters include clusterId, fqn, and workspace name. Pagination is available based on query parameters. + List workspaces associated with the user. Optional filters include clusterId, fqn, and workspace name. Parameters ---------- @@ -254,6 +324,9 @@ async def list( fqn : typing.Optional[str] Workspace FQN + include_cluster : typing.Optional[bool] + When true, each workspace includes cluster information + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -281,6 +354,7 @@ async def main() -> None: cluster_id="clusterId", name="name", fqn="fqn", + include_cluster=True, ) async for item in response: yield item @@ -293,7 +367,13 @@ async def main() -> None: asyncio.run(main()) """ return await self._raw_client.list( - limit=limit, offset=offset, cluster_id=cluster_id, name=name, fqn=fqn, request_options=request_options + limit=limit, + offset=offset, + cluster_id=cluster_id, + name=name, + fqn=fqn, + include_cluster=include_cluster, + request_options=request_options, ) async def create_or_update( @@ -352,6 +432,73 @@ async def main() -> None: ) return _response.data + async def search( + self, + *, + limit: typing.Optional[int] = 100, + offset: typing.Optional[int] = 0, + filter: typing.Optional[str] = None, + include_cluster: typing.Optional[bool] = None, + request_options: typing.Optional[RequestOptions] = None, + ) -> AsyncPager[Workspace, ListWorkspacesResponse]: + """ + List workspaces the user can read with optional structured `filter` (name, id, environmentId, cluster_fqn) and pagination. + + Parameters + ---------- + limit : typing.Optional[int] + Number of items per page + + offset : typing.Optional[int] + Number of items to skip + + filter : typing.Optional[str] + JSON string containing array of search filters with string, type and operator + + include_cluster : typing.Optional[bool] + When true, each workspace includes cluster information + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AsyncPager[Workspace, ListWorkspacesResponse] + Paginated workspaces matching the filter. + + Examples + -------- + import asyncio + + from truefoundry_sdk import AsyncTrueFoundry + + client = AsyncTrueFoundry( + api_key="YOUR_API_KEY", + base_url="https://yourhost.com/path/to/api", + ) + + + async def main() -> None: + response = await client.workspaces.search( + limit=10, + offset=0, + filter="filter", + include_cluster=True, + ) + async for item in response: + yield item + + # alternatively, you can paginate page-by-page + async for page in response.iter_pages(): + yield page + + + asyncio.run(main()) + """ + return await self._raw_client.search( + limit=limit, offset=offset, filter=filter, include_cluster=include_cluster, request_options=request_options + ) + async def get(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> GetWorkspaceResponse: """ Get workspace associated with provided workspace id diff --git a/src/truefoundry_sdk/workspaces/raw_client.py b/src/truefoundry_sdk/workspaces/raw_client.py index cbcdf8ac..56b37d86 100644 --- a/src/truefoundry_sdk/workspaces/raw_client.py +++ b/src/truefoundry_sdk/workspaces/raw_client.py @@ -39,10 +39,11 @@ def list( cluster_id: typing.Optional[str] = None, name: typing.Optional[str] = None, fqn: typing.Optional[str] = None, + include_cluster: typing.Optional[bool] = None, request_options: typing.Optional[RequestOptions] = None, ) -> SyncPager[Workspace, ListWorkspacesResponse]: """ - List workspaces associated with the user. Optional filters include clusterId, fqn, and workspace name. Pagination is available based on query parameters. + List workspaces associated with the user. Optional filters include clusterId, fqn, and workspace name. Parameters ---------- @@ -61,6 +62,9 @@ def list( fqn : typing.Optional[str] Workspace FQN + include_cluster : typing.Optional[bool] + When true, each workspace includes cluster information + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -80,6 +84,7 @@ def list( "clusterId": cluster_id, "name": name, "fqn": fqn, + "includeCluster": include_cluster, }, request_options=request_options, ) @@ -100,6 +105,7 @@ def list( cluster_id=cluster_id, name=name, fqn=fqn, + include_cluster=include_cluster, request_options=request_options, ) return SyncPager(has_next=_has_next, items=_items, get_next=_get_next, response=_parsed_response) @@ -210,6 +216,77 @@ def create_or_update( raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + def search( + self, + *, + limit: typing.Optional[int] = 100, + offset: typing.Optional[int] = 0, + filter: typing.Optional[str] = None, + include_cluster: typing.Optional[bool] = None, + request_options: typing.Optional[RequestOptions] = None, + ) -> SyncPager[Workspace, ListWorkspacesResponse]: + """ + List workspaces the user can read with optional structured `filter` (name, id, environmentId, cluster_fqn) and pagination. + + Parameters + ---------- + limit : typing.Optional[int] + Number of items per page + + offset : typing.Optional[int] + Number of items to skip + + filter : typing.Optional[str] + JSON string containing array of search filters with string, type and operator + + include_cluster : typing.Optional[bool] + When true, each workspace includes cluster information + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + SyncPager[Workspace, ListWorkspacesResponse] + Paginated workspaces matching the filter. + """ + offset = offset if offset is not None else 0 + + _response = self._client_wrapper.httpx_client.request( + "api/svc/v1/workspaces/search", + method="GET", + params={ + "limit": limit, + "offset": offset, + "filter": filter, + "includeCluster": include_cluster, + }, + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _parsed_response = typing.cast( + ListWorkspacesResponse, + parse_obj_as( + type_=ListWorkspacesResponse, # type: ignore + object_=_response.json(), + ), + ) + _items = _parsed_response.data + _has_next = True + _get_next = lambda: self.search( + limit=limit, + offset=offset + len(_items or []), + filter=filter, + include_cluster=include_cluster, + request_options=request_options, + ) + return SyncPager(has_next=_has_next, items=_items, get_next=_get_next, response=_parsed_response) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + def get( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> HttpResponse[GetWorkspaceResponse]: @@ -336,10 +413,11 @@ async def list( cluster_id: typing.Optional[str] = None, name: typing.Optional[str] = None, fqn: typing.Optional[str] = None, + include_cluster: typing.Optional[bool] = None, request_options: typing.Optional[RequestOptions] = None, ) -> AsyncPager[Workspace, ListWorkspacesResponse]: """ - List workspaces associated with the user. Optional filters include clusterId, fqn, and workspace name. Pagination is available based on query parameters. + List workspaces associated with the user. Optional filters include clusterId, fqn, and workspace name. Parameters ---------- @@ -358,6 +436,9 @@ async def list( fqn : typing.Optional[str] Workspace FQN + include_cluster : typing.Optional[bool] + When true, each workspace includes cluster information + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -377,6 +458,7 @@ async def list( "clusterId": cluster_id, "name": name, "fqn": fqn, + "includeCluster": include_cluster, }, request_options=request_options, ) @@ -399,6 +481,7 @@ async def _get_next(): cluster_id=cluster_id, name=name, fqn=fqn, + include_cluster=include_cluster, request_options=request_options, ) @@ -510,6 +593,80 @@ async def create_or_update( raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + async def search( + self, + *, + limit: typing.Optional[int] = 100, + offset: typing.Optional[int] = 0, + filter: typing.Optional[str] = None, + include_cluster: typing.Optional[bool] = None, + request_options: typing.Optional[RequestOptions] = None, + ) -> AsyncPager[Workspace, ListWorkspacesResponse]: + """ + List workspaces the user can read with optional structured `filter` (name, id, environmentId, cluster_fqn) and pagination. + + Parameters + ---------- + limit : typing.Optional[int] + Number of items per page + + offset : typing.Optional[int] + Number of items to skip + + filter : typing.Optional[str] + JSON string containing array of search filters with string, type and operator + + include_cluster : typing.Optional[bool] + When true, each workspace includes cluster information + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AsyncPager[Workspace, ListWorkspacesResponse] + Paginated workspaces matching the filter. + """ + offset = offset if offset is not None else 0 + + _response = await self._client_wrapper.httpx_client.request( + "api/svc/v1/workspaces/search", + method="GET", + params={ + "limit": limit, + "offset": offset, + "filter": filter, + "includeCluster": include_cluster, + }, + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _parsed_response = typing.cast( + ListWorkspacesResponse, + parse_obj_as( + type_=ListWorkspacesResponse, # type: ignore + object_=_response.json(), + ), + ) + _items = _parsed_response.data + _has_next = True + + async def _get_next(): + return await self.search( + limit=limit, + offset=offset + len(_items or []), + filter=filter, + include_cluster=include_cluster, + request_options=request_options, + ) + + return AsyncPager(has_next=_has_next, items=_items, get_next=_get_next, response=_parsed_response) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + async def get( self, id: str, *, request_options: typing.Optional[RequestOptions] = None ) -> AsyncHttpResponse[GetWorkspaceResponse]: