From fb2d4793e99074aa0baa71b6d1ec5489597dd397 Mon Sep 17 00:00:00 2001 From: Charles Packer Date: Sun, 26 Jan 2025 16:50:55 -0800 Subject: [PATCH] fix: update letta-client used in unit tests (#787) --- poetry.lock | 52 ++++++++++++++-- tests/test_sdk_client.py | 130 +++++++++++++++++++-------------------- 2 files changed, 111 insertions(+), 71 deletions(-) diff --git a/poetry.lock b/poetry.lock index cff81af7..816cb2f7 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. [[package]] name = "aiohappyeyeballs" @@ -416,6 +416,10 @@ files = [ {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a37b8f0391212d29b3a91a799c8e4a2855e0576911cdfb2515487e30e322253d"}, {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e84799f09591700a4154154cab9787452925578841a94321d5ee8fb9a9a328f0"}, {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f66b5337fa213f1da0d9000bc8dc0cb5b896b726eefd9c6046f699b169c41b9e"}, + {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5dab0844f2cf82be357a0eb11a9087f70c5430b2c241493fc122bb6f2bb0917c"}, + {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e4fe605b917c70283db7dfe5ada75e04561479075761a0b3866c081d035b01c1"}, + {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:1e9a65b5736232e7a7f91ff3d02277f11d339bf34099a56cdab6a8b3410a02b2"}, + {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:58d4b711689366d4a03ac7957ab8c28890415e267f9b6589969e74b6e42225ec"}, {file = "Brotli-1.1.0-cp310-cp310-win32.whl", hash = "sha256:be36e3d172dc816333f33520154d708a2657ea63762ec16b62ece02ab5e4daf2"}, {file = "Brotli-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:0c6244521dda65ea562d5a69b9a26120769b7a9fb3db2fe9545935ed6735b128"}, {file = "Brotli-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a3daabb76a78f829cafc365531c972016e4aa8d5b4bf60660ad8ecee19df7ccc"}, @@ -428,8 +432,14 @@ files = [ {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:19c116e796420b0cee3da1ccec3b764ed2952ccfcc298b55a10e5610ad7885f9"}, {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:510b5b1bfbe20e1a7b3baf5fed9e9451873559a976c1a78eebaa3b86c57b4265"}, {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a1fd8a29719ccce974d523580987b7f8229aeace506952fa9ce1d53a033873c8"}, + {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c247dd99d39e0338a604f8c2b3bc7061d5c2e9e2ac7ba9cc1be5a69cb6cd832f"}, + {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1b2c248cd517c222d89e74669a4adfa5577e06ab68771a529060cf5a156e9757"}, + {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2a24c50840d89ded6c9a8fdc7b6ed3692ed4e86f1c4a4a938e1e92def92933e0"}, + {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f31859074d57b4639318523d6ffdca586ace54271a73ad23ad021acd807eb14b"}, {file = "Brotli-1.1.0-cp311-cp311-win32.whl", hash = "sha256:39da8adedf6942d76dc3e46653e52df937a3c4d6d18fdc94a7c29d263b1f5b50"}, {file = "Brotli-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:aac0411d20e345dc0920bdec5548e438e999ff68d77564d5e9463a7ca9d3e7b1"}, + {file = "Brotli-1.1.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:32d95b80260d79926f5fab3c41701dbb818fde1c9da590e77e571eefd14abe28"}, + {file = "Brotli-1.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b760c65308ff1e462f65d69c12e4ae085cff3b332d894637f6273a12a482d09f"}, {file = "Brotli-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:316cc9b17edf613ac76b1f1f305d2a748f1b976b033b049a6ecdfd5612c70409"}, {file = "Brotli-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:caf9ee9a5775f3111642d33b86237b05808dafcd6268faa492250e9b78046eb2"}, {file = "Brotli-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70051525001750221daa10907c77830bc889cb6d865cc0b813d9db7fefc21451"}, @@ -440,8 +450,24 @@ files = [ {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4093c631e96fdd49e0377a9c167bfd75b6d0bad2ace734c6eb20b348bc3ea180"}, {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e4c4629ddad63006efa0ef968c8e4751c5868ff0b1c5c40f76524e894c50248"}, {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:861bf317735688269936f755fa136a99d1ed526883859f86e41a5d43c61d8966"}, + {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:87a3044c3a35055527ac75e419dfa9f4f3667a1e887ee80360589eb8c90aabb9"}, + {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c5529b34c1c9d937168297f2c1fde7ebe9ebdd5e121297ff9c043bdb2ae3d6fb"}, + {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ca63e1890ede90b2e4454f9a65135a4d387a4585ff8282bb72964fab893f2111"}, + {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e79e6520141d792237c70bcd7a3b122d00f2613769ae0cb61c52e89fd3443839"}, {file = "Brotli-1.1.0-cp312-cp312-win32.whl", hash = "sha256:5f4d5ea15c9382135076d2fb28dde923352fe02951e66935a9efaac8f10e81b0"}, {file = "Brotli-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:906bc3a79de8c4ae5b86d3d75a8b77e44404b0f4261714306e3ad248d8ab0951"}, + {file = "Brotli-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8bf32b98b75c13ec7cf774164172683d6e7891088f6316e54425fde1efc276d5"}, + {file = "Brotli-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7bc37c4d6b87fb1017ea28c9508b36bbcb0c3d18b4260fcdf08b200c74a6aee8"}, + {file = "Brotli-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c0ef38c7a7014ffac184db9e04debe495d317cc9c6fb10071f7fefd93100a4f"}, + {file = "Brotli-1.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91d7cc2a76b5567591d12c01f019dd7afce6ba8cba6571187e21e2fc418ae648"}, + {file = "Brotli-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a93dde851926f4f2678e704fadeb39e16c35d8baebd5252c9fd94ce8ce68c4a0"}, + {file = "Brotli-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f0db75f47be8b8abc8d9e31bc7aad0547ca26f24a54e6fd10231d623f183d089"}, + {file = "Brotli-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6967ced6730aed543b8673008b5a391c3b1076d834ca438bbd70635c73775368"}, + {file = "Brotli-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7eedaa5d036d9336c95915035fb57422054014ebdeb6f3b42eac809928e40d0c"}, + {file = "Brotli-1.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d487f5432bf35b60ed625d7e1b448e2dc855422e87469e3f450aa5552b0eb284"}, + {file = "Brotli-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:832436e59afb93e1836081a20f324cb185836c617659b07b129141a8426973c7"}, + {file = "Brotli-1.1.0-cp313-cp313-win32.whl", hash = "sha256:43395e90523f9c23a3d5bdf004733246fba087f2948f87ab28015f12359ca6a0"}, + {file = "Brotli-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:9011560a466d2eb3f5a6e4929cf4a09be405c64154e12df0dd72713f6500e32b"}, {file = "Brotli-1.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a090ca607cbb6a34b0391776f0cb48062081f5f60ddcce5d11838e67a01928d1"}, {file = "Brotli-1.1.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de9d02f5bda03d27ede52e8cfe7b865b066fa49258cbab568720aa5be80a47d"}, {file = "Brotli-1.1.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2333e30a5e00fe0fe55903c8832e08ee9c3b1382aacf4db26664a16528d51b4b"}, @@ -451,6 +477,10 @@ files = [ {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:fd5f17ff8f14003595ab414e45fce13d073e0762394f957182e69035c9f3d7c2"}, {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:069a121ac97412d1fe506da790b3e69f52254b9df4eb665cd42460c837193354"}, {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e93dfc1a1165e385cc8239fab7c036fb2cd8093728cbd85097b284d7b99249a2"}, + {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:aea440a510e14e818e67bfc4027880e2fb500c2ccb20ab21c7a7c8b5b4703d75"}, + {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_2_i686.whl", hash = "sha256:6974f52a02321b36847cd19d1b8e381bf39939c21efd6ee2fc13a28b0d99348c"}, + {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_2_ppc64le.whl", hash = "sha256:a7e53012d2853a07a4a79c00643832161a910674a893d296c9f1259859a289d2"}, + {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:d7702622a8b40c49bffb46e1e3ba2e81268d5c04a34f460978c6b5517a34dd52"}, {file = "Brotli-1.1.0-cp36-cp36m-win32.whl", hash = "sha256:a599669fd7c47233438a56936988a2478685e74854088ef5293802123b5b2460"}, {file = "Brotli-1.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d143fd47fad1db3d7c27a1b1d66162e855b5d50a89666af46e1679c496e8e579"}, {file = "Brotli-1.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:11d00ed0a83fa22d29bc6b64ef636c4552ebafcef57154b4ddd132f5638fbd1c"}, @@ -462,6 +492,10 @@ files = [ {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:919e32f147ae93a09fe064d77d5ebf4e35502a8df75c29fb05788528e330fe74"}, {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:23032ae55523cc7bccb4f6a0bf368cd25ad9bcdcc1990b64a647e7bbcce9cb5b"}, {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:224e57f6eac61cc449f498cc5f0e1725ba2071a3d4f48d5d9dffba42db196438"}, + {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:cb1dac1770878ade83f2ccdf7d25e494f05c9165f5246b46a621cc849341dc01"}, + {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:3ee8a80d67a4334482d9712b8e83ca6b1d9bc7e351931252ebef5d8f7335a547"}, + {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:5e55da2c8724191e5b557f8e18943b1b4839b8efc3ef60d65985bcf6f587dd38"}, + {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:d342778ef319e1026af243ed0a07c97acf3bad33b9f29e7ae6a1f68fd083e90c"}, {file = "Brotli-1.1.0-cp37-cp37m-win32.whl", hash = "sha256:587ca6d3cef6e4e868102672d3bd9dc9698c309ba56d41c2b9c85bbb903cdb95"}, {file = "Brotli-1.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2954c1c23f81c2eaf0b0717d9380bd348578a94161a65b3a2afc62c86467dd68"}, {file = "Brotli-1.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:efa8b278894b14d6da122a72fefcebc28445f2d3f880ac59d46c90f4c13be9a3"}, @@ -474,6 +508,10 @@ files = [ {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ab4fbee0b2d9098c74f3057b2bc055a8bd92ccf02f65944a241b4349229185a"}, {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:141bd4d93984070e097521ed07e2575b46f817d08f9fa42b16b9b5f27b5ac088"}, {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fce1473f3ccc4187f75b4690cfc922628aed4d3dd013d047f95a9b3919a86596"}, + {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d2b35ca2c7f81d173d2fadc2f4f31e88cc5f7a39ae5b6db5513cf3383b0e0ec7"}, + {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:af6fa6817889314555aede9a919612b23739395ce767fe7fcbea9a80bf140fe5"}, + {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:2feb1d960f760a575dbc5ab3b1c00504b24caaf6986e2dc2b01c09c87866a943"}, + {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4410f84b33374409552ac9b6903507cdb31cd30d2501fc5ca13d18f73548444a"}, {file = "Brotli-1.1.0-cp38-cp38-win32.whl", hash = "sha256:db85ecf4e609a48f4b29055f1e144231b90edc90af7481aa731ba2d059226b1b"}, {file = "Brotli-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3d7954194c36e304e1523f55d7042c59dc53ec20dd4e9ea9d151f1b62b4415c0"}, {file = "Brotli-1.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5fb2ce4b8045c78ebbc7b8f3c15062e435d47e7393cc57c25115cfd49883747a"}, @@ -486,6 +524,10 @@ files = [ {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:949f3b7c29912693cee0afcf09acd6ebc04c57af949d9bf77d6101ebb61e388c"}, {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:89f4988c7203739d48c6f806f1e87a1d96e0806d44f0fba61dba81392c9e474d"}, {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:de6551e370ef19f8de1807d0a9aa2cdfdce2e85ce88b122fe9f6b2b076837e59"}, + {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0737ddb3068957cf1b054899b0883830bb1fec522ec76b1098f9b6e0f02d9419"}, + {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4f3607b129417e111e30637af1b56f24f7a49e64763253bbc275c75fa887d4b2"}, + {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:6c6e0c425f22c1c719c42670d561ad682f7bfeeef918edea971a79ac5252437f"}, + {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:494994f807ba0b92092a163a0a283961369a65f6cbe01e8891132b7a320e61eb"}, {file = "Brotli-1.1.0-cp39-cp39-win32.whl", hash = "sha256:f0d8a7a6b5983c2496e364b969f0e526647a06b075d034f3297dc66f3b360c64"}, {file = "Brotli-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:cdad5b9014d83ca68c25d2e9444e28e967ef16e80f6b436918c700c117a85467"}, {file = "Brotli-1.1.0.tar.gz", hash = "sha256:81de08ac11bcb85841e440c13611c00b67d3bf82698314928d0b676362546724"}, @@ -817,7 +859,6 @@ files = [ {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:761817a3377ef15ac23cd7834715081791d4ec77f9297ee694ca1ee9c2c7e5eb"}, {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3c672a53c0fb4725a29c303be906d3c1fa99c32f58abe008a82705f9ee96f40b"}, {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4ac4c9f37eba52cb6fbeaf5b59c152ea976726b865bd4cf87883a7e7006cc543"}, - {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:60eb32934076fa07e4316b7b2742fa52cbb190b42c2df2863dbc4230a0a9b385"}, {file = "cryptography-44.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ed3534eb1090483c96178fcb0f8893719d96d5274dfde98aa6add34614e97c8e"}, {file = "cryptography-44.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f3f6fdfa89ee2d9d496e2c087cebef9d4fcbb0ad63c40e821b39f74bf48d9c5e"}, {file = "cryptography-44.0.0-cp37-abi3-win32.whl", hash = "sha256:eb33480f1bad5b78233b0ad3e1b0be21e8ef1da745d8d2aecbb20671658b9053"}, @@ -828,7 +869,6 @@ files = [ {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c5eb858beed7835e5ad1faba59e865109f3e52b3783b9ac21e7e47dc5554e289"}, {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f53c2c87e0fb4b0c00fa9571082a057e37690a8f12233306161c8f4b819960b7"}, {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:9e6fc8a08e116fb7c7dd1f040074c9d7b51d74a8ea40d4df2fc7aa08b76b9e6c"}, - {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9abcc2e083cbe8dde89124a47e5e53ec38751f0d7dfd36801008f316a127d7ba"}, {file = "cryptography-44.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d2436114e46b36d00f8b72ff57e598978b37399d2786fd39793c36c6d5cb1c64"}, {file = "cryptography-44.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a01956ddfa0a6790d594f5b34fc1bfa6098aca434696a03cfdbe469b8ed79285"}, {file = "cryptography-44.0.0-cp39-abi3-win32.whl", hash = "sha256:eca27345e1214d1b9f9490d200f9db5a874479be914199194e746c893788d417"}, @@ -2494,13 +2534,13 @@ langsmith-pyo3 = ["langsmith-pyo3 (>=0.1.0rc2,<0.2.0)"] [[package]] name = "letta-client" -version = "0.1.16" +version = "0.1.22" description = "" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "letta_client-0.1.16-py3-none-any.whl", hash = "sha256:e7a03c80ae2840ef4342f3bf777f9281589fed3092d1f617a0e5a14f63166150"}, - {file = "letta_client-0.1.16.tar.gz", hash = "sha256:f837855bb8b5c2d9a8dfb0754cf0d396464f6c027ad9627f0ea8c721ab3c9ced"}, + {file = "letta_client-0.1.22-py3-none-any.whl", hash = "sha256:6a108ac6d4cb1c79870a1defffcb6eb1ea6eca6da071f0b730f044a96d482c01"}, + {file = "letta_client-0.1.22.tar.gz", hash = "sha256:75483fc41fb3baf1170b11c44c25b45d62c439b8b9a9720601446a9b83ee636e"}, ] [package.dependencies] diff --git a/tests/test_sdk_client.py b/tests/test_sdk_client.py index d612cf35..c38d1645 100644 --- a/tests/test_sdk_client.py +++ b/tests/test_sdk_client.py @@ -10,7 +10,7 @@ from letta_client import CreateBlock from letta_client import Letta as LettaSDKClient from letta_client import MessageCreate from letta_client.core import ApiError -from letta_client.types import LettaMessageUnion_ToolCallMessage, LettaMessageUnion_ToolReturnMessage, LettaRequestConfig +from letta_client.types import AgentState, LettaRequestConfig, ToolCallMessage, ToolReturnMessage # Constants SERVER_PORT = 8283 @@ -26,7 +26,7 @@ def run_server(): @pytest.fixture(scope="module") -def client(): +def client() -> LettaSDKClient: # Get URL from environment or start server server_url = os.getenv("LETTA_SERVER_URL", f"http://localhost:{SERVER_PORT}") if not os.getenv("LETTA_SERVER_URL"): @@ -40,7 +40,7 @@ def client(): @pytest.fixture(scope="module") -def agent(client): +def agent(client: LettaSDKClient): agent_state = client.agents.create( memory_blocks=[ CreateBlock( @@ -57,7 +57,7 @@ def agent(client): client.agents.delete(agent_id=agent_state.id) -def test_shared_blocks(client): +def test_shared_blocks(client: LettaSDKClient): # create a block block = client.blocks.create( label="human", @@ -91,7 +91,7 @@ def test_shared_blocks(client): ) # update memory - client.agents.messages.send( + client.agents.messages.create( agent_id=agent_state1.id, messages=[ MessageCreate( @@ -102,9 +102,11 @@ def test_shared_blocks(client): ) # check agent 2 memory - assert "charles" in client.blocks.get(block_id=block.id).value.lower(), f"Shared block update failed {client.get_block(block.id).value}" + assert ( + "charles" in client.blocks.retrieve(block_id=block.id).value.lower() + ), f"Shared block update failed {client.retrieve_block(block.id).value}" - client.agents.messages.send( + client.agents.messages.create( agent_id=agent_state2.id, messages=[ MessageCreate( @@ -114,15 +116,15 @@ def test_shared_blocks(client): ], ) assert ( - "charles" in client.agents.core_memory.get_block(agent_id=agent_state2.id, block_label="human").value.lower() - ), f"Shared block update failed {client.agents.core_memory.get_block(agent_id=agent_state2.id, block_label="human").value}" + "charles" in client.agents.core_memory.retrieve_block(agent_id=agent_state2.id, block_label="human").value.lower() + ), f"Shared block update failed {client.agents.core_memory.retrieve_block(agent_id=agent_state2.id, block_label="human").value}" # cleanup client.agents.delete(agent_state1.id) client.agents.delete(agent_state2.id) -def test_add_and_manage_tags_for_agent(client): +def test_add_and_manage_tags_for_agent(client: LettaSDKClient): """ Comprehensive happy path test for adding, retrieving, and managing tags on an agent. """ @@ -142,10 +144,10 @@ def test_add_and_manage_tags_for_agent(client): assert len(agent.tags) == 0 # Step 1: Add multiple tags to the agent - client.agents.update(agent_id=agent.id, tags=tags_to_add) + client.agents.modify(agent_id=agent.id, tags=tags_to_add) # Step 2: Retrieve tags for the agent and verify they match the added tags - retrieved_tags = client.agents.get(agent_id=agent.id).tags + retrieved_tags = client.agents.retrieve(agent_id=agent.id).tags assert set(retrieved_tags) == set(tags_to_add), f"Expected tags {tags_to_add}, but got {retrieved_tags}" # Step 3: Retrieve agents by each tag to ensure the agent is associated correctly @@ -155,25 +157,25 @@ def test_add_and_manage_tags_for_agent(client): # Step 4: Delete a specific tag from the agent and verify its removal tag_to_delete = tags_to_add.pop() - client.agents.update(agent_id=agent.id, tags=tags_to_add) + client.agents.modify(agent_id=agent.id, tags=tags_to_add) # Verify the tag is removed from the agent's tags - remaining_tags = client.agents.get(agent_id=agent.id).tags + remaining_tags = client.agents.retrieve(agent_id=agent.id).tags assert tag_to_delete not in remaining_tags, f"Tag '{tag_to_delete}' was not removed as expected" assert set(remaining_tags) == set(tags_to_add), f"Expected remaining tags to be {tags_to_add[1:]}, but got {remaining_tags}" # Step 5: Delete all remaining tags from the agent - client.agents.update(agent_id=agent.id, tags=[]) + client.agents.modify(agent_id=agent.id, tags=[]) # Verify all tags are removed - final_tags = client.agents.get(agent_id=agent.id).tags + final_tags = client.agents.retrieve(agent_id=agent.id).tags assert len(final_tags) == 0, f"Expected no tags, but found {final_tags}" # Remove agent client.agents.delete(agent.id) -def test_agent_tags(client): +def test_agent_tags(client: LettaSDKClient): """Test creating agents with tags and retrieving tags via the API.""" # Clear all agents all_agents = client.agents.list() @@ -229,7 +231,7 @@ def test_agent_tags(client): assert paginated_tags[1] == "agent2" # Test pagination with cursor - next_page_tags = client.tag.list_tags(cursor="agent2", limit=2) + next_page_tags = client.tag.list_tags(after="agent2", limit=2) assert len(next_page_tags) == 2 assert next_page_tags[0] == "agent3" assert next_page_tags[1] == "development" @@ -250,26 +252,26 @@ def test_agent_tags(client): client.agents.delete(agent3.id) -def test_update_agent_memory_label(client, agent): +def test_update_agent_memory_label(client: LettaSDKClient, agent: AgentState): """Test that we can update the label of a block in an agent's memory""" - current_labels = [block.label for block in client.agents.core_memory.get_blocks(agent_id=agent.id)] + current_labels = [block.label for block in client.agents.core_memory.list_blocks(agent_id=agent.id)] example_label = current_labels[0] example_new_label = "example_new_label" assert example_new_label not in current_labels - client.agents.core_memory.update_block( + client.agents.core_memory.modify_block( agent_id=agent.id, block_label=example_label, label=example_new_label, ) - updated_block = client.agents.core_memory.get_block(agent_id=agent.id, block_label=example_new_label) + updated_block = client.agents.core_memory.retrieve_block(agent_id=agent.id, block_label=example_new_label) assert updated_block.label == example_new_label -def test_add_remove_agent_memory_block(client, agent): +def test_add_remove_agent_memory_block(client: LettaSDKClient, agent: AgentState): """Test that we can add and remove a block from an agent's memory""" - current_labels = [block.label for block in client.agents.core_memory.get_blocks(agent_id=agent.id)] + current_labels = [block.label for block in client.agents.core_memory.list_blocks(agent_id=agent.id)] example_new_label = current_labels[0] + "_v2" example_new_value = "example value" assert example_new_label not in current_labels @@ -280,42 +282,42 @@ def test_add_remove_agent_memory_block(client, agent): value=example_new_value, limit=1000, ) - client.blocks.link_agent_memory_block( + client.agents.core_memory.attach_block( agent_id=agent.id, block_id=block.id, ) - updated_block = client.agents.core_memory.get_block( + updated_block = client.agents.core_memory.retrieve_block( agent_id=agent.id, block_label=example_new_label, ) assert updated_block.value == example_new_value # Now unlink the block - client.blocks.unlink_agent_memory_block( + client.agents.core_memory.detach_block( agent_id=agent.id, block_id=block.id, ) - current_labels = [block.label for block in client.agents.core_memory.get_blocks(agent_id=agent.id)] + current_labels = [block.label for block in client.agents.core_memory.list_blocks(agent_id=agent.id)] assert example_new_label not in current_labels -def test_update_agent_memory_limit(client, agent): +def test_update_agent_memory_limit(client: LettaSDKClient, agent: AgentState): """Test that we can update the limit of a block in an agent's memory""" - current_labels = [block.label for block in client.agents.core_memory.get_blocks(agent_id=agent.id)] + current_labels = [block.label for block in client.agents.core_memory.list_blocks(agent_id=agent.id)] example_label = current_labels[0] example_new_limit = 1 - current_block = client.agents.core_memory.get_block(agent_id=agent.id, block_label=example_label) + current_block = client.agents.core_memory.retrieve_block(agent_id=agent.id, block_label=example_label) current_block_length = len(current_block.value) - assert example_new_limit != client.agents.core_memory.get_block(agent_id=agent.id, block_label=example_label).limit + assert example_new_limit != client.agents.core_memory.retrieve_block(agent_id=agent.id, block_label=example_label).limit assert example_new_limit < current_block_length # We expect this to throw a value error with pytest.raises(ApiError): - client.agents.core_memory.update_block( + client.agents.core_memory.modify_block( agent_id=agent.id, block_label=example_label, limit=example_new_limit, @@ -324,17 +326,17 @@ def test_update_agent_memory_limit(client, agent): # Now try the same thing with a higher limit example_new_limit = current_block_length + 10000 assert example_new_limit > current_block_length - client.agents.core_memory.update_block( + client.agents.core_memory.modify_block( agent_id=agent.id, block_label=example_label, limit=example_new_limit, ) - assert example_new_limit == client.agents.core_memory.get_block(agent_id=agent.id, block_label=example_label).limit + assert example_new_limit == client.agents.core_memory.retrieve_block(agent_id=agent.id, block_label=example_label).limit -def test_messages(client, agent): - send_message_response = client.agents.messages.send( +def test_messages(client: LettaSDKClient, agent: AgentState): + send_message_response = client.agents.messages.create( agent_id=agent.id, messages=[ MessageCreate( @@ -352,9 +354,9 @@ def test_messages(client, agent): assert len(messages_response) > 0, "Retrieving messages failed" -def test_send_system_message(client, agent): +def test_send_system_message(client: LettaSDKClient, agent: AgentState): """Important unit test since the Letta API exposes sending system messages, but some backends don't natively support it (eg Anthropic)""" - send_system_message_response = client.agents.messages.send( + send_system_message_response = client.agents.messages.create( agent_id=agent.id, messages=[ MessageCreate( @@ -366,7 +368,7 @@ def test_send_system_message(client, agent): assert send_system_message_response, "Sending message failed" -def test_function_return_limit(client, agent): +def test_function_return_limit(client: LettaSDKClient, agent: AgentState): """Test to see if the function return limit works""" def big_return(): @@ -378,12 +380,12 @@ def test_function_return_limit(client, agent): """ return "x" * 100000 - tool = client.tools.upsert_from_function(func=big_return, name="big_return", return_char_limit=1000) + tool = client.tools.upsert_from_function(func=big_return, return_char_limit=1000) - client.agents.tools.add(agent_id=agent.id, tool_id=tool.id) + client.agents.tools.attach(agent_id=agent.id, tool_id=tool.id) # get function response - response = client.agents.messages.send( + response = client.agents.messages.create( agent_id=agent.id, messages=[ MessageCreate( @@ -396,7 +398,7 @@ def test_function_return_limit(client, agent): response_message = None for message in response.messages: - if isinstance(message, LettaMessageUnion_ToolReturnMessage): + if isinstance(message, ToolReturnMessage): response_message = message break @@ -405,7 +407,7 @@ def test_function_return_limit(client, agent): assert "function output was truncated " in res -def test_function_always_error(client, agent): +def test_function_always_error(client: LettaSDKClient, agent: AgentState): """Test to see if function that errors works correctly""" def always_error(): @@ -414,12 +416,12 @@ def test_function_always_error(client, agent): """ return 5 / 0 - tool = client.tools.upsert_from_function(func=always_error, name="always_error", return_char_limit=1000) + tool = client.tools.upsert_from_function(func=always_error, return_char_limit=1000) - client.agents.tools.add(agent_id=agent.id, tool_id=tool.id) + client.agents.tools.attach(agent_id=agent.id, tool_id=tool.id) # get function response - response = client.agents.messages.send( + response = client.agents.messages.create( agent_id=agent.id, messages=[ MessageCreate( @@ -432,7 +434,7 @@ def test_function_always_error(client, agent): response_message = None for message in response.messages: - if isinstance(message, LettaMessageUnion_ToolReturnMessage): + if isinstance(message, ToolReturnMessage): response_message = message break @@ -442,7 +444,7 @@ def test_function_always_error(client, agent): @pytest.mark.asyncio -async def test_send_message_parallel(client, agent): +async def test_send_message_parallel(client: LettaSDKClient, agent: AgentState): """ Test that sending two messages in parallel does not error. """ @@ -450,7 +452,7 @@ async def test_send_message_parallel(client, agent): # Define a coroutine for sending a message using asyncio.to_thread for synchronous calls async def send_message_task(message: str): response = await asyncio.to_thread( - client.agents.messages.send, + client.agents.messages.create, agent_id=agent.id, messages=[ MessageCreate( @@ -480,12 +482,12 @@ async def test_send_message_parallel(client, agent): assert len(responses) == len(messages), "Not all messages were processed" -def test_send_message_async(client, agent): +def test_send_message_async(client: LettaSDKClient, agent: AgentState): """ Test that we can send a message asynchronously and retrieve the messages, along with usage statistics """ test_message = "This is a test message, respond to the user with a sentence." - run = client.agents.messages.send_async( + run = client.agents.messages.create_async( agent_id=agent.id, messages=[ MessageCreate( @@ -502,7 +504,7 @@ def test_send_message_async(client, agent): start_time = time.time() while run.status == "created": time.sleep(1) - run = client.runs.get_run(run_id=run.id) + run = client.runs.retrieve_run(run_id=run.id) print(f"Run status: {run.status}") if time.time() - start_time > 10: pytest.fail("Run took too long to complete") @@ -511,30 +513,28 @@ def test_send_message_async(client, agent): assert run.status == "completed" # Get messages for the job - messages = client.runs.get_run_messages(run_id=run.id) + messages = client.runs.list_run_messages(run_id=run.id) assert len(messages) >= 2 # At least assistant response # Check filters - assistant_messages = client.runs.get_run_messages(run_id=run.id, role="assistant") + assistant_messages = client.runs.list_run_messages(run_id=run.id, role="assistant") assert len(assistant_messages) > 0 - tool_messages = client.runs.get_run_messages(run_id=run.id, role="tool") + tool_messages = client.runs.list_run_messages(run_id=run.id, role="tool") assert len(tool_messages) > 0 - specific_tool_messages = [ - message for message in client.runs.get_run_messages(run_id=run.id) if isinstance(message, LettaMessageUnion_ToolCallMessage) - ] + specific_tool_messages = [message for message in client.runs.list_run_messages(run_id=run.id) if isinstance(message, ToolCallMessage)] assert specific_tool_messages[0].tool_call.name == "send_message" assert len(specific_tool_messages) > 0 # Get and verify usage statistics - usage = client.runs.get_run_usage(run_id=run.id) + usage = client.runs.retrieve_run_usage(run_id=run.id) assert usage.completion_tokens >= 0 assert usage.prompt_tokens >= 0 assert usage.total_tokens >= 0 assert usage.total_tokens == usage.completion_tokens + usage.prompt_tokens -def test_agent_creation(client): +def test_agent_creation(client: LettaSDKClient): """Test that block IDs are properly attached when creating an agent.""" offline_memory_agent_system = """ You are a helpful agent. You will be provided with a list of memory blocks and a user preferences block. @@ -558,8 +558,8 @@ def test_agent_creation(client): """Another test tool.""" return "Hello from another test tool!" - tool1 = client.tools.upsert_from_function(func=test_tool, name="test_tool", tags=["test"]) - tool2 = client.tools.upsert_from_function(func=another_test_tool, name="another_test_tool", tags=["test"]) + tool1 = client.tools.upsert_from_function(func=test_tool, tags=["test"]) + tool2 = client.tools.upsert_from_function(func=another_test_tool, tags=["test"]) # Create test blocks offline_persona_block = client.blocks.create(label="persona", value="persona description", limit=5000) @@ -583,7 +583,7 @@ def test_agent_creation(client): # Verify all memory blocks are properly attached for block in [offline_persona_block, mindy_block, user_preferences_block]: - agent_block = client.agents.core_memory.get_block(agent_id=agent.id, block_label=block.label) + agent_block = client.agents.core_memory.retrieve_block(agent_id=agent.id, block_label=block.label) assert block.value == agent_block.value and block.limit == agent_block.limit # Verify the tools are properly attached