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]: