diff --git a/.fern/metadata.json b/.fern/metadata.json index f4e594d6..2cd12b67 100644 --- a/.fern/metadata.json +++ b/.fern/metadata.json @@ -12,10 +12,10 @@ }, "pyproject_python_version": "^3.10" }, - "originGitCommit": "f0e48e5c5364c0db5a1c445306aa80bd400f6839", + "originGitCommit": "ed4d7fcaa984c22ae4ad55dd1970106aae190446", "originGitCommitIsDirty": true, "invokedBy": "ci", - "requestedVersion": "4.0.1", + "requestedVersion": "4.1.0", "ciProvider": "github", - "sdkVersion": "4.0.1" + "sdkVersion": "4.1.0" } \ No newline at end of file diff --git a/.fern/replay.lock b/.fern/replay.lock index a8927b84..5f78b411 100644 --- a/.fern/replay.lock +++ b/.fern/replay.lock @@ -66,14 +66,20 @@ generations: cli_version: unknown generator_versions: fernapi/fern-python-sdk: 5.39.2 -current_generation: 385ce1c0aaf3c3320ef0b41c55f633fdcb3e9566 + - commit_sha: 2818395f8ff39ec886a500dcb9438515d204779a + tree_hash: a6aa007fef03a6c5f17e5199c25ab97ff2ea3b2b + timestamp: 2026-11-02T19:01:22.431Z + cli_version: unknown + generator_versions: + fernapi/fern-python-sdk: 5.39.2 +current_generation: 2818395f8ff39ec886a500dcb9438515d204779a patches: - id: patch-082f322d content_hash: sha256:80c233468a0236864659e748ffa647c6c6a89435d3fca6dec28965e48b901c46 original_commit: 082f322d1bd077cff00e3630500ac6187251a000 original_message: Let an ontology field opt out, and fix the README (#348) original_author: Pavlo Paliychuk - base_generation: 385ce1c0aaf3c3320ef0b41c55f633fdcb3e9566 + base_generation: 2818395f8ff39ec886a500dcb9438515d204779a files: - README.md patch_content: | diff --git a/poetry.lock b/poetry.lock index 8a212296..f336f01a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -230,14 +230,14 @@ files = [ [[package]] name = "anyio" -version = "4.15.1" +version = "4.16.0" description = "High-level concurrency and networking framework on top of asyncio or Trio" optional = false python-versions = ">=3.10" groups = ["main"] files = [ - {file = "anyio-4.15.1-py3-none-any.whl", hash = "sha256:6152fdbbf9a77fdec97731721bebf7c4c44f7c29b424b0065826173efc7ed101"}, - {file = "anyio-4.15.1.tar.gz", hash = "sha256:9f28306018cbd6d329e64a36d58256edff76dd996fe423bc957326e578b82a94"}, + {file = "anyio-4.16.0-py3-none-any.whl", hash = "sha256:c66ae634e0b8228396b801741beb3294326d4b6102f7bba4041c0dfb58c29026"}, + {file = "anyio-4.16.0.tar.gz", hash = "sha256:59bb03251907983d1603d27c3087ddb1e93299ea2163adcdba37899a4fb12ffb"}, ] [package.dependencies] @@ -289,14 +289,14 @@ files = [ [[package]] name = "certifi" -version = "2026.10.19" +version = "2026.10.23" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.7" groups = ["main"] files = [ - {file = "certifi-2026.10.19-py3-none-any.whl", hash = "sha256:42d35340cc5b9ba78e818ddbff0c5b1c2b779de448a340fd1b989f5fa8670e1b"}, - {file = "certifi-2026.10.19.tar.gz", hash = "sha256:035c1e85572b141bf1c3a3eff0e33a8eb74917522f2559075ff8d2fea780a1ae"}, + {file = "certifi-2026.10.23-py3-none-any.whl", hash = "sha256:e9b54de76e530bb6cf0ccd036787103acb58fd42ba930ea8bf948ddbaa2f61d1"}, + {file = "certifi-2026.10.23.tar.gz", hash = "sha256:a9895e6e2758b371e0545e321a3a8fd1fcfd9829ada8824a936dfb16aaaf36cd"}, ] [[package]] @@ -1016,19 +1016,19 @@ files = [ [[package]] name = "pydantic" -version = "2.14.1" +version = "2.14.2" description = "Data validation using Python type hints" optional = false python-versions = ">=3.10" groups = ["main"] files = [ - {file = "pydantic-2.14.1-py3-none-any.whl", hash = "sha256:9195d967ec791692a04438115466764fb8b9a27b31f14a760437694f40d6b454"}, - {file = "pydantic-2.14.1.tar.gz", hash = "sha256:94f478203dd03404682a1ada216965651dd74b1d2d5ffd62e00e0837caab5c26"}, + {file = "pydantic-2.14.2-py3-none-any.whl", hash = "sha256:7efbf7507b937931cd32a5755acb00ea1cf5ccb1d4e8067a5850d5069e382118"}, + {file = "pydantic-2.14.2.tar.gz", hash = "sha256:fb7b2db6cefe8414dd612edeede49c4c433acb0432b0f92b95024e45f66c505d"}, ] [package.dependencies] annotated-types = ">=0.6.0" -pydantic-core = "2.50.1" +pydantic-core = "2.50.2" typing-extensions = ">=4.16.0" typing-inspection = ">=0.4.4" @@ -1038,149 +1038,153 @@ timezone = ["tzdata ; platform_system == \"Windows\""] [[package]] name = "pydantic-core" -version = "2.50.1" +version = "2.50.2" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.10" groups = ["main"] files = [ - {file = "pydantic_core-2.50.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b281a3b0f0822618fe5e3e0d8a2048b6356b14388505dc9374ccffeb69989713"}, - {file = "pydantic_core-2.50.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1fa4c8bc12c1354c5550c0c35c1852c8c1901e89e06561724e03f8d0342e1f87"}, - {file = "pydantic_core-2.50.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3aa9de446b793de2beb6fa2d9d0961803126c4e2a99c2f25ab59b9fd6ea125c0"}, - {file = "pydantic_core-2.50.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:de531ce1e2a3364e8767878b58f4ff728a434b4fde089781fe30b1e08e2396e0"}, - {file = "pydantic_core-2.50.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7c58106de36ac6a56314182958de20db8d3a29dfd5db527192cc754e4f8e7fb"}, - {file = "pydantic_core-2.50.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8b4c3df25bd323bf1d36a648d563cf1fc69d717451569927151bdad7cad07a77"}, - {file = "pydantic_core-2.50.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f77ac30b19221cd9bd3fcfa3d4614eff93140d0572ab730cded17b64adca05f3"}, - {file = "pydantic_core-2.50.1-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:d939de9c82e2126f7f48a7e658f8a85ed46d57662d53f44c49b8895fe94a3eb7"}, - {file = "pydantic_core-2.50.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:30ddf019d082c117b5d309e5b86710c2a78909907ec1a9381feec3eec02eca0b"}, - {file = "pydantic_core-2.50.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2ab756b72bd5054e4c7ef3ded331b35786cbd3cf931531a508f79a9537517064"}, - {file = "pydantic_core-2.50.1-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:b087b1c5be7ac687cf22eabfe4b6b608d40df23610651e93611e1f49118baf84"}, - {file = "pydantic_core-2.50.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a44101320cfe99432db74237545a63057dc7a88dfe792cbcad0647f2af56cb81"}, - {file = "pydantic_core-2.50.1-cp310-cp310-win32.whl", hash = "sha256:a4aaaa791bdae1c972a7e81765f4f3571c926b8e0b9b6e47346499fb80079665"}, - {file = "pydantic_core-2.50.1-cp310-cp310-win_amd64.whl", hash = "sha256:2eedf82ee4753cdab8e50044c6bd569577eebc3859b11fecf4eb9223761ff966"}, - {file = "pydantic_core-2.50.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:c531166c42ea7bdfecc8c50049581f05dd1993b09cc7c52bb36a14e96deaec7d"}, - {file = "pydantic_core-2.50.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b6d0c2183008c188e19f4906d426b293bdc4f67ab17df8e180fe16cda208fa71"}, - {file = "pydantic_core-2.50.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94be440c03fede26969a5ce75468e0e6a9927a1b46d9b679ee8adc1b057b0350"}, - {file = "pydantic_core-2.50.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:36c426eac0af8d1529ff8467e612b933346caec1fdc0d774f78f67a1a11e16c1"}, - {file = "pydantic_core-2.50.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:028e2f212273d4a39b1ec1e0de8166b1165a65fc0f1111452a9d94fc7c625c63"}, - {file = "pydantic_core-2.50.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e6f0cc1bb9900dc558960894adeb30b0c083366fc1d69b856209fb2ca5c36fe5"}, - {file = "pydantic_core-2.50.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8812592c85d0edf423f10eadcef42716d71e8219085ad9e85b775057b7306133"}, - {file = "pydantic_core-2.50.1-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:bbce99252ba3167b2b6277f1829d5bf4b43b754524bddf7f944707c3db7d2253"}, - {file = "pydantic_core-2.50.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:476f6ed8e43cd1e0b460920e23571700872b284e77331cb30c4faf459cf48a4b"}, - {file = "pydantic_core-2.50.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2cbd1b75b09e976ed0d6b6ca297675632ca35df86130088457cdc60ef36970ae"}, - {file = "pydantic_core-2.50.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:5958c72adb417c39b12ac87525ac60b0d73315fcdc59e21f44ee4a5e2512c9ef"}, - {file = "pydantic_core-2.50.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d8f9e8a6c4ab04b78d61f78627370d834eb004b2869dcb28cfffa647b4ea1980"}, - {file = "pydantic_core-2.50.1-cp311-cp311-win32.whl", hash = "sha256:4be846f55c9477f5f3ddde8f2ce941137e16862a56d018ed885d422bb6ae02f2"}, - {file = "pydantic_core-2.50.1-cp311-cp311-win_amd64.whl", hash = "sha256:0048b6dddc8ef4b64fccaad878bd143b0c3882ea9936279dc11d613f6b7dd1bc"}, - {file = "pydantic_core-2.50.1-cp311-cp311-win_arm64.whl", hash = "sha256:6a733778df2f7087ec1100ed0b41533e4f3001976e99570fa34f57c66e7f8e3e"}, - {file = "pydantic_core-2.50.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:704075d10b74f2f3c6e15407c696d88701df35fc8953f434a431add0d0074db0"}, - {file = "pydantic_core-2.50.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e8e1d6ce820aa23317e8209a86bd65a540973c12dc7552b48a4f6c8e9926815e"}, - {file = "pydantic_core-2.50.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c18db21573bd2c6489f9a544b7499f0df2853958c568e5e783536ee1f690af41"}, - {file = "pydantic_core-2.50.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cb57f304525a5e3c13333b772bf9a473f36326e9c821b2e8e1b2fd36f80ae2c3"}, - {file = "pydantic_core-2.50.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a27c09d86600f1bf2fe3f37e1ae697faf3143931c09322cd799da94deee923b5"}, - {file = "pydantic_core-2.50.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:46b3301d3b5c886f77de7546e47274a5842c622ea2020b8c6524c6b66913b4a6"}, - {file = "pydantic_core-2.50.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93ba4e9d8210d941c200431a56b2c0400b131865947903937ed3ec5404307d2e"}, - {file = "pydantic_core-2.50.1-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:e5faeaee74a57d32b3ab3aebad2e348f06d3ba946fc5d28c1728455f00a3d13a"}, - {file = "pydantic_core-2.50.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a3cda0e538208e5d722bbf3698b24f19c0a7d05bc8d5f8a7f9b121ea7fa243d9"}, - {file = "pydantic_core-2.50.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:57f51b31ff826e2859120cf4737c5a758a48d96f3e97da40ccee1796d58078ff"}, - {file = "pydantic_core-2.50.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:8daa7ee75245d43ad7d747e5c9ecc1b1d06552f72b14887e9276f787d57375f4"}, - {file = "pydantic_core-2.50.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:acbf31f37c53a5ac0c34706c80b4f5107ba20b05fdd3816124bf236ef0c57dd2"}, - {file = "pydantic_core-2.50.1-cp312-cp312-win32.whl", hash = "sha256:45b11cac094aa25725581d9304eee93c9028516b9ea80dd9e175e13a5a2c840e"}, - {file = "pydantic_core-2.50.1-cp312-cp312-win_amd64.whl", hash = "sha256:132529c83901437ff642f585216831bf5fd7a91df66829907e155192ead62498"}, - {file = "pydantic_core-2.50.1-cp312-cp312-win_arm64.whl", hash = "sha256:4e834f6a8e4ff772dcc34f58ef5504147a3ea5b0f4eeb13b0f8eb2ca75ac57f1"}, - {file = "pydantic_core-2.50.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:d5e062c01286d861fd6a1c4ff6e063547b3e713067f2df033c0ff97ac2ca006b"}, - {file = "pydantic_core-2.50.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0c003c3b7f49debb893d2d85ae099ac5959c9839e2f330fadb1fcdf7a6594482"}, - {file = "pydantic_core-2.50.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:409e0ea40ec30d9158f33574fd758e689f6045a0f2596701828c27816ca9687d"}, - {file = "pydantic_core-2.50.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:131059670f1d2444269b8585cb888963994871932447c08b39ac6a51fcfef658"}, - {file = "pydantic_core-2.50.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6dbcbee53bf17196a7f745aa9bf5a9603953a1e365b1f020be3207c676a3e7c4"}, - {file = "pydantic_core-2.50.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:325c23f3e35cfbf0fe3486fa5f7260d1e45885173002d30a28ca019994124255"}, - {file = "pydantic_core-2.50.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17e722e156d0444ecaefbe640bdb60928752bf2013e2b7a11cdb099aaae19bec"}, - {file = "pydantic_core-2.50.1-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:aa8224f10880d9bf1b5993988ba153d42a8b4f3f4f511f93b1f09c93ff613c72"}, - {file = "pydantic_core-2.50.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:41bc8237121bd8dc8d888dfd6279fc166ffc88c1f1bf3a8bf00869680533ca4c"}, - {file = "pydantic_core-2.50.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:45c6266d071c241f2a168d45bf8c54344f0effce35e7e6b73afdec11f3687568"}, - {file = "pydantic_core-2.50.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:1deeacb112d14d3f4fcb16b165f7dbaf76c70ba6e82f37ba042bdab51970a0b8"}, - {file = "pydantic_core-2.50.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:1c96fd793b73d1b92e65570132505498fe7b21eaef73cdf74e67e5dfba7ac9e4"}, - {file = "pydantic_core-2.50.1-cp313-cp313-win32.whl", hash = "sha256:06ead20d39ffd6f2f6f2a8f8a6de67ff8bb1b4f14a8a30e058502514ee2ac685"}, - {file = "pydantic_core-2.50.1-cp313-cp313-win_amd64.whl", hash = "sha256:7816e98acc08119dc0f340ab167048ecc54126316330c1f0caf7c6756c88e28f"}, - {file = "pydantic_core-2.50.1-cp313-cp313-win_arm64.whl", hash = "sha256:c17799a62c142d61b8a3c51752a7cbc87fe2ad4ccfab10e628a77b405075c662"}, - {file = "pydantic_core-2.50.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:1cf41f1ae3fa155cf167a72689ad044bcc1e3c97e064123677149bdfb5dafc4a"}, - {file = "pydantic_core-2.50.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4df197990c15b5a37c5a277d131d9f2c67de6133f2e5dafd80d9bba4b99f46f9"}, - {file = "pydantic_core-2.50.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0036473f5583e6a60e50b8b21651511564277a3f05cc5dab8cf579f552cd5f6c"}, - {file = "pydantic_core-2.50.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:992c3514ec891fa7858099183e4d64e6bd5a5d4ff452fae29df22faa77a006bb"}, - {file = "pydantic_core-2.50.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:739dc730e6be3bd5ec2f4ab5cfc7eb047cc45fc1497b3bafec74ff2ed07df597"}, - {file = "pydantic_core-2.50.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32fad3a91e51b6d2039c572db04a5a873260b399f6bd62c3552671fa7a4a2899"}, - {file = "pydantic_core-2.50.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42b54c2c90ad348b5e3a85e03e715d572c1fde357ef104cdfe3b03b697a404ea"}, - {file = "pydantic_core-2.50.1-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:2df1ff41884de2bc4b307bafd7c40a691094fad2ff8e767e5b45a319257bcf4e"}, - {file = "pydantic_core-2.50.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe90228920fd8ff2be62622b6bb8a2b11acd65046d50c6b130614b5879605a20"}, - {file = "pydantic_core-2.50.1-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:844b869f118e22a41a091bdcedda8a71bc1b0f62c38d1a0c3211cece47e1d8fc"}, - {file = "pydantic_core-2.50.1-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:2eb75304506894a281d346220a4f7481a1b8729577c5ed2a05395991966a8396"}, - {file = "pydantic_core-2.50.1-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:6b20a4bffabdad0db2927ac034ae3b8a681b1f7a0182f3e60b479ad2fde21ebb"}, - {file = "pydantic_core-2.50.1-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:99ba9bc2b8062ea0c326a990f7f00e6530c23579de66dd246e72c4cafef950a5"}, - {file = "pydantic_core-2.50.1-cp314-cp314-win32.whl", hash = "sha256:cf356f70551d40374eaffb1aa63f1eb6d2006681cbd7a9faea173ce0f4dd7cd2"}, - {file = "pydantic_core-2.50.1-cp314-cp314-win_amd64.whl", hash = "sha256:d32f3acc081cc3923386d88f422cde8892335e95f034e0104bb4cf9310d9915f"}, - {file = "pydantic_core-2.50.1-cp314-cp314-win_arm64.whl", hash = "sha256:bed5163e03b98bc1fa2eb05d74c63d9c5c95d8ed6254985481640fbf5e237dea"}, - {file = "pydantic_core-2.50.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:9572c1369e9c9da2d64a7b7992c786d90ff295abc93964cfe3125e4290768070"}, - {file = "pydantic_core-2.50.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2005207aafe1231315718bf6ed5d064a7300fb4772754af35ee72fc68159492e"}, - {file = "pydantic_core-2.50.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64f6047f62a6c5ae08d0a6afb035667aa2d97c3d20d69762e034c5ea144d92a5"}, - {file = "pydantic_core-2.50.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1ef800dd7d85bcdadf4c3076e4c94e43939493558a3b69a1ea830c706d4617bb"}, - {file = "pydantic_core-2.50.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b0135bcdcaa0f23573f286e4cb5e0fd2962700964ed13df085b85f2b97aeab9e"}, - {file = "pydantic_core-2.50.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0b3a6f334c6a2345ca15318ff894502a90012536404b37c844a976c76c846e0b"}, - {file = "pydantic_core-2.50.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06e01fbbfdb9be777b316a71b6c49efaf4a08b615d0a98d678cda3023f79d019"}, - {file = "pydantic_core-2.50.1-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:a29a061fec0b4e2d714f277e70a3a18125ecff803f2fea6eade2f2e53711d112"}, - {file = "pydantic_core-2.50.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f5187624823423e1d1b82b1072ac41dc837389e18d3d0572cc19bbee46cd550a"}, - {file = "pydantic_core-2.50.1-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:3e46a9eb0a0901dd6275e6b06ac3a464885ef350ec4121fe486869de8053e4bb"}, - {file = "pydantic_core-2.50.1-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:756d669f04e62ec4148ecfe22be6a4484d9b1181a6ef32e205ebfd200540858b"}, - {file = "pydantic_core-2.50.1-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:c516cc5367ca3448995d42cb994bf3f4c9002d2a7c22eac9622551269ad1b807"}, - {file = "pydantic_core-2.50.1-cp314-cp314t-win32.whl", hash = "sha256:9d1bed94af6a63835461f3cf7502058eb166c58c4778e11d0f433cfb1bd69e19"}, - {file = "pydantic_core-2.50.1-cp314-cp314t-win_amd64.whl", hash = "sha256:c8dce1f1e0e5358b682a6ad3fa5e31b31d4560997b8e61417e9217c8d60f8a0c"}, - {file = "pydantic_core-2.50.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ceff0acc940be2715bd6ad17b24c0e5304abf44f6efd0f81ee8499e640f9dc86"}, - {file = "pydantic_core-2.50.1-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:8a6791afa2245e6c6b180122d105941644f5bd410bb18623b408808cc41a3102"}, - {file = "pydantic_core-2.50.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:84f34323a61a365b4e9295de6028474754829aaddd59c7bf1a040e7487ef8f3c"}, - {file = "pydantic_core-2.50.1-cp315-cp315-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23edad659e8dbd8ca7e4e877fe6c81573abbdf215bd25a68b53e1272f58b80c7"}, - {file = "pydantic_core-2.50.1-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a5fce22f1e87d181e924e12da7d81cfe031fb3881a5ddf26ad28f141756ca43"}, - {file = "pydantic_core-2.50.1-cp315-cp315-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c73622ef819328873b53109ee4f77ceb598bffedd02daf916102be3228866b78"}, - {file = "pydantic_core-2.50.1-cp315-cp315-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce8c25ca38cc0e3d7753ba180808de2c0c8cb24eae0df64491e40921454e9831"}, - {file = "pydantic_core-2.50.1-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7689580e72a642ab5ec64d5f55b2e33636fa43b4ebe63c0c2c965ef307c7d1aa"}, - {file = "pydantic_core-2.50.1-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:d5c0e32fdbce7f1e8ef4d11f655694bf5f4175c757a9f1dc2be09b8864e5bcf5"}, - {file = "pydantic_core-2.50.1-cp315-cp315-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:40f523349960fa30f3ea51404308ff50f9997a90df639590f47a057c1f32b415"}, - {file = "pydantic_core-2.50.1-cp315-cp315-musllinux_1_1_aarch64.whl", hash = "sha256:d4193206b6587047437f6f11d7e776df23e1c1e23af2a54d9347275614791e10"}, - {file = "pydantic_core-2.50.1-cp315-cp315-musllinux_1_1_armv7l.whl", hash = "sha256:84bc765b282a9d5b7fe0348b8648904f25a6a04b2139da52b1dd30c8ac3a2c8f"}, - {file = "pydantic_core-2.50.1-cp315-cp315-musllinux_1_1_x86_64.whl", hash = "sha256:ed1e728b39a383c81035b2459cfcb35d99dfb01f7d6ebe3a913bc1cc5b81e459"}, - {file = "pydantic_core-2.50.1-cp315-cp315-win32.whl", hash = "sha256:bc94f474417604bd383d2cd445d071b07dd55fedceed3ce33407bf1fcc107290"}, - {file = "pydantic_core-2.50.1-cp315-cp315-win_amd64.whl", hash = "sha256:983a662de2571cb2502fc8ff47b6770b03d025d2eb314c92f77b3f07c74720ed"}, - {file = "pydantic_core-2.50.1-cp315-cp315-win_arm64.whl", hash = "sha256:94845ff54dc5193f228cab81b2662a04bfbb892e95bdc15edf7399000ce57d54"}, - {file = "pydantic_core-2.50.1-cp315-cp315t-macosx_10_12_x86_64.whl", hash = "sha256:4a53d13cdfbedbfa87f08b83c1a0a5efcc767d785a4b41934fa9cb672670493a"}, - {file = "pydantic_core-2.50.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:efbecf43d321f7b9281441f1f213f7c21c66988b0e06c2730ba13ed47a46bb08"}, - {file = "pydantic_core-2.50.1-cp315-cp315t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc1f08f68dac9f9e83845a8039880aba2ab553eb9b2259c3243a313182c253fe"}, - {file = "pydantic_core-2.50.1-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5dfe41f232befddb9c4377f6cfc702b51595e2d78ed082672adf8758d2c4619f"}, - {file = "pydantic_core-2.50.1-cp315-cp315t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adc06d218a1cadfd2ec4628424d7d79ce4eba69c2965e7e7b55106f0da5208c8"}, - {file = "pydantic_core-2.50.1-cp315-cp315t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2cf91809d0721ab81592ba67bea7694821679c10b1a2e3c3460082b286c1918a"}, - {file = "pydantic_core-2.50.1-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23923ab9292c40da026330b1ecf4dc2618c8e86e0422e5d1fbf50d94d64ca4f8"}, - {file = "pydantic_core-2.50.1-cp315-cp315t-manylinux_2_31_riscv64.whl", hash = "sha256:f3377c8c2b3ce898423c5e5dd94c7982e30aa7717a7e6ab2470b9de364963709"}, - {file = "pydantic_core-2.50.1-cp315-cp315t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:455a773617b5913bf5c20d0692e5787b119e52c4d40ea644ca31f5758fd31be2"}, - {file = "pydantic_core-2.50.1-cp315-cp315t-musllinux_1_1_aarch64.whl", hash = "sha256:1a9006395dece0e32e704c315eff8a00bede494f6108546cfc5539c89fef4f9a"}, - {file = "pydantic_core-2.50.1-cp315-cp315t-musllinux_1_1_armv7l.whl", hash = "sha256:d2d82aa62521c55ddfb000ae70f88cdd8de974078f6024e821dfe5addd0c818f"}, - {file = "pydantic_core-2.50.1-cp315-cp315t-musllinux_1_1_x86_64.whl", hash = "sha256:009634b83993777ddcd69cad0ffcace43dabde692109528e35f0fde91e386a8b"}, - {file = "pydantic_core-2.50.1-cp315-cp315t-win32.whl", hash = "sha256:3fde4fdc6487a58d944ca87cf5adc95d5f266e872c19599f5f4c0a8a1b1f9f9f"}, - {file = "pydantic_core-2.50.1-cp315-cp315t-win_amd64.whl", hash = "sha256:1c8632d4ac04e6f91128fca584b3a8a507d81604c24eeaaad00d4be42765c32b"}, - {file = "pydantic_core-2.50.1-cp315-cp315t-win_arm64.whl", hash = "sha256:c3ede305158e75510be50869b319550ab072008c13d64d4ab1e094fb286b6f44"}, - {file = "pydantic_core-2.50.1-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:062e891facce5ca296a1c37098e5e466780457f86413894b399f0cf22934f769"}, - {file = "pydantic_core-2.50.1-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:49c2cbb2397fe4d0987e84606e691af6cb87bc0ee1bd3e7b737f7e10b4c142f9"}, - {file = "pydantic_core-2.50.1-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e4472072de0137ee0d8e72d6620e85939c271d2f90f6bbb4b15c24638b79f92"}, - {file = "pydantic_core-2.50.1-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ed4f3cef55164b026fefb41341b7754cc6b624c75dfe7142d2ecceb5ad21c87"}, - {file = "pydantic_core-2.50.1-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:76e2e83fa6ec8cdc972d438dafc2522b3a47bee4ec0ae668b29cfb1977ab5242"}, - {file = "pydantic_core-2.50.1-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:a51eee75939cf811ac09b278745a6cee7dc873ccfbc8b9af3cc88fe4b7ce25b5"}, - {file = "pydantic_core-2.50.1-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae28183297fb0d2b8dc46a1f01d51f5e45825fc5afe76a835a6cb7fb34821295"}, - {file = "pydantic_core-2.50.1-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88e492e8b9d0312e7dc13667c30222abf284dc3b79b5302b3607b41a5784ce61"}, - {file = "pydantic_core-2.50.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7456d699b13954e9c0164dcb267250a10ae0dfb03e6e26d6796ab0d46e189c84"}, - {file = "pydantic_core-2.50.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0d955195bbbe489ad343fcc956eacea9357b79cb22192c66cacdefcbc14b32f"}, - {file = "pydantic_core-2.50.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2c634642694e6a0dad2ab1d375589fa671fd442edd5caf7d9737b8f6ca22906"}, - {file = "pydantic_core-2.50.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ee6db2fbed51a7991302e8fac498cd67e336246026d0dfa84cf5166ce1412760"}, - {file = "pydantic_core-2.50.1-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:79490e33c4c0fcb933bbbcfc3a62184d8803b99f535863dfbb925e1bcb6945ad"}, - {file = "pydantic_core-2.50.1-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:48569b0ade9edfbe065cad1d700175546592aebbb42f02adcebcc26e75b896fe"}, - {file = "pydantic_core-2.50.1-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:5f3cae32fc46121f787cb2486de9cf95a8bf72aec5cc78f64c606fa1735a6ef5"}, - {file = "pydantic_core-2.50.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:7f476456ac2bb0d937f75191494a09c83a30765fea4f70f3b404942fe25f6cdf"}, - {file = "pydantic_core-2.50.1.tar.gz", hash = "sha256:e50d7b94baac6c7d09927fa5ca5800a0c7ee5015c7fcff65beb3a1931b5a6e09"}, + {file = "pydantic_core-2.50.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:6258754c473b3045a7aa30b833a8a331a1ab36c6147cb230789861d80bb26f83"}, + {file = "pydantic_core-2.50.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a786cf782ebb2e45a43c7118d75d452aac982b79577dfe804d8dbf2878f0b589"}, + {file = "pydantic_core-2.50.2-cp310-cp310-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:ea71b94a2eb5d2fc102926321f56d2ee8eddfad2673eadb1d23e9f287a492715"}, + {file = "pydantic_core-2.50.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:71615edeaf1ae70f5f3f558426072eede0168b7e5190fd9633878e29a0b85732"}, + {file = "pydantic_core-2.50.2-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:1a5e859f5a8a6d834b0a13acaa0eaddf1a9b4b015fcda13bab7b471e18299d32"}, + {file = "pydantic_core-2.50.2-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:d71a9a9352acbcb5c73d39dd003383599428067b6eda5cf7c5d335a7a0da37e1"}, + {file = "pydantic_core-2.50.2-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:bf7f99a0e6616cea754e2334d129091f3260d011369d9b8c658522bfb2427619"}, + {file = "pydantic_core-2.50.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5c12a5a080570a91bbcbf6d10db008b80e3f5dea015ef2f0137bbec70f24f3f3"}, + {file = "pydantic_core-2.50.2-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:89213368eef163350af37127939ace099010e8102757905c3e329f1175950ed8"}, + {file = "pydantic_core-2.50.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d93c066a38f83376b5bc020e563666784d1b680a70d6ceb625fdb541af7a312e"}, + {file = "pydantic_core-2.50.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:eec187d2876abb6a74203efbe2aa796455c1809334acf4e739dde35da8cfb69f"}, + {file = "pydantic_core-2.50.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:701bc55d08c22f981973ca4f6fdf4ea102ee1ee3a21b818b66fdb161ea711a4a"}, + {file = "pydantic_core-2.50.2-cp310-cp310-win32.whl", hash = "sha256:7f9821dfc0c473c96ad55ce4189c7cb4f9c94e7d4f563afb874173243dec1162"}, + {file = "pydantic_core-2.50.2-cp310-cp310-win_amd64.whl", hash = "sha256:3939538e640c94ab779a05f2d45dafedd01d65d93e1290797f3ac5b59fcb6455"}, + {file = "pydantic_core-2.50.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:2115d7ca6d58554af8a14da3dd32d361a4fe999fae52f115a6155679b5b00e72"}, + {file = "pydantic_core-2.50.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b2dd65864aad38dbcc57c3d0e2c978d4286e063378137d8fc0c9fcd558943285"}, + {file = "pydantic_core-2.50.2-cp311-cp311-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:26b778d4ebb75f181d36220ff0f54a513fc46f053d9b09ce79993c2f00bc45cc"}, + {file = "pydantic_core-2.50.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e80c47314c7233e7105a7efcfffd89d56e479e558189d1959eeeaf2639a27680"}, + {file = "pydantic_core-2.50.2-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:3bfe12243b3ded517c6734d91f127489e2f51bf95cb533b53130fe360333db80"}, + {file = "pydantic_core-2.50.2-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:01eb0282d0b3a065d55956d1be9ce398c46db3dd6d277a6cb2358c8aa8c53179"}, + {file = "pydantic_core-2.50.2-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:196b87b48b2695426920e8470d20f9e99f019ebd86f15808aa018b68086840cd"}, + {file = "pydantic_core-2.50.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:86e7abd24a67f61a4bfe8df059b67a2bdd8bf33705178e98463195d140bd3780"}, + {file = "pydantic_core-2.50.2-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:aff31602e8518594e6f6bc670cdb27e37cb7dbeb2d5d0b76a7707b70fe951ddf"}, + {file = "pydantic_core-2.50.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a88851e8e332588cb8cced8b5318d1163c7d0bb87830aa8dcafbc4ae9602b73c"}, + {file = "pydantic_core-2.50.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3b1bb3950e0794a795c9344d818d5b476189b0c9c9755e8eb8fde87c3acee17a"}, + {file = "pydantic_core-2.50.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:928a44ad1e21a7e923eb924d601605f0694cd187d2ce5d40bf7ad76650f4627d"}, + {file = "pydantic_core-2.50.2-cp311-cp311-win32.whl", hash = "sha256:9a87744e683d9a13f60b7fa5242c17f8d283ffa94ad727cb19063b48c3d34960"}, + {file = "pydantic_core-2.50.2-cp311-cp311-win_amd64.whl", hash = "sha256:b958c217c6e56bef261f516e4caf5d490b079ad6a428752afada5a764cca6c71"}, + {file = "pydantic_core-2.50.2-cp311-cp311-win_arm64.whl", hash = "sha256:b0e6a2152706d84f7da8b9d34dcecc7e9bde678af32c40bd5b405f427ae0fbdb"}, + {file = "pydantic_core-2.50.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:e3d824b6152e1c0fd58dc6266f2de470eb7b2286135294f5f7cd26a0f0693738"}, + {file = "pydantic_core-2.50.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:596921489390a002d6a5e303384a0f1f98384f8bb550fbf38a1aafa6093da0f9"}, + {file = "pydantic_core-2.50.2-cp312-cp312-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:36d8b9725684ca3bf658b90a101d335fc8cae405bb22196b7b5ef41344913756"}, + {file = "pydantic_core-2.50.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:43a8fd56f3c681f3cda2d5c842ad28e88241df742dfcbe8fd1dd437a3056e1f6"}, + {file = "pydantic_core-2.50.2-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:6f5a432c6c1ef18a1a02a04b3616b8d3f2f88b13faa46caae1ac6559ab202234"}, + {file = "pydantic_core-2.50.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5d3cd8be71c4da3c9b42cc92f17e5e3036bdca98bf18555a0e072c3fe87abbb4"}, + {file = "pydantic_core-2.50.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:6a438cb8a3f87f2c49e82e43fb19511d4d5043f53e0787dc4df937ccb904373a"}, + {file = "pydantic_core-2.50.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9667637665acba166a7dbbc786f14c50512d3a01f7199e0e1a13b929e92d7c7a"}, + {file = "pydantic_core-2.50.2-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:b3e681208e2d39fde13fbea449ef2736a85ec1ea2afa41e9193a8c536e71dafe"}, + {file = "pydantic_core-2.50.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6eb6ff07964f39e33c6f57fefe939514e76b8c0d4a694e5663e2e04e80cc1798"}, + {file = "pydantic_core-2.50.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:4eb54c25e3463d73e1e4ed439ffc45d1d7e590df40bc7bb06f11a906afd996c3"}, + {file = "pydantic_core-2.50.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:91238117cd296352f54f24117ff5a227bdea428865dba1244aa0cdd1424c0bc2"}, + {file = "pydantic_core-2.50.2-cp312-cp312-win32.whl", hash = "sha256:98722314e12a8e4fa346e0afd3fff2098b5732875ff45592b450a7b589b43c4f"}, + {file = "pydantic_core-2.50.2-cp312-cp312-win_amd64.whl", hash = "sha256:b381574614245f18fdb2d6d1aa8f149e225869c47b5ee7f81812de8977817314"}, + {file = "pydantic_core-2.50.2-cp312-cp312-win_arm64.whl", hash = "sha256:f07c965a8aa6d62145f122641f292129984f39a3e3697585b19298a1488287db"}, + {file = "pydantic_core-2.50.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:93eb41d626d9a2749a678823c70bba8c25033cef474ae8001fd7621adbbd8437"}, + {file = "pydantic_core-2.50.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7c539d452cba22f250103c7d1c00cbe9038eb705e657476e701c43374efd9f2e"}, + {file = "pydantic_core-2.50.2-cp313-cp313-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:53bd25e8ab54c02bb4c55d4848c1d36f75f3b9a7356e83179fe27794d9e9e6c4"}, + {file = "pydantic_core-2.50.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f142cd663d1148ed32993ed9a58e5c67ea312f446a01a6c13a956945aafc9f23"}, + {file = "pydantic_core-2.50.2-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:126f158474346f457c0759c29c1a6334acd5f7f99dd272bb27d19314f3d81b4d"}, + {file = "pydantic_core-2.50.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:0b94a515f44f1ebcb25395bcdba506c4cdaf6d3fcb0466b9658521b41e5ff057"}, + {file = "pydantic_core-2.50.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a55c1163e829a08707b4a92c8ee02a5a3a3847ced74aa4da94e3e975ffe1ec63"}, + {file = "pydantic_core-2.50.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:31a1fb3ffbd1195b24490f671d12623dd4c9bfa56d6af0a299fa43b516134f5b"}, + {file = "pydantic_core-2.50.2-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:83d6f42ae6eba44548a1a3d4f900a5b1500fdd14f09f04754a8800ab0d544432"}, + {file = "pydantic_core-2.50.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:9fcde11462e0faab4c2a2ae8cd4516f7dd8239eec583bd88c5524d8064ad2d0c"}, + {file = "pydantic_core-2.50.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:848984e231190ae49bc8b5229e64d2a6fba4231dc6046e1b6b28ddc060bc7601"}, + {file = "pydantic_core-2.50.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:8772c2c0091e6fc2d0499151793d31bf811826986b0727052935a95104845544"}, + {file = "pydantic_core-2.50.2-cp313-cp313-win32.whl", hash = "sha256:bd6ecae08c0d871cf93b6f0d4ee76b06c65be44ea22311981a022b2f1948cf9d"}, + {file = "pydantic_core-2.50.2-cp313-cp313-win_amd64.whl", hash = "sha256:e5c801bdf3cc92274b8fc2c7023c8751e5ae81260c009ac558ff55ce712a2d45"}, + {file = "pydantic_core-2.50.2-cp313-cp313-win_arm64.whl", hash = "sha256:fd9aa71a800c87c0f7ab53fa38009169a23a82c685989626ca74a4bd483e1b67"}, + {file = "pydantic_core-2.50.2-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:efad0bdc67d3b119c3bab6b94d341a27333c2bb89ed75dfa182a4a06cd0ea329"}, + {file = "pydantic_core-2.50.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:6ffb4dce3ecb2cd563aa30f9eb5088a1cf1f4f688b90cbb374fa96e49fc50b02"}, + {file = "pydantic_core-2.50.2-cp314-cp314-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:150f6e101f575c21a4ecfed1be1c05bb89a0ad49cb9c846ed377583bd71b32c2"}, + {file = "pydantic_core-2.50.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1db9cab6197e797824f0479dd2ae5fd2e272aa61c61b7faa5a6e450ca7a0d3b7"}, + {file = "pydantic_core-2.50.2-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:1b9f652e17a13bbc09b45f74c3c326cca72059ce4dcdef687fcb04389db413a9"}, + {file = "pydantic_core-2.50.2-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:823b222c4fc861a82c650998a6117ecbd150cc71bf8b78f9a31bf3f48c456108"}, + {file = "pydantic_core-2.50.2-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:783abdfac21247d33bec40aa683d26bba30d61655c40de38b2decc4797aabf92"}, + {file = "pydantic_core-2.50.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b29b7c5adf4b2be7c941f7f76432aa3269cd5052ff8610376b8ece24d7b02c51"}, + {file = "pydantic_core-2.50.2-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:4ac996e42a93d80122a23edce44e02c6b9c4913f5c6198a077da31475341a39a"}, + {file = "pydantic_core-2.50.2-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:99e1d482138a71902415ba375bb4627679a5fefd3bd07803c3a8f37632f4981d"}, + {file = "pydantic_core-2.50.2-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:a53d5f11cd6d15569ba3e53f3498077f0d5e633f6ec604d2ea613e895017ebee"}, + {file = "pydantic_core-2.50.2-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:23385c4626f8b5a7792aa381ea573d9432cfbf4c21375a0a5eed2a4fb64e0e58"}, + {file = "pydantic_core-2.50.2-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:9a8a62281fd9c6a373b3fd3d473685e6838d43341eecde5f47729748e2c11ee3"}, + {file = "pydantic_core-2.50.2-cp314-cp314-win32.whl", hash = "sha256:18f008ef58cd30782f81b6e0119e20b7e884edcefbc2d370162ebe033f6e5c99"}, + {file = "pydantic_core-2.50.2-cp314-cp314-win_amd64.whl", hash = "sha256:b62c89545d21d930c333208fd548e7b4f262228ba3a322fd75c987a75ab11f31"}, + {file = "pydantic_core-2.50.2-cp314-cp314-win_arm64.whl", hash = "sha256:6e731bf5a5e8e25398544d7709e39068ec4230b0177e4db7fa955692fd415ba3"}, + {file = "pydantic_core-2.50.2-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:33c6800ab9563adaa0d7893e9cd8f5b972ef1e6a23df70498e05c24f3fcec5e1"}, + {file = "pydantic_core-2.50.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f81df206b937d0dca5efb38c25fc99037d82dbcd3740e34c3f81997d2322ac1c"}, + {file = "pydantic_core-2.50.2-cp314-cp314t-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:21ea3b00f1e87c66f3f9e92f9f6fec20495ac0e60d7d2e68ba1fc49739d7cf40"}, + {file = "pydantic_core-2.50.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9eff570402175c7d5fff8497d5a9c05580664a79bb66c07b8f205d17f69e580b"}, + {file = "pydantic_core-2.50.2-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:240fec32a74af0979f7253532859b3fd209ad5eea822416bb010929dba445c3d"}, + {file = "pydantic_core-2.50.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92acf02c770b9d5c4e9a3e8d64e9d95ae26456a86ebb7b7cf64a97f899e5871b"}, + {file = "pydantic_core-2.50.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:1ac5b99bc7b0a68ec64f5f75a6828a7bab5535c8df0cdc07901deb50e0815910"}, + {file = "pydantic_core-2.50.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:713d7c33c0e231e3786eb0ec95885814dd65d5f3a09754399b6acbf5e9365f11"}, + {file = "pydantic_core-2.50.2-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:61e13100b30d8d25fc0d1f0297014b32941bf0975a3584bd08f3adebb68d1ead"}, + {file = "pydantic_core-2.50.2-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:523fe6574aea50f456cbc301c1cdddcbf237939f7657f9af99b4f0f71942b59c"}, + {file = "pydantic_core-2.50.2-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:6c25b8826be85714b27dafe908d3461e1b09e3e31c0279a7029040c832c781ef"}, + {file = "pydantic_core-2.50.2-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:a59db03b80a156a6fbeae41096866d1cb89cdf31031ba44c768a804538880636"}, + {file = "pydantic_core-2.50.2-cp314-cp314t-win32.whl", hash = "sha256:0d090ae76d5b09c003600c7779b3adcf3d1b49268f616c5c51d844e54c8e318d"}, + {file = "pydantic_core-2.50.2-cp314-cp314t-win_amd64.whl", hash = "sha256:9b01a092955c1c7530196ad526755cff4f2d11f37ca9a6fc9ebe37ca49a48977"}, + {file = "pydantic_core-2.50.2-cp314-cp314t-win_arm64.whl", hash = "sha256:4ea01f30e119f1ec7a2034e85c40f491d469896aef02cd6436fd9292fe1be3fb"}, + {file = "pydantic_core-2.50.2-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:a3317630e2791f56071b82f89bb71624146125e4311e6643f708c6ba744b5ac5"}, + {file = "pydantic_core-2.50.2-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:f73930dacad5e611fe019e18df6f53c30629b1843d038d303b8dec86a32493bd"}, + {file = "pydantic_core-2.50.2-cp315-cp315-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:e2e6240a0a5ad847017b3d65187877fdb7a11d5a58d43c30736f9f523478913b"}, + {file = "pydantic_core-2.50.2-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1fdf5b52ed22f1404c2433d0b46df2d86d9befb742d0b9b4042a2325c43cdb97"}, + {file = "pydantic_core-2.50.2-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:4e9392ddf67fe97ab9889f796d468c9908a8754b8b6c7520eb03a65012b9a1e7"}, + {file = "pydantic_core-2.50.2-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:48e944091b7bff233920bed8a60b0ed6c96c73d3c5836bf51c4b9a4bfb58e4ca"}, + {file = "pydantic_core-2.50.2-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:91c92856b846aa690ea6239ffd6c5003c5e3e296a69095570bf4efee5bfa0bdc"}, + {file = "pydantic_core-2.50.2-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5299296ff5cafcb69851fd652de8f9268a0bb036bcbedbfcaa94cf743baf3986"}, + {file = "pydantic_core-2.50.2-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:d3d049b557875f9d15230eec8a731749a7a873d8ed6a051903b05bdf46e0e65f"}, + {file = "pydantic_core-2.50.2-cp315-cp315-musllinux_1_1_aarch64.whl", hash = "sha256:b0b25d647036972c2951059046cb498f72b7af5a2def27bf8e5f44c3067ab7dd"}, + {file = "pydantic_core-2.50.2-cp315-cp315-musllinux_1_1_armv7l.whl", hash = "sha256:8835566b3e94026da3ce2249f9ee35c9d2ebe4cd131f6a39bfc82708d3010a46"}, + {file = "pydantic_core-2.50.2-cp315-cp315-musllinux_1_1_x86_64.whl", hash = "sha256:3fbcd402e4b607d4b8de5d4591215f31f042af03f9d09e58f693a6221e32833f"}, + {file = "pydantic_core-2.50.2-cp315-cp315-win32.whl", hash = "sha256:8431ecb131489cbdaf6f51f7ade47475f73aff4f1912552f75ba19a6cfe233a8"}, + {file = "pydantic_core-2.50.2-cp315-cp315-win_amd64.whl", hash = "sha256:04cf672960b8c4fc28bb159c8cdd101fbd311c520237a5c0360448b851adfb41"}, + {file = "pydantic_core-2.50.2-cp315-cp315-win_arm64.whl", hash = "sha256:36917e29c0b815d6b940bc91560fcf453b5b85d55c579796373f0ea11d1c111a"}, + {file = "pydantic_core-2.50.2-cp315-cp315t-macosx_10_12_x86_64.whl", hash = "sha256:bd1fe69056a19c377a6c6de2c1240fb8676ba0512a969965efb486510c5e0f1f"}, + {file = "pydantic_core-2.50.2-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:9b2383933b1dd7a8c93e02f99ebfd305f1286057172483b8e6898bed3fef69d3"}, + {file = "pydantic_core-2.50.2-cp315-cp315t-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:a1b4d60bad57d6e0e7cd30cc4d1dc646d258dd6dfb7935ce76c7dd72dd1e98b0"}, + {file = "pydantic_core-2.50.2-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:93bedc68c4138088ea3c042189c01d2945f530f0dcc36e1ea02df8418bd4f1cd"}, + {file = "pydantic_core-2.50.2-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:d684ff87d00de2f6abcbbfa9b0fdce8b513dd799a900809dcfa7eb62ad69832a"}, + {file = "pydantic_core-2.50.2-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:bb6d49f00e2babd40af4889d6b9f4bf50879f522dd4e2e22cb705cac5e0c5e8e"}, + {file = "pydantic_core-2.50.2-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:6d47b2d0e00e030e0ebdb08115a37da7294e7a6d196d134a77ed7ee6c142284b"}, + {file = "pydantic_core-2.50.2-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:95838be125133fa314753f8cc5168f7c41e3a9dd5eef5383dbbbeed511bd4853"}, + {file = "pydantic_core-2.50.2-cp315-cp315t-manylinux_2_31_riscv64.whl", hash = "sha256:2d4a043c820363359e40ac96270e1915e5376e116be1f59cee0701775de3e376"}, + {file = "pydantic_core-2.50.2-cp315-cp315t-musllinux_1_1_aarch64.whl", hash = "sha256:57bccd3e1128736c792094da1feac6da46ec3feb1957ef649a9b3e4f8de6fa04"}, + {file = "pydantic_core-2.50.2-cp315-cp315t-musllinux_1_1_armv7l.whl", hash = "sha256:24120c644322a35b5eb765416ac8442214c45689e255f5fc6e761e7e7c743c8b"}, + {file = "pydantic_core-2.50.2-cp315-cp315t-musllinux_1_1_x86_64.whl", hash = "sha256:b1adf2f37521b578c438f6ec61d1c1d0c20b076863ddd5d8b6f3ab658857db3f"}, + {file = "pydantic_core-2.50.2-cp315-cp315t-win32.whl", hash = "sha256:d79aaa468193c1bed6b0560d3c5c9f9e369e3efb0b128b38a2537e2d51d42773"}, + {file = "pydantic_core-2.50.2-cp315-cp315t-win_amd64.whl", hash = "sha256:cc488daac19e6f5292180fac5e0ef7efffabeef4e096af9a17a75a7d3d6781f6"}, + {file = "pydantic_core-2.50.2-cp315-cp315t-win_arm64.whl", hash = "sha256:91315aea7adb51821d4a3378ede953bfdd76e3bf71551de4a82d7638cef7dc02"}, + {file = "pydantic_core-2.50.2-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:adec010c824290d4ca87047e8d8bfa4f85ac29f545f326cd5321696805d311ed"}, + {file = "pydantic_core-2.50.2-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:f47c1349c3b4274aeb18459d54244881a5c0dee0fdccedffca45704ba5c9e0a0"}, + {file = "pydantic_core-2.50.2-graalpy311-graalpy242_311_native-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4ee64baeab403b9de9c92846c5c1abec28ffb046cbc023bfae059897841f88af"}, + {file = "pydantic_core-2.50.2-graalpy311-graalpy242_311_native-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:16ec8e07c37f02dcf68939cc7f202ba9a148cc155ee2acf22d337e10b24c2cb7"}, + {file = "pydantic_core-2.50.2-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:d18d56c1ec63b304f4bb3c7db7e0d311e61cca1b1c944590a4b13ac39b2ca92b"}, + {file = "pydantic_core-2.50.2-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:41ed8abeffda6a880207fdc0cd1343a448cec3cc6b38b53f730c0745f745292d"}, + {file = "pydantic_core-2.50.2-graalpy312-graalpy250_312_native-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b7abcfaf66c1dc14c5ed928c349614f223c972a8b021b4be9548dbea6c817371"}, + {file = "pydantic_core-2.50.2-graalpy312-graalpy250_312_native-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9e7460abce637f90e37f8c443559fbd687c38884d05cb69ef265e634945f4324"}, + {file = "pydantic_core-2.50.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b583ddeee6a6bb5bbc04462167c68034913221139d52d9f155ca6d1637a2fdcf"}, + {file = "pydantic_core-2.50.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:5ab5738c39b25b5dc5a721270e2269a2f5e86e614375e6c07ee6caab8cbc0f2f"}, + {file = "pydantic_core-2.50.2-pp311-pypy311_pp73-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:21a902e546032c82b7275552345a2342d862e0541aea7226c91067c396e68b3f"}, + {file = "pydantic_core-2.50.2-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:92ada606285dab054e40848a951f583c537cde1e54701ea1305ec0096877012d"}, + {file = "pydantic_core-2.50.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c1b65a42afc73b39e6ae908ec7b9c3b9898676a7b15ce4c66d4965f7071007c8"}, + {file = "pydantic_core-2.50.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:c324a7e0c0012e3974053f81a270d8f1aa23227571f4ddd3254c911bb356459b"}, + {file = "pydantic_core-2.50.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:cb8d2d7b07cbe2d7488de7e53671f836c4f4a8032dcda079df33dc1b7e2397c0"}, + {file = "pydantic_core-2.50.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:7c6e1bd6cadae13958e52897ef020e85c9916a95917149fca463bb0c0421a7c6"}, + {file = "pydantic_core-2.50.2-pp311-pypy311_pp80-macosx_10_12_x86_64.whl", hash = "sha256:f078e276848bc23d1f92f46fc88d5b9cbb824b9acc60d9e07116620e502e16a9"}, + {file = "pydantic_core-2.50.2-pp311-pypy311_pp80-macosx_11_0_arm64.whl", hash = "sha256:3435c443da7510a6de1a30c68beae338852a11f0440cc8320ea756a162f38dbe"}, + {file = "pydantic_core-2.50.2-pp311-pypy311_pp80-manylinux_2_28_x86_64.whl", hash = "sha256:b5675a12a7b67063fe3ca187e735b0463cf13fabc10166ae4d4b2f775fd0632d"}, + {file = "pydantic_core-2.50.2-pp311-pypy311_pp80-win_amd64.whl", hash = "sha256:f5ba7ef10ce82737e173fa95cafa1c8210918f7e653715b2c7a7a31877a74848"}, + {file = "pydantic_core-2.50.2.tar.gz", hash = "sha256:1b0e8dc3932cf4e9ed5727570325cacc716b9409ffc794a221c0ccc72e8eb775"}, ] [package.dependencies] @@ -1203,43 +1207,43 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pytest" -version = "9.1.1" +version = "9.2.0" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c"}, - {file = "pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313"}, + {file = "pytest-9.2.0-py3-none-any.whl", hash = "sha256:07acdcf88ec174f907dc01af70bf52d49b014bbab03faeeade31c96b18c2e588"}, + {file = "pytest-9.2.0.tar.gz", hash = "sha256:97c4f3b1f3c7414aa36465e09b8220f1d03627993bd51b1282e193753c80557b"}, ] [package.dependencies] colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1", markers = "python_version < \"3.11\""} -iniconfig = ">=1.0.1" -packaging = ">=22" -pluggy = ">=1.5,<2" -pygments = ">=2.7.2" -tomli = {version = ">=1", markers = "python_version < \"3.11\""} +iniconfig = ">=2" +packaging = ">=24" +pluggy = ">=1.6,<2" +pygments = ">=2.15" +tomli = {version = ">=2", markers = "python_version < \"3.11\""} [package.extras] -dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"] +dev = ["argcomplete", "asynctest ; python_version < \"3.11\"", "attrs (>=23.1)", "coverage (>=7.5)", "hypothesis (>=6.75)", "mock", "numpy (>=1.26)", "pexpect (>=4.9)", "pytest-xdist (>=3.5)", "pyyaml", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-asyncio" -version = "1.4.0" +version = "1.4.1.post1" description = "Pytest support for asyncio" optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "pytest_asyncio-1.4.0-py3-none-any.whl", hash = "sha256:933ca923a23075a87fb7070c0ec272a6848489824d887c85c812670932835aa1"}, - {file = "pytest_asyncio-1.4.0.tar.gz", hash = "sha256:c6c0d2259945122819f171a32ecea2c349ead889ee28176caaf492143424be42"}, + {file = "pytest_asyncio-1.4.1.post1-py3-none-any.whl", hash = "sha256:0755e488cc0a2b9bd2eab7292cc6390d4cbb8390f1020745647bae5a708e0165"}, + {file = "pytest_asyncio-1.4.1.post1.tar.gz", hash = "sha256:f582d9ea4a1c082195abe8bd29a1fe106aeb1cd435e3dad2d3bc2749935c36a2"}, ] [package.dependencies] backports-asyncio-runner = {version = ">=1.1,<2", markers = "python_version < \"3.11\""} -pytest = ">=8.4,<10" +pytest = ">=8.4" typing-extensions = {version = ">=4.12", markers = "python_version < \"3.13\""} [package.extras] @@ -1400,14 +1404,14 @@ files = [ [[package]] name = "types-python-dateutil" -version = "2.9.0.20260807" +version = "2.9.0.20261029" description = "Typing stubs for python-dateutil" optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "types_python_dateutil-2.9.0.20260807-py3-none-any.whl", hash = "sha256:54aa3707350ed7a9cc0776fd2f6739679d6967d11b40150985e81edcb86df4db"}, - {file = "types_python_dateutil-2.9.0.20260807.tar.gz", hash = "sha256:e0b8a90d464c8684c66b7b8e4556d9074afdddcc56ca45323f0987134f9e7034"}, + {file = "types_python_dateutil-2.9.0.20261029-py3-none-any.whl", hash = "sha256:8fd04c6e1722d2523a74d6670596fc0007077651465b686f144ae1d200dcacf5"}, + {file = "types_python_dateutil-2.9.0.20261029.tar.gz", hash = "sha256:3258b491686c441d8074cfc8712308741900c9ff128a06421baec3767c503511"}, ] [[package]] diff --git a/pyproject.toml b/pyproject.toml index e92a3902..d5fe3bed 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,11 +1,11 @@ [project] name = "zep-cloud" dynamic = ["version"] -version = "4.0.1" +version = "4.1.0" [tool.poetry] name = "zep-cloud" -version = "4.0.1" +version = "4.1.0" description = "The Python SDK for Zep, the context layer for AI agents." readme = "README.md" authors = [] diff --git a/reference.md b/reference.md index 936dc0ac..6faff97f 100644 --- a/reference.md +++ b/reference.md @@ -1771,7 +1771,7 @@ client.graph.lookup()
-Experimental. Retrieves the graph records for a natural-language question about a graph with a read-only retrieval loop. By default, the response has the retrieved records and no answer. Set `generate_answer` to `true` to also get an answer that a model writes from the records, with the cited graph items. Set `stream` to `true` to get the retrieval calls as server-sent events. The default mode is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. A project with a BYOM configuration supports only deep. A BYOC deployment supports only deep. The operation is experimental and in closed release. Zep enables the operation only for select accounts. The request, the response, the events, and the modes of the operation can change. A request from an account without access returns `404 not_found`. To get access, contact support@getzep.com. +Experimental. Retrieves the graph records for a natural-language question about a graph with a read-only retrieval loop. By default, the response has the retrieved records and no answer. Set `generate_answer` to `true` to also get an answer that a model writes from the records, with the cited graph items. Set `stream` to `true` to get the retrieval calls as server-sent events. The default mode is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. BYOM and BYOC projects can use fast mode when they have a configured decision model. Other projects can use fast mode without a decision model. BYOM and BYOC projects without a decision model must use deep mode. The operation is experimental and in closed release. Zep enables the operation only for select accounts. The request, the response, the events, and the modes of the operation can change. A request from an account without access returns `404 not_found`. To get access, contact support@getzep.com.
@@ -1858,7 +1858,7 @@ The default is false: the response has the records and no answer.
-**mode:** `typing.Optional[GraphQueryRequestMode]` — The retrieval mode. The default is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. A project with a BYOM configuration supports only deep. A BYOC deployment supports only deep. +**mode:** `typing.Optional[GraphQueryRequestMode]` — The retrieval mode. The default is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. A BYOM project or BYOC deployment also needs a SystemOne decision model for fast. deep: A model plans its own searches. It can page through complete lists and read more records before it answers.
@@ -1890,7 +1890,7 @@ The default is false: the response has the records and no answer.
-Experimental. Retrieves the graph records for a natural-language question about a graph with a read-only retrieval loop. By default, the response has the retrieved records and no answer. Set `generate_answer` to `true` to also get an answer that a model writes from the records, with the cited graph items. Set `stream` to `true` to get the retrieval calls as server-sent events. The default mode is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. A project with a BYOM configuration supports only deep. A BYOC deployment supports only deep. The operation is experimental and in closed release. Zep enables the operation only for select accounts. The request, the response, the events, and the modes of the operation can change. A request from an account without access returns `404 not_found`. To get access, contact support@getzep.com. +Experimental. Retrieves the graph records for a natural-language question about a graph with a read-only retrieval loop. By default, the response has the retrieved records and no answer. Set `generate_answer` to `true` to also get an answer that a model writes from the records, with the cited graph items. Set `stream` to `true` to get the retrieval calls as server-sent events. The default mode is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. BYOM and BYOC projects can use fast mode when they have a configured decision model. Other projects can use fast mode without a decision model. BYOM and BYOC projects without a decision model must use deep mode. The operation is experimental and in closed release. Zep enables the operation only for select accounts. The request, the response, the events, and the modes of the operation can change. A request from an account without access returns `404 not_found`. To get access, contact support@getzep.com.
@@ -1977,7 +1977,7 @@ The default is false: the response has the records and no answer.
-**mode:** `typing.Optional[GraphQueryRequestMode]` — The retrieval mode. The default is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. A project with a BYOM configuration supports only deep. A BYOC deployment supports only deep. +**mode:** `typing.Optional[GraphQueryRequestMode]` — The retrieval mode. The default is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. A BYOM project or BYOC deployment also needs a SystemOne decision model for fast. deep: A model plans its own searches. It can page through complete lists and read more records before it answers.
@@ -2671,6 +2671,95 @@ client.graph.set_instructions( + + + + +
client.graph.list_metadata_keys(...) -> GraphMetadataKeyList +
+
+ +#### 📝 Description + +
+
+ +
+
+ +Returns the append-only metadata keys recorded for a graph. A key can remain in the list after no episode or message uses it. +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from zep_cloud import Zep +from zep_cloud.environment import ZepEnvironment + +client = Zep( + api_key="", + environment=ZepEnvironment.DEFAULT, +) + +client.graph.list_metadata_keys( + graph_uuid="graph_uuid", +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**graph_uuid:** `str` — The UUID of the graph. For a user graph, you can also use the UUID of the user. + +
+
+ +
+
+ +**page_size:** `typing.Optional[int]` — The maximum number of keys per page. + +
+
+ +
+
+ +**cursor:** `typing.Optional[str]` — Opaque page cursor + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ +
@@ -7298,6 +7387,85 @@ cannot be changed after creation. + + + + +
client.user.get_by_email(...) -> User +
+
+ +#### 📝 Description + +
+
+ +
+
+ +Send `{"email": "jane@example.com"}` to get the user with this email. +An email matches only when the stored and requested values are equal after normalization. +Normalization lowercases both values and trims leading and trailing whitespace. +The operation returns `404 not_found` when no active user matches. +The operation returns `400 invalid_request` with `param: "email"` when multiple active users match. +The operation returns `400 invalid_request` with `param: "email"` when BYOK is active for the account. +An email that was stored encrypted with BYOK does not match. +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from zep_cloud import Zep +from zep_cloud.environment import ZepEnvironment + +client = Zep( + api_key="", + environment=ZepEnvironment.DEFAULT, +) + +client.user.get_by_email( + email="jane@example.com", +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**email:** `str` — The user's email address. Matching ignores case and leading and trailing whitespace. + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ +
@@ -8581,7 +8749,7 @@ client.agent.skill.search(
-**query:** `str` — The developer supplies a search query for Skills. +**query:** `str` — The developer supplies a search query for Skills. A term is a sequence of characters between whitespace. When the query has more than 64 terms, Zep searches with the first 64 terms and ignores the other terms. The query must not be longer than 512 bytes.
@@ -14198,11 +14366,26 @@ names the filter fields that the operation does not support. -## Graph Episode -
client.graph.episode.list_for_document(...) -> EpisodePage +## Graph Edge +
client.graph.edge.add(...) -> AddEdgesResult +
+
+ +#### 📝 Description + +
+
+
+Adds 1 to 100 edges. A name creates a node when deduplicate is false. When deduplicate is true, Zep matches a node by name first. +Example: {"edges":[{"fact":"Ada works at Acme Corp","fact_name":"WORKS_AT","source_node":{"uuid":"f47ac10b-58cc-4372-a567-0e02b2c3d479"},"target_node":{"uuid":"f47ac10b-58cc-4372-a567-0e02b2c3d480"}},{"fact":"Ada leads a team","fact_name":"LEADS","source_node":{"name":"Ada Lovelace","labels":["Person"]},"target_node":{"name":"Engineering","labels":["Department"]}}],"deduplicate":false} +
+
+
+
+ #### 🔌 Usage
@@ -14212,7 +14395,7 @@ names the filter fields that the operation does not support.
```python -from zep_cloud import Zep +from zep_cloud import Zep, EdgeInput, EdgeNodeRef from zep_cloud.environment import ZepEnvironment client = Zep( @@ -14220,9 +14403,16 @@ client = Zep( environment=ZepEnvironment.DEFAULT, ) -client.graph.episode.list_for_document( +client.graph.edge.add( graph_uuid="graph_uuid", - document_id="document_id", + edges=[ + EdgeInput( + fact="Ada works at Acme Corp", + fact_name="WORKS_AT", + source_node=EdgeNodeRef(), + target_node=EdgeNodeRef(), + ) + ], ) ``` @@ -14247,7 +14437,7 @@ client.graph.episode.list_for_document(
-**document_id:** `str` — Document ID +**edges:** `typing.List[EdgeInput]` — The edges to add to the graph. The request accepts 1 to 100 edges.
@@ -14255,15 +14445,11 @@ client.graph.episode.list_for_document(
-**page_size:** `typing.Optional[int]` — The maximum number of items in one page. The SDK method returns a pager. In Python, `.items` holds only the first page. In TypeScript, `.data` holds only the first page. To read every page, iterate the pager: use `for` or `list(...)` in Python, or `for await` in TypeScript. In Go, the method returns one page, and `Iterator()` reads all pages. - -
-
- -
-
+**deduplicate:** `typing.Optional[bool]` -**cursor:** `typing.Optional[str]` — Opaque page cursor +When true, Zep compares each edge with graph edges and can merge a +duplicate or invalidate a contradicted edge. This adds an LLM call per +edge. The default is false.
@@ -14283,10 +14469,27 @@ client.graph.episode.list_for_document(
-
client.graph.episode.add(...) -> AddEpisodeResult +
client.graph.edge.list(...) -> EdgePage +
+
+ +#### 📝 Description + +
+
+
+Lists the edges of a graph and returns one page of results. The default `page_size` is 50, and the maximum `page_size` is 100. +You can sort by `uuid`, `created_at`, or `valid_at`. The default sort is `uuid` in descending order. An edge with no `valid_at` sorts as if its `valid_at` is 1970-01-01T00:00:00Z. Thus it comes before an edge with a later `valid_at` in ascending order, and after an edge with an earlier `valid_at`. +You can use all `filters` fields except `content_policy_violated`. +If the request has an unsupported or unknown filter field, the API returns an `unsupported_filter` error. +
+
+
+
+ #### 🔌 Usage
@@ -14304,9 +14507,8 @@ client = Zep( environment=ZepEnvironment.DEFAULT, ) -client.graph.episode.add( +client.graph.edge.list( graph_uuid="graph_uuid", - data="data", ) ``` @@ -14331,15 +14533,7 @@ client.graph.episode.add(
-**data:** `str` — The episode content to add to the graph. - -
-
- -
-
- -**document_id:** `typing.Optional[str]` — Groups this episode as a chunk of a document on the graph. +**page_size:** `typing.Optional[int]` — The maximum number of items in one page. The SDK method returns a pager. In Python, `.items` holds only the first page. In TypeScript, `.data` holds only the first page. To read every page, iterate the pager: use `for` or `list(...)` in Python, or `for await` in TypeScript. In Go, the method returns one page, and `Iterator()` reads all pages.
@@ -14347,7 +14541,7 @@ client.graph.episode.add(
-**metadata:** `typing.Optional[typing.Dict[str, typing.Any]]` — Metadata to store on the episode. Max 10 keys. Values must be strings, numbers, booleans, or arrays of scalars. +**cursor:** `typing.Optional[str]` — Opaque page cursor
@@ -14355,10 +14549,7 @@ client.graph.episode.add(
-**reference_time:** `typing.Optional[str]` - -The episode's reference time, used for temporal reasoning rather than -ingestion time. Defaults to the ingestion time. +**order_by:** `typing.Optional[EdgeListRequestOrderBy]` — Sort key: uuid (default), created_at, or valid_at
@@ -14366,7 +14557,7 @@ ingestion time. Defaults to the ingestion time.
-**source_description:** `typing.Optional[str]` — A description of the source of this episode. +**order:** `typing.Optional[EdgeListRequestOrder]` — Sort direction: asc or desc (default desc)
@@ -14374,18 +14565,10 @@ ingestion time. Defaults to the ingestion time.
-**strict_ontology:** `typing.Optional[bool]` - -When true, prevents extraction of generic entity nodes that do not match -the configured ontology. - -
-
- -
-
+**filters:** `typing.Optional[EdgeListFilters]` -**type:** `typing.Optional[AddEpisodeRequestType]` — The data format of the episode: text, json, or message. Defaults to text. +Filters that limit the items in the list. The operation description +names the filter fields that the operation does not support.
@@ -14405,30 +14588,11 @@ the configured ontology.
-
client.graph.episode.list(...) -> EpisodePage +
client.graph.edge.get(...) -> Edge
-#### 📝 Description - -
-
- -
-
- -Lists the episodes of a graph. `filters.mentioned_node_uuids` restricts -the results to episodes that mention any of the listed node UUIDs. The -list can also contain episode UUIDs: an episode UUID matches that episode, -so one request can return a known set of episodes. At most 256 entries. -`filters.metadata_filters` restricts the results to episodes whose stored -metadata matches the predicate. -
-
-
-
- -#### 🔌 Usage +#### 🔌 Usage
@@ -14445,8 +14609,9 @@ client = Zep( environment=ZepEnvironment.DEFAULT, ) -client.graph.episode.list( +client.graph.edge.get( graph_uuid="graph_uuid", + edge_uuid="edge_uuid", ) ``` @@ -14471,39 +14636,7 @@ client.graph.episode.list(
-**page_size:** `typing.Optional[int]` — The maximum number of items in one page. The SDK method returns a pager. In Python, `.items` holds only the first page. In TypeScript, `.data` holds only the first page. To read every page, iterate the pager: use `for` or `list(...)` in Python, or `for await` in TypeScript. In Go, the method returns one page, and `Iterator()` reads all pages. - -
-
- -
-
- -**cursor:** `typing.Optional[str]` — Opaque page cursor - -
-
- -
-
- -**order_by:** `typing.Optional[EpisodeListRequestOrderBy]` — Sort field - -
-
- -
-
- -**order:** `typing.Optional[EpisodeListRequestOrder]` — Sort direction: asc or desc - -
-
- -
-
- -**filters:** `typing.Optional[EpisodeListFilters]` — Filters that limit the episodes in the list. +**edge_uuid:** `str` — Edge UUID
@@ -14523,7 +14656,7 @@ client.graph.episode.list(
-
client.graph.episode.get(...) -> Episode +
client.graph.edge.delete(...) -> AsyncResult
@@ -14544,9 +14677,9 @@ client = Zep( environment=ZepEnvironment.DEFAULT, ) -client.graph.episode.get( +client.graph.edge.delete( graph_uuid="graph_uuid", - episode_uuid="episode_uuid", + edge_uuid="edge_uuid", ) ``` @@ -14571,7 +14704,7 @@ client.graph.episode.get(
-**episode_uuid:** `str` — Episode UUID +**edge_uuid:** `str` — Edge UUID
@@ -14591,10 +14724,27 @@ client.graph.episode.get(
-
client.graph.episode.delete(...) -> AsyncResult +
client.graph.edge.update(...) -> Edge +
+
+ +#### 📝 Description + +
+
+
+Updates one edge. When the edge belongs to a hyperedge, changing fact +rewrites it on every member of that hyperedge in one all-or-nothing +write, because the members share it. Attribute-only edits touch this +edge alone. +
+
+
+
+ #### 🔌 Usage
@@ -14612,9 +14762,9 @@ client = Zep( environment=ZepEnvironment.DEFAULT, ) -client.graph.episode.delete( +client.graph.edge.update( graph_uuid="graph_uuid", - episode_uuid="episode_uuid", + edge_uuid="edge_uuid", ) ``` @@ -14639,7 +14789,29 @@ client.graph.episode.delete(
-**episode_uuid:** `str` — Episode UUID +**edge_uuid:** `str` — Edge UUID + +
+
+ +
+
+ +**attributes:** `typing.Optional[typing.Dict[str, typing.Any]]` + +Additional attributes to merge onto the edge; a key set to null is +removed. + +
+
+ +
+
+ +**fact:** `typing.Optional[str]` + +The fact text describing the relationship between the source and target +nodes.
@@ -14659,7 +14831,8 @@ client.graph.episode.delete(
-
client.graph.episode.update(...) -> Episode +## Graph Episode +
client.graph.episode.add(...) -> AddEpisodeResult
@@ -14680,9 +14853,9 @@ client = Zep( environment=ZepEnvironment.DEFAULT, ) -client.graph.episode.update( +client.graph.episode.add( graph_uuid="graph_uuid", - episode_uuid="episode_uuid", + data="data", ) ``` @@ -14707,7 +14880,7 @@ client.graph.episode.update(
-**episode_uuid:** `str` — Episode UUID +**data:** `str` — The episode content to add to the graph.
@@ -14715,7 +14888,7 @@ client.graph.episode.update(
-**metadata:** `typing.Optional[typing.Dict[str, typing.Any]]` — Metadata to merge onto the episode; a key set to null is removed. Max 10 keys after the merge. Values must be strings, numbers, booleans, or arrays of scalars. +**document_id:** `typing.Optional[str]` — Groups this episode as a chunk of a document on the graph.
@@ -14723,73 +14896,37 @@ client.graph.episode.update(
-**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. +**metadata:** `typing.Optional[typing.Dict[str, typing.Any]]` — Metadata to store on the episode. Max 10 keys. Values must be strings, numbers, booleans, or arrays of scalars.
-
-
- - - - -
-
client.graph.episode.get_debug_logs(...) -> EpisodeDebugLog
-#### 📝 Description - -
-
- -
-
+**reference_time:** `typing.Optional[str]` -Returns the ingestion workflow log of an episode. The log exists only when debug logging was enabled for the project when the episode was ingested (see `debug_log.enable`). The log holds episode content, so an API key with an ABAC policy needs an explicit grant of this action; the `readonly` macro does not grant it. -
-
+The episode's reference time, used for temporal reasoning rather than +ingestion time. Defaults to the ingestion time. +
-#### 🔌 Usage - -
-
-
-```python -from zep_cloud import Zep -from zep_cloud.environment import ZepEnvironment - -client = Zep( - api_key="", - environment=ZepEnvironment.DEFAULT, -) - -client.graph.episode.get_debug_logs( - graph_uuid="graph_uuid", - episode_uuid="episode_uuid", -) - -``` -
-
+**source_description:** `typing.Optional[str]` — A description of the source of this episode. +
-#### ⚙️ Parameters -
-
-
+**strict_ontology:** `typing.Optional[bool]` -**graph_uuid:** `str` — The UUID of the graph. For a user graph, you can also use the UUID of the user. +When true, prevents extraction of generic entity nodes that do not match +the configured ontology.
@@ -14797,7 +14934,7 @@ client.graph.episode.get_debug_logs(
-**episode_uuid:** `str` — Episode UUID +**type:** `typing.Optional[AddEpisodeRequestType]` — The data format of the episode: text, json, or message. Defaults to text.
@@ -14817,7 +14954,7 @@ client.graph.episode.get_debug_logs(
-
client.graph.episode.list_ingestion_traces(...) -> IngestionTracePage +
client.graph.episode.list(...) -> EpisodePage
@@ -14829,7 +14966,15 @@ client.graph.episode.get_debug_logs(
-Returns the ingestion traces of an episode, oldest first. Each trace records the input and the output of one ingestion step, with an explanation on each output entry that has one. Traces exist only when ingestion tracing was enabled for the project when the episode was ingested (see `debug_log.enable`). An episode with no traces returns a page with an empty `items` array. Traces hold episode content, prompt input, and model output, so an API key with an ABAC policy needs an explicit grant of this action; the `readonly` macro does not grant it. +Lists the episodes of a graph. `filters.mentioned_node_uuids` restricts +the results to episodes that mention any of the listed node UUIDs. The +list can also contain episode UUIDs: an episode UUID matches that episode, +so one request can return a known set of episodes. At most 256 entries. +`filters.metadata_filters` restricts the results to episodes whose stored +metadata matches the predicate. `filters.document_id` restricts the results +to the episodes of one document. + +Example body: `{"filters": {"document_id": "gdrive.test-folder.weird-document"}}`
@@ -14852,9 +14997,8 @@ client = Zep( environment=ZepEnvironment.DEFAULT, ) -client.graph.episode.list_ingestion_traces( +client.graph.episode.list( graph_uuid="graph_uuid", - episode_uuid="episode_uuid", ) ``` @@ -14879,7 +15023,7 @@ client.graph.episode.list_ingestion_traces(
-**episode_uuid:** `str` — Episode UUID +**page_size:** `typing.Optional[int]` — The maximum number of items in one page. The SDK method returns a pager. In Python, `.items` holds only the first page. In TypeScript, `.data` holds only the first page. To read every page, iterate the pager: use `for` or `list(...)` in Python, or `for await` in TypeScript. In Go, the method returns one page, and `Iterator()` reads all pages.
@@ -14887,7 +15031,7 @@ client.graph.episode.list_ingestion_traces(
-**page_size:** `typing.Optional[int]` — The maximum number of items in one page. The SDK method returns a pager. In Python, `.items` holds only the first page. In TypeScript, `.data` holds only the first page. To read every page, iterate the pager: use `for` or `list(...)` in Python, or `for await` in TypeScript. In Go, the method returns one page, and `Iterator()` reads all pages. +**cursor:** `typing.Optional[str]` — Opaque page cursor
@@ -14895,7 +15039,7 @@ client.graph.episode.list_ingestion_traces(
-**cursor:** `typing.Optional[str]` — Opaque page cursor +**order_by:** `typing.Optional[EpisodeListRequestOrderBy]` — Sort field
@@ -14903,37 +15047,37 @@ client.graph.episode.list_ingestion_traces(
-**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. +**order:** `typing.Optional[EpisodeListRequestOrder]` — Sort direction: asc or desc
- -
- - - -
- -## Graph Edge -
client.graph.edge.add(...) -> AddEdgesResult
-#### 📝 Description - -
-
+**filters:** `typing.Optional[EpisodeListFilters]` — Filters that limit the episodes in the list. + +
+
-Adds 1 to 100 edges. A name creates a node when deduplicate is false. When deduplicate is true, Zep matches a node by name first. -Example: {"edges":[{"fact":"Ada works at Acme Corp","fact_name":"WORKS_AT","source_node":{"uuid":"f47ac10b-58cc-4372-a567-0e02b2c3d479"},"target_node":{"uuid":"f47ac10b-58cc-4372-a567-0e02b2c3d480"}},{"fact":"Ada leads a team","fact_name":"LEADS","source_node":{"name":"Ada Lovelace","labels":["Person"]},"target_node":{"name":"Engineering","labels":["Department"]}}],"deduplicate":false} +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+ + +
+ +
client.graph.episode.get(...) -> Episode +
+
#### 🔌 Usage @@ -14944,7 +15088,7 @@ Example: {"edges":[{"fact":"Ada works at Acme Corp","fact_name":"WORKS_AT","sour
```python -from zep_cloud import Zep, EdgeInput, EdgeNodeRef +from zep_cloud import Zep from zep_cloud.environment import ZepEnvironment client = Zep( @@ -14952,16 +15096,9 @@ client = Zep( environment=ZepEnvironment.DEFAULT, ) -client.graph.edge.add( +client.graph.episode.get( graph_uuid="graph_uuid", - edges=[ - EdgeInput( - fact="Ada works at Acme Corp", - fact_name="WORKS_AT", - source_node=EdgeNodeRef(), - target_node=EdgeNodeRef(), - ) - ], + episode_uuid="episode_uuid", ) ``` @@ -14986,19 +15123,7 @@ client.graph.edge.add(
-**edges:** `typing.List[EdgeInput]` — The edges to add to the graph. The request accepts 1 to 100 edges. - -
-
- -
-
- -**deduplicate:** `typing.Optional[bool]` - -When true, Zep compares each edge with graph edges and can merge a -duplicate or invalidate a contradicted edge. This adds an LLM call per -edge. The default is false. +**episode_uuid:** `str` — Episode UUID
@@ -15018,27 +15143,10 @@ edge. The default is false.
-
client.graph.edge.list(...) -> EdgePage -
-
- -#### 📝 Description - -
-
- +
client.graph.episode.delete(...) -> AsyncResult
-Lists the edges of a graph and returns one page of results. The default `page_size` is 50, and the maximum `page_size` is 100. -You can sort by `uuid`, `created_at`, or `valid_at`. The default sort is `uuid` in descending order. An edge with no `valid_at` sorts as if its `valid_at` is 1970-01-01T00:00:00Z. Thus it comes before an edge with a later `valid_at` in ascending order, and after an edge with an earlier `valid_at`. -You can use all `filters` fields except `content_policy_violated`. -If the request has an unsupported or unknown filter field, the API returns an `unsupported_filter` error. -
-
-
-
- #### 🔌 Usage
@@ -15056,8 +15164,9 @@ client = Zep( environment=ZepEnvironment.DEFAULT, ) -client.graph.edge.list( +client.graph.episode.delete( graph_uuid="graph_uuid", + episode_uuid="episode_uuid", ) ``` @@ -15082,42 +15191,7 @@ client.graph.edge.list(
-**page_size:** `typing.Optional[int]` — The maximum number of items in one page. The SDK method returns a pager. In Python, `.items` holds only the first page. In TypeScript, `.data` holds only the first page. To read every page, iterate the pager: use `for` or `list(...)` in Python, or `for await` in TypeScript. In Go, the method returns one page, and `Iterator()` reads all pages. - -
-
- -
-
- -**cursor:** `typing.Optional[str]` — Opaque page cursor - -
-
- -
-
- -**order_by:** `typing.Optional[EdgeListRequestOrderBy]` — Sort key: uuid (default), created_at, or valid_at - -
-
- -
-
- -**order:** `typing.Optional[EdgeListRequestOrder]` — Sort direction: asc or desc (default desc) - -
-
- -
-
- -**filters:** `typing.Optional[EdgeListFilters]` - -Filters that limit the items in the list. The operation description -names the filter fields that the operation does not support. +**episode_uuid:** `str` — Episode UUID
@@ -15137,7 +15211,7 @@ names the filter fields that the operation does not support.
-
client.graph.edge.get(...) -> Edge +
client.graph.episode.update(...) -> Episode
@@ -15158,9 +15232,9 @@ client = Zep( environment=ZepEnvironment.DEFAULT, ) -client.graph.edge.get( +client.graph.episode.update( graph_uuid="graph_uuid", - edge_uuid="edge_uuid", + episode_uuid="episode_uuid", ) ``` @@ -15185,7 +15259,15 @@ client.graph.edge.get(
-**edge_uuid:** `str` — Edge UUID +**episode_uuid:** `str` — Episode UUID + +
+
+ +
+
+ +**metadata:** `typing.Optional[typing.Dict[str, typing.Any]]` — Metadata to merge onto the episode; a key set to null is removed. Max 10 keys after the merge. Values must be strings, numbers, booleans, or arrays of scalars.
@@ -15205,10 +15287,24 @@ client.graph.edge.get(
-
client.graph.edge.delete(...) -> AsyncResult +
client.graph.episode.get_debug_logs(...) -> EpisodeDebugLog +
+
+ +#### 📝 Description + +
+
+
+Returns the ingestion workflow log of an episode. The log exists only when debug logging was enabled for the project when the episode was ingested (see `debug_log.enable`). The log holds episode content, so an API key with an ABAC policy needs an explicit grant of this action; the `readonly` macro does not grant it. +
+
+
+
+ #### 🔌 Usage
@@ -15226,9 +15322,9 @@ client = Zep( environment=ZepEnvironment.DEFAULT, ) -client.graph.edge.delete( +client.graph.episode.get_debug_logs( graph_uuid="graph_uuid", - edge_uuid="edge_uuid", + episode_uuid="episode_uuid", ) ``` @@ -15253,7 +15349,7 @@ client.graph.edge.delete(
-**edge_uuid:** `str` — Edge UUID +**episode_uuid:** `str` — Episode UUID
@@ -15273,7 +15369,7 @@ client.graph.edge.delete(
-
client.graph.edge.update(...) -> Edge +
client.graph.episode.list_ingestion_traces(...) -> IngestionTracePage
@@ -15285,10 +15381,7 @@ client.graph.edge.delete(
-Updates one edge. When the edge belongs to a hyperedge, changing fact -rewrites it on every member of that hyperedge in one all-or-nothing -write, because the members share it. Attribute-only edits touch this -edge alone. +Returns the ingestion traces of an episode, oldest first. Each trace records the input and the output of one ingestion step, with an explanation on each output entry that has one. Traces exist only when ingestion tracing was enabled for the project when the episode was ingested (see `debug_log.enable`). An episode with no traces returns a page with an empty `items` array. Traces hold episode content, prompt input, and model output, so an API key with an ABAC policy needs an explicit grant of this action; the `readonly` macro does not grant it.
@@ -15311,9 +15404,9 @@ client = Zep( environment=ZepEnvironment.DEFAULT, ) -client.graph.edge.update( +client.graph.episode.list_ingestion_traces( graph_uuid="graph_uuid", - edge_uuid="edge_uuid", + episode_uuid="episode_uuid", ) ``` @@ -15338,7 +15431,7 @@ client.graph.edge.update(
-**edge_uuid:** `str` — Edge UUID +**episode_uuid:** `str` — Episode UUID
@@ -15346,10 +15439,7 @@ client.graph.edge.update(
-**attributes:** `typing.Optional[typing.Dict[str, typing.Any]]` - -Additional attributes to merge onto the edge; a key set to null is -removed. +**page_size:** `typing.Optional[int]` — The maximum number of items in one page. The SDK method returns a pager. In Python, `.items` holds only the first page. In TypeScript, `.data` holds only the first page. To read every page, iterate the pager: use `for` or `list(...)` in Python, or `for await` in TypeScript. In Go, the method returns one page, and `Iterator()` reads all pages.
@@ -15357,10 +15447,7 @@ removed.
-**fact:** `typing.Optional[str]` - -The fact text describing the relationship between the source and target -nodes. +**cursor:** `typing.Optional[str]` — Opaque page cursor
diff --git a/src/zep_cloud/__init__.py b/src/zep_cloud/__init__.py index d85826fe..e5b5b2ac 100644 --- a/src/zep_cloud/__init__.py +++ b/src/zep_cloud/__init__.py @@ -208,6 +208,8 @@ GraphContextResponse, GraphDataType, GraphDeleteResult, + GraphMetadataKey, + GraphMetadataKeyList, GraphPage, GraphQueryCitations, GraphQueryEdge, @@ -645,6 +647,8 @@ "GraphDeleteResult": ".types", "GraphListRequestOrder": ".graph", "GraphListRequestOrderBy": ".graph", + "GraphMetadataKey": ".types", + "GraphMetadataKeyList": ".types", "GraphPage": ".types", "GraphQueryCitations": ".types", "GraphQueryEdge": ".types", @@ -1091,6 +1095,8 @@ def __dir__(): "GraphDeleteResult", "GraphListRequestOrder", "GraphListRequestOrderBy", + "GraphMetadataKey", + "GraphMetadataKeyList", "GraphPage", "GraphQueryCitations", "GraphQueryEdge", diff --git a/src/zep_cloud/agent/skill/client.py b/src/zep_cloud/agent/skill/client.py index 9d028db1..488c5c28 100644 --- a/src/zep_cloud/agent/skill/client.py +++ b/src/zep_cloud/agent/skill/client.py @@ -240,7 +240,7 @@ def search( Agent UUID query : str - The developer supplies a search query for Skills. + The developer supplies a search query for Skills. A term is a sequence of characters between whitespace. When the query has more than 64 terms, Zep searches with the first 64 terms and ignores the other terms. The query must not be longer than 512 bytes. page_size : typing.Optional[int] The maximum number of items in one page. The SDK method returns a pager. In Python, `.items` holds only the first page. In TypeScript, `.data` holds only the first page. To read every page, iterate the pager: use `for` or `list(...)` in Python, or `for await` in TypeScript. In Go, the method returns one page, and `Iterator()` reads all pages. @@ -807,7 +807,7 @@ async def search( Agent UUID query : str - The developer supplies a search query for Skills. + The developer supplies a search query for Skills. A term is a sequence of characters between whitespace. When the query has more than 64 terms, Zep searches with the first 64 terms and ignores the other terms. The query must not be longer than 512 bytes. page_size : typing.Optional[int] The maximum number of items in one page. The SDK method returns a pager. In Python, `.items` holds only the first page. In TypeScript, `.data` holds only the first page. To read every page, iterate the pager: use `for` or `list(...)` in Python, or `for await` in TypeScript. In Go, the method returns one page, and `Iterator()` reads all pages. diff --git a/src/zep_cloud/agent/skill/raw_client.py b/src/zep_cloud/agent/skill/raw_client.py index 77bb5d00..3120c3e1 100644 --- a/src/zep_cloud/agent/skill/raw_client.py +++ b/src/zep_cloud/agent/skill/raw_client.py @@ -488,7 +488,7 @@ def search( Agent UUID query : str - The developer supplies a search query for Skills. + The developer supplies a search query for Skills. A term is a sequence of characters between whitespace. When the query has more than 64 terms, Zep searches with the first 64 terms and ignores the other terms. The query must not be longer than 512 bytes. page_size : typing.Optional[int] The maximum number of items in one page. The SDK method returns a pager. In Python, `.items` holds only the first page. In TypeScript, `.data` holds only the first page. To read every page, iterate the pager: use `for` or `list(...)` in Python, or `for await` in TypeScript. In Go, the method returns one page, and `Iterator()` reads all pages. @@ -1615,7 +1615,7 @@ async def search( Agent UUID query : str - The developer supplies a search query for Skills. + The developer supplies a search query for Skills. A term is a sequence of characters between whitespace. When the query has more than 64 terms, Zep searches with the first 64 terms and ignores the other terms. The query must not be longer than 512 bytes. page_size : typing.Optional[int] The maximum number of items in one page. The SDK method returns a pager. In Python, `.items` holds only the first page. In TypeScript, `.data` holds only the first page. To read every page, iterate the pager: use `for` or `list(...)` in Python, or `for await` in TypeScript. In Go, the method returns one page, and `Iterator()` reads all pages. diff --git a/src/zep_cloud/core/client_wrapper.py b/src/zep_cloud/core/client_wrapper.py index 226c2a49..d2dca554 100644 --- a/src/zep_cloud/core/client_wrapper.py +++ b/src/zep_cloud/core/client_wrapper.py @@ -33,12 +33,12 @@ def get_headers(self) -> typing.Dict[str, str]: import platform headers: typing.Dict[str, str] = { - "User-Agent": "zep-cloud/4.0.1", + "User-Agent": "zep-cloud/4.1.0", "X-Fern-Language": "Python", "X-Fern-Runtime": f"python/{platform.python_version()}", "X-Fern-Platform": f"{platform.system().lower()}/{platform.release()}", "X-Fern-SDK-Name": "zep-cloud", - "X-Fern-SDK-Version": "4.0.1", + "X-Fern-SDK-Version": "4.1.0", **(self.get_custom_headers() or {}), } headers["Authorization"] = f"Api-Key {self.api_key}" diff --git a/src/zep_cloud/graph/client.py b/src/zep_cloud/graph/client.py index b56934c3..a9b28d27 100644 --- a/src/zep_cloud/graph/client.py +++ b/src/zep_cloud/graph/client.py @@ -27,6 +27,8 @@ from ..types.graph_content_policy_request import GraphContentPolicyRequest from ..types.graph_context_response import GraphContextResponse from ..types.graph_delete_result import GraphDeleteResult +from ..types.graph_metadata_key import GraphMetadataKey +from ..types.graph_metadata_key_list import GraphMetadataKeyList from ..types.graph_page import GraphPage from ..types.graph_query_response import GraphQueryResponse from ..types.graph_query_stream_event import GraphQueryStreamEvent @@ -74,8 +76,8 @@ def __init__(self, *, client_wrapper: SyncClientWrapper): self._raw_client = RawGraphClient(client_wrapper=client_wrapper) self._client_wrapper = client_wrapper self._document_summary: typing.Optional[DocumentSummaryClient] = None - self._episode: typing.Optional[EpisodeClient] = None self._edge: typing.Optional[EdgeClient] = None + self._episode: typing.Optional[EpisodeClient] = None self._hyperedge: typing.Optional[HyperedgeClient] = None self._node: typing.Optional[NodeClient] = None self._observation: typing.Optional[ObservationClient] = None @@ -264,7 +266,7 @@ def query_stream( request_options: typing.Optional[RequestOptions] = None, ) -> typing.Iterator[GraphQueryStreamEvent]: """ - Experimental. Retrieves the graph records for a natural-language question about a graph with a read-only retrieval loop. By default, the response has the retrieved records and no answer. Set `generate_answer` to `true` to also get an answer that a model writes from the records, with the cited graph items. Set `stream` to `true` to get the retrieval calls as server-sent events. The default mode is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. A project with a BYOM configuration supports only deep. A BYOC deployment supports only deep. The operation is experimental and in closed release. Zep enables the operation only for select accounts. The request, the response, the events, and the modes of the operation can change. A request from an account without access returns `404 not_found`. To get access, contact support@getzep.com. + Experimental. Retrieves the graph records for a natural-language question about a graph with a read-only retrieval loop. By default, the response has the retrieved records and no answer. Set `generate_answer` to `true` to also get an answer that a model writes from the records, with the cited graph items. Set `stream` to `true` to get the retrieval calls as server-sent events. The default mode is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. BYOM and BYOC projects can use fast mode when they have a configured decision model. Other projects can use fast mode without a decision model. BYOM and BYOC projects without a decision model must use deep mode. The operation is experimental and in closed release. Zep enables the operation only for select accounts. The request, the response, the events, and the modes of the operation can change. A request from an account without access returns `404 not_found`. To get access, contact support@getzep.com. Parameters ---------- @@ -282,7 +284,7 @@ def query_stream( Optional caller guidance for the answer. The agent treats it as untrusted text. mode : typing.Optional[GraphQueryRequestMode] - The retrieval mode. The default is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. A project with a BYOM configuration supports only deep. A BYOC deployment supports only deep. + The retrieval mode. The default is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. A BYOM project or BYOC deployment also needs a SystemOne decision model for fast. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -327,7 +329,7 @@ def query( request_options: typing.Optional[RequestOptions] = None, ) -> GraphQueryResponse: """ - Experimental. Retrieves the graph records for a natural-language question about a graph with a read-only retrieval loop. By default, the response has the retrieved records and no answer. Set `generate_answer` to `true` to also get an answer that a model writes from the records, with the cited graph items. Set `stream` to `true` to get the retrieval calls as server-sent events. The default mode is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. A project with a BYOM configuration supports only deep. A BYOC deployment supports only deep. The operation is experimental and in closed release. Zep enables the operation only for select accounts. The request, the response, the events, and the modes of the operation can change. A request from an account without access returns `404 not_found`. To get access, contact support@getzep.com. + Experimental. Retrieves the graph records for a natural-language question about a graph with a read-only retrieval loop. By default, the response has the retrieved records and no answer. Set `generate_answer` to `true` to also get an answer that a model writes from the records, with the cited graph items. Set `stream` to `true` to get the retrieval calls as server-sent events. The default mode is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. BYOM and BYOC projects can use fast mode when they have a configured decision model. Other projects can use fast mode without a decision model. BYOM and BYOC projects without a decision model must use deep mode. The operation is experimental and in closed release. Zep enables the operation only for select accounts. The request, the response, the events, and the modes of the operation can change. A request from an account without access returns `404 not_found`. To get access, contact support@getzep.com. Parameters ---------- @@ -345,7 +347,7 @@ def query( Optional caller guidance for the answer. The agent treats it as untrusted text. mode : typing.Optional[GraphQueryRequestMode] - The retrieval mode. The default is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. A project with a BYOM configuration supports only deep. A BYOC deployment supports only deep. + The retrieval mode. The default is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. A BYOM project or BYOC deployment also needs a SystemOne decision model for fast. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -784,6 +786,56 @@ def set_instructions( ) return _response.data + def list_metadata_keys( + self, + graph_uuid: str, + *, + page_size: typing.Optional[int] = None, + cursor: typing.Optional[str] = None, + request_options: typing.Optional[RequestOptions] = None, + ) -> SyncPager[GraphMetadataKey, GraphMetadataKeyList]: + """ + Returns the append-only metadata keys recorded for a graph. A key can remain in the list after no episode or message uses it. + + Parameters + ---------- + graph_uuid : str + The UUID of the graph. For a user graph, you can also use the UUID of the user. + + page_size : typing.Optional[int] + The maximum number of keys per page. + + cursor : typing.Optional[str] + Opaque page cursor + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + SyncPager[GraphMetadataKey, GraphMetadataKeyList] + OK + + Examples + -------- + from zep_cloud import Zep + + client = Zep( + api_key="YOUR_API_KEY", + ) + response = client.graph.list_metadata_keys( + graph_uuid="graph_uuid", + ) + 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_metadata_keys( + graph_uuid, page_size=page_size, cursor=cursor, request_options=request_options + ) + def get_observation_steering( self, graph_uuid: str, *, request_options: typing.Optional[RequestOptions] = None ) -> ObservationSteering: @@ -907,6 +959,7 @@ def set_ontology( self, graph_uuid: str, *, + edge_type_hierarchy: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, edge_types: typing.Optional[typing.Sequence[EdgeType]] = OMIT, entity_type_hierarchy: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, entity_types: typing.Optional[typing.Sequence[EntityType]] = OMIT, @@ -920,11 +973,14 @@ def set_ontology( graph_uuid : str The UUID of the graph. For a user graph, you can also use the UUID of the user. + edge_type_hierarchy : typing.Optional[typing.Dict[str, typing.Any]] + The edge type hierarchy. Omitted when the ontology has no edge subtypes. + edge_types : typing.Optional[typing.Sequence[EdgeType]] The edge types defined in the ontology in effect at this scope. entity_type_hierarchy : typing.Optional[typing.Dict[str, typing.Any]] - The entity type hierarchy (spec ontology-1). Omitted when the ontology is flat. + The entity type hierarchy. Omitted when the ontology has no entity subtypes. entity_types : typing.Optional[typing.Sequence[EntityType]] The entity types defined in the ontology in effect at this scope. @@ -956,6 +1012,7 @@ def set_ontology( """ _response = self._raw_client.set_ontology( graph_uuid, + edge_type_hierarchy=edge_type_hierarchy, edge_types=edge_types, entity_type_hierarchy=entity_type_hierarchy, entity_types=entity_types, @@ -1574,14 +1631,6 @@ def document_summary(self): self._document_summary = DocumentSummaryClient(client_wrapper=self._client_wrapper) return self._document_summary - @property - def episode(self): - if self._episode is None: - from .episode.client import EpisodeClient # noqa: E402 - - self._episode = EpisodeClient(client_wrapper=self._client_wrapper) - return self._episode - @property def edge(self): if self._edge is None: @@ -1590,6 +1639,14 @@ def edge(self): self._edge = EdgeClient(client_wrapper=self._client_wrapper) return self._edge + @property + def episode(self): + if self._episode is None: + from .episode.client import EpisodeClient # noqa: E402 + + self._episode = EpisodeClient(client_wrapper=self._client_wrapper) + return self._episode + @property def hyperedge(self): if self._hyperedge is None: @@ -1628,8 +1685,8 @@ def __init__(self, *, client_wrapper: AsyncClientWrapper): self._raw_client = AsyncRawGraphClient(client_wrapper=client_wrapper) self._client_wrapper = client_wrapper self._document_summary: typing.Optional[AsyncDocumentSummaryClient] = None - self._episode: typing.Optional[AsyncEpisodeClient] = None self._edge: typing.Optional[AsyncEdgeClient] = None + self._episode: typing.Optional[AsyncEpisodeClient] = None self._hyperedge: typing.Optional[AsyncHyperedgeClient] = None self._node: typing.Optional[AsyncNodeClient] = None self._observation: typing.Optional[AsyncObservationClient] = None @@ -1843,7 +1900,7 @@ async def query_stream( request_options: typing.Optional[RequestOptions] = None, ) -> typing.AsyncIterator[GraphQueryStreamEvent]: """ - Experimental. Retrieves the graph records for a natural-language question about a graph with a read-only retrieval loop. By default, the response has the retrieved records and no answer. Set `generate_answer` to `true` to also get an answer that a model writes from the records, with the cited graph items. Set `stream` to `true` to get the retrieval calls as server-sent events. The default mode is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. A project with a BYOM configuration supports only deep. A BYOC deployment supports only deep. The operation is experimental and in closed release. Zep enables the operation only for select accounts. The request, the response, the events, and the modes of the operation can change. A request from an account without access returns `404 not_found`. To get access, contact support@getzep.com. + Experimental. Retrieves the graph records for a natural-language question about a graph with a read-only retrieval loop. By default, the response has the retrieved records and no answer. Set `generate_answer` to `true` to also get an answer that a model writes from the records, with the cited graph items. Set `stream` to `true` to get the retrieval calls as server-sent events. The default mode is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. BYOM and BYOC projects can use fast mode when they have a configured decision model. Other projects can use fast mode without a decision model. BYOM and BYOC projects without a decision model must use deep mode. The operation is experimental and in closed release. Zep enables the operation only for select accounts. The request, the response, the events, and the modes of the operation can change. A request from an account without access returns `404 not_found`. To get access, contact support@getzep.com. Parameters ---------- @@ -1861,7 +1918,7 @@ async def query_stream( Optional caller guidance for the answer. The agent treats it as untrusted text. mode : typing.Optional[GraphQueryRequestMode] - The retrieval mode. The default is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. A project with a BYOM configuration supports only deep. A BYOC deployment supports only deep. + The retrieval mode. The default is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. A BYOM project or BYOC deployment also needs a SystemOne decision model for fast. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -1915,7 +1972,7 @@ async def query( request_options: typing.Optional[RequestOptions] = None, ) -> GraphQueryResponse: """ - Experimental. Retrieves the graph records for a natural-language question about a graph with a read-only retrieval loop. By default, the response has the retrieved records and no answer. Set `generate_answer` to `true` to also get an answer that a model writes from the records, with the cited graph items. Set `stream` to `true` to get the retrieval calls as server-sent events. The default mode is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. A project with a BYOM configuration supports only deep. A BYOC deployment supports only deep. The operation is experimental and in closed release. Zep enables the operation only for select accounts. The request, the response, the events, and the modes of the operation can change. A request from an account without access returns `404 not_found`. To get access, contact support@getzep.com. + Experimental. Retrieves the graph records for a natural-language question about a graph with a read-only retrieval loop. By default, the response has the retrieved records and no answer. Set `generate_answer` to `true` to also get an answer that a model writes from the records, with the cited graph items. Set `stream` to `true` to get the retrieval calls as server-sent events. The default mode is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. BYOM and BYOC projects can use fast mode when they have a configured decision model. Other projects can use fast mode without a decision model. BYOM and BYOC projects without a decision model must use deep mode. The operation is experimental and in closed release. Zep enables the operation only for select accounts. The request, the response, the events, and the modes of the operation can change. A request from an account without access returns `404 not_found`. To get access, contact support@getzep.com. Parameters ---------- @@ -1933,7 +1990,7 @@ async def query( Optional caller guidance for the answer. The agent treats it as untrusted text. mode : typing.Optional[GraphQueryRequestMode] - The retrieval mode. The default is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. A project with a BYOM configuration supports only deep. A BYOC deployment supports only deep. + The retrieval mode. The default is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. A BYOM project or BYOC deployment also needs a SystemOne decision model for fast. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -2453,6 +2510,65 @@ async def main() -> None: ) return _response.data + async def list_metadata_keys( + self, + graph_uuid: str, + *, + page_size: typing.Optional[int] = None, + cursor: typing.Optional[str] = None, + request_options: typing.Optional[RequestOptions] = None, + ) -> AsyncPager[GraphMetadataKey, GraphMetadataKeyList]: + """ + Returns the append-only metadata keys recorded for a graph. A key can remain in the list after no episode or message uses it. + + Parameters + ---------- + graph_uuid : str + The UUID of the graph. For a user graph, you can also use the UUID of the user. + + page_size : typing.Optional[int] + The maximum number of keys per page. + + cursor : typing.Optional[str] + Opaque page cursor + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AsyncPager[GraphMetadataKey, GraphMetadataKeyList] + OK + + Examples + -------- + import asyncio + + from zep_cloud import AsyncZep + + client = AsyncZep( + api_key="YOUR_API_KEY", + ) + + + async def main() -> None: + response = await client.graph.list_metadata_keys( + graph_uuid="graph_uuid", + ) + 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_metadata_keys( + graph_uuid, page_size=page_size, cursor=cursor, request_options=request_options + ) + async def get_observation_steering( self, graph_uuid: str, *, request_options: typing.Optional[RequestOptions] = None ) -> ObservationSteering: @@ -2602,6 +2718,7 @@ async def set_ontology( self, graph_uuid: str, *, + edge_type_hierarchy: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, edge_types: typing.Optional[typing.Sequence[EdgeType]] = OMIT, entity_type_hierarchy: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, entity_types: typing.Optional[typing.Sequence[EntityType]] = OMIT, @@ -2615,11 +2732,14 @@ async def set_ontology( graph_uuid : str The UUID of the graph. For a user graph, you can also use the UUID of the user. + edge_type_hierarchy : typing.Optional[typing.Dict[str, typing.Any]] + The edge type hierarchy. Omitted when the ontology has no edge subtypes. + edge_types : typing.Optional[typing.Sequence[EdgeType]] The edge types defined in the ontology in effect at this scope. entity_type_hierarchy : typing.Optional[typing.Dict[str, typing.Any]] - The entity type hierarchy (spec ontology-1). Omitted when the ontology is flat. + The entity type hierarchy. Omitted when the ontology has no entity subtypes. entity_types : typing.Optional[typing.Sequence[EntityType]] The entity types defined in the ontology in effect at this scope. @@ -2659,6 +2779,7 @@ async def main() -> None: """ _response = await self._raw_client.set_ontology( graph_uuid, + edge_type_hierarchy=edge_type_hierarchy, edge_types=edge_types, entity_type_hierarchy=entity_type_hierarchy, entity_types=entity_types, @@ -3340,14 +3461,6 @@ def document_summary(self): self._document_summary = AsyncDocumentSummaryClient(client_wrapper=self._client_wrapper) return self._document_summary - @property - def episode(self): - if self._episode is None: - from .episode.client import AsyncEpisodeClient # noqa: E402 - - self._episode = AsyncEpisodeClient(client_wrapper=self._client_wrapper) - return self._episode - @property def edge(self): if self._edge is None: @@ -3356,6 +3469,14 @@ def edge(self): self._edge = AsyncEdgeClient(client_wrapper=self._client_wrapper) return self._edge + @property + def episode(self): + if self._episode is None: + from .episode.client import AsyncEpisodeClient # noqa: E402 + + self._episode = AsyncEpisodeClient(client_wrapper=self._client_wrapper) + return self._episode + @property def hyperedge(self): if self._hyperedge is None: diff --git a/src/zep_cloud/graph/episode/client.py b/src/zep_cloud/graph/episode/client.py index b16998c6..c1bf5bfe 100644 --- a/src/zep_cloud/graph/episode/client.py +++ b/src/zep_cloud/graph/episode/client.py @@ -37,59 +37,6 @@ def with_raw_response(self) -> RawEpisodeClient: """ return self._raw_client - def list_for_document( - self, - graph_uuid: str, - document_id: str, - *, - page_size: typing.Optional[int] = None, - cursor: typing.Optional[str] = None, - request_options: typing.Optional[RequestOptions] = None, - ) -> SyncPager[Episode, EpisodePage]: - """ - Parameters - ---------- - graph_uuid : str - The UUID of the graph. For a user graph, you can also use the UUID of the user. - - document_id : str - Document ID - - page_size : typing.Optional[int] - The maximum number of items in one page. The SDK method returns a pager. In Python, `.items` holds only the first page. In TypeScript, `.data` holds only the first page. To read every page, iterate the pager: use `for` or `list(...)` in Python, or `for await` in TypeScript. In Go, the method returns one page, and `Iterator()` reads all pages. - - cursor : typing.Optional[str] - Opaque page cursor - - request_options : typing.Optional[RequestOptions] - Request-specific configuration. - - Returns - ------- - SyncPager[Episode, EpisodePage] - OK - - Examples - -------- - from zep_cloud import Zep - - client = Zep( - api_key="YOUR_API_KEY", - ) - response = client.graph.episode.list_for_document( - graph_uuid="graph_uuid", - document_id="document_id", - ) - 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_for_document( - graph_uuid, document_id, page_size=page_size, cursor=cursor, request_options=request_options - ) - def add( self, graph_uuid: str, @@ -186,7 +133,10 @@ def list( list can also contain episode UUIDs: an episode UUID matches that episode, so one request can return a known set of episodes. At most 256 entries. `filters.metadata_filters` restricts the results to episodes whose stored - metadata matches the predicate. + metadata matches the predicate. `filters.document_id` restricts the results + to the episodes of one document. + + Example body: `{"filters": {"document_id": "gdrive.test-folder.weird-document"}}` Parameters ---------- @@ -481,68 +431,6 @@ def with_raw_response(self) -> AsyncRawEpisodeClient: """ return self._raw_client - async def list_for_document( - self, - graph_uuid: str, - document_id: str, - *, - page_size: typing.Optional[int] = None, - cursor: typing.Optional[str] = None, - request_options: typing.Optional[RequestOptions] = None, - ) -> AsyncPager[Episode, EpisodePage]: - """ - Parameters - ---------- - graph_uuid : str - The UUID of the graph. For a user graph, you can also use the UUID of the user. - - document_id : str - Document ID - - page_size : typing.Optional[int] - The maximum number of items in one page. The SDK method returns a pager. In Python, `.items` holds only the first page. In TypeScript, `.data` holds only the first page. To read every page, iterate the pager: use `for` or `list(...)` in Python, or `for await` in TypeScript. In Go, the method returns one page, and `Iterator()` reads all pages. - - cursor : typing.Optional[str] - Opaque page cursor - - request_options : typing.Optional[RequestOptions] - Request-specific configuration. - - Returns - ------- - AsyncPager[Episode, EpisodePage] - OK - - Examples - -------- - import asyncio - - from zep_cloud import AsyncZep - - client = AsyncZep( - api_key="YOUR_API_KEY", - ) - - - async def main() -> None: - response = await client.graph.episode.list_for_document( - graph_uuid="graph_uuid", - document_id="document_id", - ) - 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_for_document( - graph_uuid, document_id, page_size=page_size, cursor=cursor, request_options=request_options - ) - async def add( self, graph_uuid: str, @@ -647,7 +535,10 @@ async def list( list can also contain episode UUIDs: an episode UUID matches that episode, so one request can return a known set of episodes. At most 256 entries. `filters.metadata_filters` restricts the results to episodes whose stored - metadata matches the predicate. + metadata matches the predicate. `filters.document_id` restricts the results + to the episodes of one document. + + Example body: `{"filters": {"document_id": "gdrive.test-folder.weird-document"}}` Parameters ---------- diff --git a/src/zep_cloud/graph/episode/raw_client.py b/src/zep_cloud/graph/episode/raw_client.py index 9fd7ab7e..ae02deed 100644 --- a/src/zep_cloud/graph/episode/raw_client.py +++ b/src/zep_cloud/graph/episode/raw_client.py @@ -40,135 +40,6 @@ class RawEpisodeClient: def __init__(self, *, client_wrapper: SyncClientWrapper): self._client_wrapper = client_wrapper - def list_for_document( - self, - graph_uuid: str, - document_id: str, - *, - page_size: typing.Optional[int] = None, - cursor: typing.Optional[str] = None, - request_options: typing.Optional[RequestOptions] = None, - ) -> SyncPager[Episode, EpisodePage]: - """ - Parameters - ---------- - graph_uuid : str - The UUID of the graph. For a user graph, you can also use the UUID of the user. - - document_id : str - Document ID - - page_size : typing.Optional[int] - The maximum number of items in one page. The SDK method returns a pager. In Python, `.items` holds only the first page. In TypeScript, `.data` holds only the first page. To read every page, iterate the pager: use `for` or `list(...)` in Python, or `for await` in TypeScript. In Go, the method returns one page, and `Iterator()` reads all pages. - - cursor : typing.Optional[str] - Opaque page cursor - - request_options : typing.Optional[RequestOptions] - Request-specific configuration. - - Returns - ------- - SyncPager[Episode, EpisodePage] - OK - """ - _response = self._client_wrapper.httpx_client.request( - f"graphs/{encode_path_param(graph_uuid)}/documents/{encode_path_param(document_id)}/episodes", - method="GET", - params={ - "page_size": page_size, - "cursor": cursor, - }, - request_options=request_options, - ) - try: - if 200 <= _response.status_code < 300: - _parsed_response = typing.cast( - EpisodePage, - parse_obj_as( - type_=EpisodePage, # type: ignore - object_=_response.json(), - ), - ) - _items = _parsed_response.items - _parsed_next = _parsed_response.next_cursor - _has_next = _parsed_next is not None and _parsed_next != "" - _get_next = lambda: self.list_for_document( - graph_uuid, - document_id, - page_size=page_size, - cursor=_parsed_next, - request_options=request_options, - ) - return SyncPager(has_next=_has_next, items=_items, get_next=_get_next, response=_parsed_response) - if _response.status_code == 400: - raise BadRequestError( - headers=dict(_response.headers), - body=typing.cast( - types_api_error_ApiError, - parse_obj_as( - type_=types_api_error_ApiError, # type: ignore - object_=_response.json(), - ), - ), - ) - if _response.status_code == 401: - raise UnauthorizedError( - headers=dict(_response.headers), - body=typing.cast( - types_api_error_ApiError, - parse_obj_as( - type_=types_api_error_ApiError, # type: ignore - object_=_response.json(), - ), - ), - ) - if _response.status_code == 403: - raise ForbiddenError( - headers=dict(_response.headers), - body=typing.cast( - types_api_error_ApiError, - parse_obj_as( - type_=types_api_error_ApiError, # type: ignore - object_=_response.json(), - ), - ), - ) - if _response.status_code == 404: - raise NotFoundError( - headers=dict(_response.headers), - body=typing.cast( - types_api_error_ApiError, - parse_obj_as( - type_=types_api_error_ApiError, # type: ignore - object_=_response.json(), - ), - ), - ) - if _response.status_code == 409: - raise ConflictError( - headers=dict(_response.headers), - body=typing.cast( - types_api_error_ApiError, - parse_obj_as( - type_=types_api_error_ApiError, # type: ignore - object_=_response.json(), - ), - ), - ) - _response_json = _response.json() - except JSONDecodeError: - raise core_api_error_ApiError( - status_code=_response.status_code, headers=dict(_response.headers), body=_response.text - ) - except ValidationError as e: - raise ParsingError( - status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e - ) - raise core_api_error_ApiError( - status_code=_response.status_code, headers=dict(_response.headers), body=_response_json - ) - def add( self, graph_uuid: str, @@ -336,7 +207,10 @@ def list( list can also contain episode UUIDs: an episode UUID matches that episode, so one request can return a known set of episodes. At most 256 entries. `filters.metadata_filters` restricts the results to episodes whose stored - metadata matches the predicate. + metadata matches the predicate. `filters.document_id` restricts the results + to the episodes of one document. + + Example body: `{"filters": {"document_id": "gdrive.test-folder.weird-document"}}` Parameters ---------- @@ -1012,138 +886,6 @@ class AsyncRawEpisodeClient: def __init__(self, *, client_wrapper: AsyncClientWrapper): self._client_wrapper = client_wrapper - async def list_for_document( - self, - graph_uuid: str, - document_id: str, - *, - page_size: typing.Optional[int] = None, - cursor: typing.Optional[str] = None, - request_options: typing.Optional[RequestOptions] = None, - ) -> AsyncPager[Episode, EpisodePage]: - """ - Parameters - ---------- - graph_uuid : str - The UUID of the graph. For a user graph, you can also use the UUID of the user. - - document_id : str - Document ID - - page_size : typing.Optional[int] - The maximum number of items in one page. The SDK method returns a pager. In Python, `.items` holds only the first page. In TypeScript, `.data` holds only the first page. To read every page, iterate the pager: use `for` or `list(...)` in Python, or `for await` in TypeScript. In Go, the method returns one page, and `Iterator()` reads all pages. - - cursor : typing.Optional[str] - Opaque page cursor - - request_options : typing.Optional[RequestOptions] - Request-specific configuration. - - Returns - ------- - AsyncPager[Episode, EpisodePage] - OK - """ - _response = await self._client_wrapper.httpx_client.request( - f"graphs/{encode_path_param(graph_uuid)}/documents/{encode_path_param(document_id)}/episodes", - method="GET", - params={ - "page_size": page_size, - "cursor": cursor, - }, - request_options=request_options, - ) - try: - if 200 <= _response.status_code < 300: - _parsed_response = typing.cast( - EpisodePage, - parse_obj_as( - type_=EpisodePage, # type: ignore - object_=_response.json(), - ), - ) - _items = _parsed_response.items - _parsed_next = _parsed_response.next_cursor - _has_next = _parsed_next is not None and _parsed_next != "" - - async def _get_next(): - return await self.list_for_document( - graph_uuid, - document_id, - page_size=page_size, - cursor=_parsed_next, - request_options=request_options, - ) - - return AsyncPager(has_next=_has_next, items=_items, get_next=_get_next, response=_parsed_response) - if _response.status_code == 400: - raise BadRequestError( - headers=dict(_response.headers), - body=typing.cast( - types_api_error_ApiError, - parse_obj_as( - type_=types_api_error_ApiError, # type: ignore - object_=_response.json(), - ), - ), - ) - if _response.status_code == 401: - raise UnauthorizedError( - headers=dict(_response.headers), - body=typing.cast( - types_api_error_ApiError, - parse_obj_as( - type_=types_api_error_ApiError, # type: ignore - object_=_response.json(), - ), - ), - ) - if _response.status_code == 403: - raise ForbiddenError( - headers=dict(_response.headers), - body=typing.cast( - types_api_error_ApiError, - parse_obj_as( - type_=types_api_error_ApiError, # type: ignore - object_=_response.json(), - ), - ), - ) - if _response.status_code == 404: - raise NotFoundError( - headers=dict(_response.headers), - body=typing.cast( - types_api_error_ApiError, - parse_obj_as( - type_=types_api_error_ApiError, # type: ignore - object_=_response.json(), - ), - ), - ) - if _response.status_code == 409: - raise ConflictError( - headers=dict(_response.headers), - body=typing.cast( - types_api_error_ApiError, - parse_obj_as( - type_=types_api_error_ApiError, # type: ignore - object_=_response.json(), - ), - ), - ) - _response_json = _response.json() - except JSONDecodeError: - raise core_api_error_ApiError( - status_code=_response.status_code, headers=dict(_response.headers), body=_response.text - ) - except ValidationError as e: - raise ParsingError( - status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e - ) - raise core_api_error_ApiError( - status_code=_response.status_code, headers=dict(_response.headers), body=_response_json - ) - async def add( self, graph_uuid: str, @@ -1311,7 +1053,10 @@ async def list( list can also contain episode UUIDs: an episode UUID matches that episode, so one request can return a known set of episodes. At most 256 entries. `filters.metadata_filters` restricts the results to episodes whose stored - metadata matches the predicate. + metadata matches the predicate. `filters.document_id` restricts the results + to the episodes of one document. + + Example body: `{"filters": {"document_id": "gdrive.test-folder.weird-document"}}` Parameters ---------- diff --git a/src/zep_cloud/graph/raw_client.py b/src/zep_cloud/graph/raw_client.py index 7bd65ded..ae186be0 100644 --- a/src/zep_cloud/graph/raw_client.py +++ b/src/zep_cloud/graph/raw_client.py @@ -46,6 +46,8 @@ from ..types.graph_content_policy_request import GraphContentPolicyRequest from ..types.graph_context_response import GraphContextResponse from ..types.graph_delete_result import GraphDeleteResult +from ..types.graph_metadata_key import GraphMetadataKey +from ..types.graph_metadata_key_list import GraphMetadataKeyList from ..types.graph_page import GraphPage from ..types.graph_query_response import GraphQueryResponse from ..types.graph_query_stream_event import GraphQueryStreamEvent @@ -465,7 +467,7 @@ def query_stream( request_options: typing.Optional[RequestOptions] = None, ) -> typing.Iterator[HttpResponse[typing.Iterator[GraphQueryStreamEvent]]]: """ - Experimental. Retrieves the graph records for a natural-language question about a graph with a read-only retrieval loop. By default, the response has the retrieved records and no answer. Set `generate_answer` to `true` to also get an answer that a model writes from the records, with the cited graph items. Set `stream` to `true` to get the retrieval calls as server-sent events. The default mode is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. A project with a BYOM configuration supports only deep. A BYOC deployment supports only deep. The operation is experimental and in closed release. Zep enables the operation only for select accounts. The request, the response, the events, and the modes of the operation can change. A request from an account without access returns `404 not_found`. To get access, contact support@getzep.com. + Experimental. Retrieves the graph records for a natural-language question about a graph with a read-only retrieval loop. By default, the response has the retrieved records and no answer. Set `generate_answer` to `true` to also get an answer that a model writes from the records, with the cited graph items. Set `stream` to `true` to get the retrieval calls as server-sent events. The default mode is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. BYOM and BYOC projects can use fast mode when they have a configured decision model. Other projects can use fast mode without a decision model. BYOM and BYOC projects without a decision model must use deep mode. The operation is experimental and in closed release. Zep enables the operation only for select accounts. The request, the response, the events, and the modes of the operation can change. A request from an account without access returns `404 not_found`. To get access, contact support@getzep.com. Parameters ---------- @@ -483,7 +485,7 @@ def query_stream( Optional caller guidance for the answer. The agent treats it as untrusted text. mode : typing.Optional[GraphQueryRequestMode] - The retrieval mode. The default is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. A project with a BYOM configuration supports only deep. A BYOC deployment supports only deep. + The retrieval mode. The default is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. A BYOM project or BYOC deployment also needs a SystemOne decision model for fast. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -662,7 +664,7 @@ def query( request_options: typing.Optional[RequestOptions] = None, ) -> HttpResponse[GraphQueryResponse]: """ - Experimental. Retrieves the graph records for a natural-language question about a graph with a read-only retrieval loop. By default, the response has the retrieved records and no answer. Set `generate_answer` to `true` to also get an answer that a model writes from the records, with the cited graph items. Set `stream` to `true` to get the retrieval calls as server-sent events. The default mode is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. A project with a BYOM configuration supports only deep. A BYOC deployment supports only deep. The operation is experimental and in closed release. Zep enables the operation only for select accounts. The request, the response, the events, and the modes of the operation can change. A request from an account without access returns `404 not_found`. To get access, contact support@getzep.com. + Experimental. Retrieves the graph records for a natural-language question about a graph with a read-only retrieval loop. By default, the response has the retrieved records and no answer. Set `generate_answer` to `true` to also get an answer that a model writes from the records, with the cited graph items. Set `stream` to `true` to get the retrieval calls as server-sent events. The default mode is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. BYOM and BYOC projects can use fast mode when they have a configured decision model. Other projects can use fast mode without a decision model. BYOM and BYOC projects without a decision model must use deep mode. The operation is experimental and in closed release. Zep enables the operation only for select accounts. The request, the response, the events, and the modes of the operation can change. A request from an account without access returns `404 not_found`. To get access, contact support@getzep.com. Parameters ---------- @@ -680,7 +682,7 @@ def query( Optional caller guidance for the answer. The agent treats it as untrusted text. mode : typing.Optional[GraphQueryRequestMode] - The retrieval mode. The default is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. A project with a BYOM configuration supports only deep. A BYOC deployment supports only deep. + The retrieval mode. The default is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. A BYOM project or BYOC deployment also needs a SystemOne decision model for fast. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -1805,6 +1807,121 @@ def set_instructions( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) + def list_metadata_keys( + self, + graph_uuid: str, + *, + page_size: typing.Optional[int] = None, + cursor: typing.Optional[str] = None, + request_options: typing.Optional[RequestOptions] = None, + ) -> SyncPager[GraphMetadataKey, GraphMetadataKeyList]: + """ + Returns the append-only metadata keys recorded for a graph. A key can remain in the list after no episode or message uses it. + + Parameters + ---------- + graph_uuid : str + The UUID of the graph. For a user graph, you can also use the UUID of the user. + + page_size : typing.Optional[int] + The maximum number of keys per page. + + cursor : typing.Optional[str] + Opaque page cursor + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + SyncPager[GraphMetadataKey, GraphMetadataKeyList] + OK + """ + _response = self._client_wrapper.httpx_client.request( + f"graphs/{encode_path_param(graph_uuid)}/metadata-keys", + method="GET", + params={ + "page_size": page_size, + "cursor": cursor, + }, + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _parsed_response = typing.cast( + GraphMetadataKeyList, + parse_obj_as( + type_=GraphMetadataKeyList, # type: ignore + object_=_response.json(), + ), + ) + _items = _parsed_response.items + _parsed_next = _parsed_response.next_cursor + _has_next = _parsed_next is not None and _parsed_next != "" + _get_next = lambda: self.list_metadata_keys( + graph_uuid, + page_size=page_size, + cursor=_parsed_next, + request_options=request_options, + ) + return SyncPager(has_next=_has_next, items=_items, get_next=_get_next, response=_parsed_response) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 401: + raise UnauthorizedError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 403: + raise ForbiddenError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.text + ) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response_json + ) + def get_observation_steering( self, graph_uuid: str, *, request_options: typing.Optional[RequestOptions] = None ) -> HttpResponse[ObservationSteering]: @@ -2076,6 +2193,7 @@ def set_ontology( self, graph_uuid: str, *, + edge_type_hierarchy: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, edge_types: typing.Optional[typing.Sequence[EdgeType]] = OMIT, entity_type_hierarchy: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, entity_types: typing.Optional[typing.Sequence[EntityType]] = OMIT, @@ -2089,11 +2207,14 @@ def set_ontology( graph_uuid : str The UUID of the graph. For a user graph, you can also use the UUID of the user. + edge_type_hierarchy : typing.Optional[typing.Dict[str, typing.Any]] + The edge type hierarchy. Omitted when the ontology has no edge subtypes. + edge_types : typing.Optional[typing.Sequence[EdgeType]] The edge types defined in the ontology in effect at this scope. entity_type_hierarchy : typing.Optional[typing.Dict[str, typing.Any]] - The entity type hierarchy (spec ontology-1). Omitted when the ontology is flat. + The entity type hierarchy. Omitted when the ontology has no entity subtypes. entity_types : typing.Optional[typing.Sequence[EntityType]] The entity types defined in the ontology in effect at this scope. @@ -2116,6 +2237,7 @@ def set_ontology( f"graphs/{encode_path_param(graph_uuid)}/ontology", method="PUT", json={ + "edge_type_hierarchy": edge_type_hierarchy, "edge_types": convert_and_respect_annotation_metadata( object_=edge_types, annotation=typing.Sequence[EdgeType], direction="write" ), @@ -3696,7 +3818,7 @@ async def query_stream( request_options: typing.Optional[RequestOptions] = None, ) -> typing.AsyncIterator[AsyncHttpResponse[typing.AsyncIterator[GraphQueryStreamEvent]]]: """ - Experimental. Retrieves the graph records for a natural-language question about a graph with a read-only retrieval loop. By default, the response has the retrieved records and no answer. Set `generate_answer` to `true` to also get an answer that a model writes from the records, with the cited graph items. Set `stream` to `true` to get the retrieval calls as server-sent events. The default mode is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. A project with a BYOM configuration supports only deep. A BYOC deployment supports only deep. The operation is experimental and in closed release. Zep enables the operation only for select accounts. The request, the response, the events, and the modes of the operation can change. A request from an account without access returns `404 not_found`. To get access, contact support@getzep.com. + Experimental. Retrieves the graph records for a natural-language question about a graph with a read-only retrieval loop. By default, the response has the retrieved records and no answer. Set `generate_answer` to `true` to also get an answer that a model writes from the records, with the cited graph items. Set `stream` to `true` to get the retrieval calls as server-sent events. The default mode is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. BYOM and BYOC projects can use fast mode when they have a configured decision model. Other projects can use fast mode without a decision model. BYOM and BYOC projects without a decision model must use deep mode. The operation is experimental and in closed release. Zep enables the operation only for select accounts. The request, the response, the events, and the modes of the operation can change. A request from an account without access returns `404 not_found`. To get access, contact support@getzep.com. Parameters ---------- @@ -3714,7 +3836,7 @@ async def query_stream( Optional caller guidance for the answer. The agent treats it as untrusted text. mode : typing.Optional[GraphQueryRequestMode] - The retrieval mode. The default is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. A project with a BYOM configuration supports only deep. A BYOC deployment supports only deep. + The retrieval mode. The default is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. A BYOM project or BYOC deployment also needs a SystemOne decision model for fast. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -3893,7 +4015,7 @@ async def query( request_options: typing.Optional[RequestOptions] = None, ) -> AsyncHttpResponse[GraphQueryResponse]: """ - Experimental. Retrieves the graph records for a natural-language question about a graph with a read-only retrieval loop. By default, the response has the retrieved records and no answer. Set `generate_answer` to `true` to also get an answer that a model writes from the records, with the cited graph items. Set `stream` to `true` to get the retrieval calls as server-sent events. The default mode is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. A project with a BYOM configuration supports only deep. A BYOC deployment supports only deep. The operation is experimental and in closed release. Zep enables the operation only for select accounts. The request, the response, the events, and the modes of the operation can change. A request from an account without access returns `404 not_found`. To get access, contact support@getzep.com. + Experimental. Retrieves the graph records for a natural-language question about a graph with a read-only retrieval loop. By default, the response has the retrieved records and no answer. Set `generate_answer` to `true` to also get an answer that a model writes from the records, with the cited graph items. Set `stream` to `true` to get the retrieval calls as server-sent events. The default mode is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. BYOM and BYOC projects can use fast mode when they have a configured decision model. Other projects can use fast mode without a decision model. BYOM and BYOC projects without a decision model must use deep mode. The operation is experimental and in closed release. Zep enables the operation only for select accounts. The request, the response, the events, and the modes of the operation can change. A request from an account without access returns `404 not_found`. To get access, contact support@getzep.com. Parameters ---------- @@ -3911,7 +4033,7 @@ async def query( Optional caller guidance for the answer. The agent treats it as untrusted text. mode : typing.Optional[GraphQueryRequestMode] - The retrieval mode. The default is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. A project with a BYOM configuration supports only deep. A BYOC deployment supports only deep. + The retrieval mode. The default is fast. fast: A decision model selects the types of search for each round and stops when it has enough context. The query runs at most 3 search rounds. A BYOM project or BYOC deployment also needs a SystemOne decision model for fast. deep: A model plans its own searches. It can page through complete lists and read more records before it answers. request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -5041,6 +5163,124 @@ async def set_instructions( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) + async def list_metadata_keys( + self, + graph_uuid: str, + *, + page_size: typing.Optional[int] = None, + cursor: typing.Optional[str] = None, + request_options: typing.Optional[RequestOptions] = None, + ) -> AsyncPager[GraphMetadataKey, GraphMetadataKeyList]: + """ + Returns the append-only metadata keys recorded for a graph. A key can remain in the list after no episode or message uses it. + + Parameters + ---------- + graph_uuid : str + The UUID of the graph. For a user graph, you can also use the UUID of the user. + + page_size : typing.Optional[int] + The maximum number of keys per page. + + cursor : typing.Optional[str] + Opaque page cursor + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AsyncPager[GraphMetadataKey, GraphMetadataKeyList] + OK + """ + _response = await self._client_wrapper.httpx_client.request( + f"graphs/{encode_path_param(graph_uuid)}/metadata-keys", + method="GET", + params={ + "page_size": page_size, + "cursor": cursor, + }, + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _parsed_response = typing.cast( + GraphMetadataKeyList, + parse_obj_as( + type_=GraphMetadataKeyList, # type: ignore + object_=_response.json(), + ), + ) + _items = _parsed_response.items + _parsed_next = _parsed_response.next_cursor + _has_next = _parsed_next is not None and _parsed_next != "" + + async def _get_next(): + return await self.list_metadata_keys( + graph_uuid, + page_size=page_size, + cursor=_parsed_next, + request_options=request_options, + ) + + return AsyncPager(has_next=_has_next, items=_items, get_next=_get_next, response=_parsed_response) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 401: + raise UnauthorizedError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 403: + raise ForbiddenError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.text + ) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response_json + ) + async def get_observation_steering( self, graph_uuid: str, *, request_options: typing.Optional[RequestOptions] = None ) -> AsyncHttpResponse[ObservationSteering]: @@ -5312,6 +5552,7 @@ async def set_ontology( self, graph_uuid: str, *, + edge_type_hierarchy: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, edge_types: typing.Optional[typing.Sequence[EdgeType]] = OMIT, entity_type_hierarchy: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, entity_types: typing.Optional[typing.Sequence[EntityType]] = OMIT, @@ -5325,11 +5566,14 @@ async def set_ontology( graph_uuid : str The UUID of the graph. For a user graph, you can also use the UUID of the user. + edge_type_hierarchy : typing.Optional[typing.Dict[str, typing.Any]] + The edge type hierarchy. Omitted when the ontology has no edge subtypes. + edge_types : typing.Optional[typing.Sequence[EdgeType]] The edge types defined in the ontology in effect at this scope. entity_type_hierarchy : typing.Optional[typing.Dict[str, typing.Any]] - The entity type hierarchy (spec ontology-1). Omitted when the ontology is flat. + The entity type hierarchy. Omitted when the ontology has no entity subtypes. entity_types : typing.Optional[typing.Sequence[EntityType]] The entity types defined in the ontology in effect at this scope. @@ -5352,6 +5596,7 @@ async def set_ontology( f"graphs/{encode_path_param(graph_uuid)}/ontology", method="PUT", json={ + "edge_type_hierarchy": edge_type_hierarchy, "edge_types": convert_and_respect_annotation_metadata( object_=edge_types, annotation=typing.Sequence[EdgeType], direction="write" ), diff --git a/src/zep_cloud/project/client.py b/src/zep_cloud/project/client.py index 6ab16527..478ea2c5 100644 --- a/src/zep_cloud/project/client.py +++ b/src/zep_cloud/project/client.py @@ -438,6 +438,7 @@ def get_ontology(self, *, request_options: typing.Optional[RequestOptions] = Non def set_ontology( self, *, + edge_type_hierarchy: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, edge_types: typing.Optional[typing.Sequence[EdgeType]] = OMIT, entity_type_hierarchy: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, entity_types: typing.Optional[typing.Sequence[EntityType]] = OMIT, @@ -450,11 +451,14 @@ def set_ontology( Parameters ---------- + edge_type_hierarchy : typing.Optional[typing.Dict[str, typing.Any]] + The edge type hierarchy. Omitted when the ontology has no edge subtypes. + edge_types : typing.Optional[typing.Sequence[EdgeType]] The edge types defined in the ontology in effect at this scope. entity_type_hierarchy : typing.Optional[typing.Dict[str, typing.Any]] - The entity type hierarchy (spec ontology-1). Omitted when the ontology is flat. + The entity type hierarchy. Omitted when the ontology has no entity subtypes. entity_types : typing.Optional[typing.Sequence[EntityType]] The entity types defined in the ontology in effect at this scope. @@ -483,6 +487,7 @@ def set_ontology( client.project.set_ontology() """ _response = self._raw_client.set_ontology( + edge_type_hierarchy=edge_type_hierarchy, edge_types=edge_types, entity_type_hierarchy=entity_type_hierarchy, entity_types=entity_types, @@ -1067,6 +1072,7 @@ async def main() -> None: async def set_ontology( self, *, + edge_type_hierarchy: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, edge_types: typing.Optional[typing.Sequence[EdgeType]] = OMIT, entity_type_hierarchy: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, entity_types: typing.Optional[typing.Sequence[EntityType]] = OMIT, @@ -1079,11 +1085,14 @@ async def set_ontology( Parameters ---------- + edge_type_hierarchy : typing.Optional[typing.Dict[str, typing.Any]] + The edge type hierarchy. Omitted when the ontology has no edge subtypes. + edge_types : typing.Optional[typing.Sequence[EdgeType]] The edge types defined in the ontology in effect at this scope. entity_type_hierarchy : typing.Optional[typing.Dict[str, typing.Any]] - The entity type hierarchy (spec ontology-1). Omitted when the ontology is flat. + The entity type hierarchy. Omitted when the ontology has no entity subtypes. entity_types : typing.Optional[typing.Sequence[EntityType]] The entity types defined in the ontology in effect at this scope. @@ -1120,6 +1129,7 @@ async def main() -> None: asyncio.run(main()) """ _response = await self._raw_client.set_ontology( + edge_type_hierarchy=edge_type_hierarchy, edge_types=edge_types, entity_type_hierarchy=entity_type_hierarchy, entity_types=entity_types, diff --git a/src/zep_cloud/project/raw_client.py b/src/zep_cloud/project/raw_client.py index 1250e9f5..6f17b043 100644 --- a/src/zep_cloud/project/raw_client.py +++ b/src/zep_cloud/project/raw_client.py @@ -1037,6 +1037,7 @@ def get_ontology(self, *, request_options: typing.Optional[RequestOptions] = Non def set_ontology( self, *, + edge_type_hierarchy: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, edge_types: typing.Optional[typing.Sequence[EdgeType]] = OMIT, entity_type_hierarchy: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, entity_types: typing.Optional[typing.Sequence[EntityType]] = OMIT, @@ -1049,11 +1050,14 @@ def set_ontology( Parameters ---------- + edge_type_hierarchy : typing.Optional[typing.Dict[str, typing.Any]] + The edge type hierarchy. Omitted when the ontology has no edge subtypes. + edge_types : typing.Optional[typing.Sequence[EdgeType]] The edge types defined in the ontology in effect at this scope. entity_type_hierarchy : typing.Optional[typing.Dict[str, typing.Any]] - The entity type hierarchy (spec ontology-1). Omitted when the ontology is flat. + The entity type hierarchy. Omitted when the ontology has no entity subtypes. entity_types : typing.Optional[typing.Sequence[EntityType]] The entity types defined in the ontology in effect at this scope. @@ -1076,6 +1080,7 @@ def set_ontology( "project/ontology", method="PUT", json={ + "edge_type_hierarchy": edge_type_hierarchy, "edge_types": convert_and_respect_annotation_metadata( object_=edge_types, annotation=typing.Sequence[EdgeType], direction="write" ), @@ -2328,6 +2333,7 @@ async def get_ontology( async def set_ontology( self, *, + edge_type_hierarchy: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, edge_types: typing.Optional[typing.Sequence[EdgeType]] = OMIT, entity_type_hierarchy: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, entity_types: typing.Optional[typing.Sequence[EntityType]] = OMIT, @@ -2340,11 +2346,14 @@ async def set_ontology( Parameters ---------- + edge_type_hierarchy : typing.Optional[typing.Dict[str, typing.Any]] + The edge type hierarchy. Omitted when the ontology has no edge subtypes. + edge_types : typing.Optional[typing.Sequence[EdgeType]] The edge types defined in the ontology in effect at this scope. entity_type_hierarchy : typing.Optional[typing.Dict[str, typing.Any]] - The entity type hierarchy (spec ontology-1). Omitted when the ontology is flat. + The entity type hierarchy. Omitted when the ontology has no entity subtypes. entity_types : typing.Optional[typing.Sequence[EntityType]] The entity types defined in the ontology in effect at this scope. @@ -2367,6 +2376,7 @@ async def set_ontology( "project/ontology", method="PUT", json={ + "edge_type_hierarchy": edge_type_hierarchy, "edge_types": convert_and_respect_annotation_metadata( object_=edge_types, annotation=typing.Sequence[EdgeType], direction="write" ), diff --git a/src/zep_cloud/types/__init__.py b/src/zep_cloud/types/__init__.py index 7a44b5e8..562500e6 100644 --- a/src/zep_cloud/types/__init__.py +++ b/src/zep_cloud/types/__init__.py @@ -207,6 +207,8 @@ from .graph_context_response import GraphContextResponse from .graph_data_type import GraphDataType from .graph_delete_result import GraphDeleteResult + from .graph_metadata_key import GraphMetadataKey + from .graph_metadata_key_list import GraphMetadataKeyList from .graph_page import GraphPage from .graph_query_citations import GraphQueryCitations from .graph_query_edge import GraphQueryEdge @@ -581,6 +583,8 @@ "GraphContextResponse": ".graph_context_response", "GraphDataType": ".graph_data_type", "GraphDeleteResult": ".graph_delete_result", + "GraphMetadataKey": ".graph_metadata_key", + "GraphMetadataKeyList": ".graph_metadata_key_list", "GraphPage": ".graph_page", "GraphQueryCitations": ".graph_query_citations", "GraphQueryEdge": ".graph_query_edge", @@ -977,6 +981,8 @@ def __dir__(): "GraphContextResponse", "GraphDataType", "GraphDeleteResult", + "GraphMetadataKey", + "GraphMetadataKeyList", "GraphPage", "GraphQueryCitations", "GraphQueryEdge", diff --git a/src/zep_cloud/types/episode_list_filters.py b/src/zep_cloud/types/episode_list_filters.py index b56e9bc4..d70fffee 100644 --- a/src/zep_cloud/types/episode_list_filters.py +++ b/src/zep_cloud/types/episode_list_filters.py @@ -16,6 +16,12 @@ class EpisodeListFilters(UniversalBaseModel): project setting include_policy_violating_episodes must be on. """ + document_id: typing.Optional[str] = pydantic.Field(default=None) + """ + Include only the episodes of this document. The value is the + document_id of the episodes. At most 100 characters. + """ + mentioned_node_uuids: typing.Optional[typing.List[str]] = pydantic.Field(default=None) """ Include only episodes that mention at least one of these nodes. At diff --git a/src/zep_cloud/types/graph_metadata_key.py b/src/zep_cloud/types/graph_metadata_key.py new file mode 100644 index 00000000..d59ed8e9 --- /dev/null +++ b/src/zep_cloud/types/graph_metadata_key.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 GraphMetadataKey(UniversalBaseModel): + created_at: typing.Optional[str] = pydantic.Field(default=None) + """ + The time when the key was first recorded. + """ + + key: typing.Optional[str] = pydantic.Field(default=None) + """ + The metadata key name. + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/zep_cloud/types/graph_metadata_key_list.py b/src/zep_cloud/types/graph_metadata_key_list.py new file mode 100644 index 00000000..edc5e87f --- /dev/null +++ b/src/zep_cloud/types/graph_metadata_key_list.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 .graph_metadata_key import GraphMetadataKey + + +class GraphMetadataKeyList(UniversalBaseModel): + items: typing.Optional[typing.List[GraphMetadataKey]] = pydantic.Field(default=None) + """ + The append-only keys recorded for the graph. A key can remain after no episode or message uses it. + """ + + next_cursor: typing.Optional[str] = pydantic.Field(default=None) + """ + The cursor for the next page, when more keys exist. + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/zep_cloud/types/ontology.py b/src/zep_cloud/types/ontology.py index d85f12e9..4de95df5 100644 --- a/src/zep_cloud/types/ontology.py +++ b/src/zep_cloud/types/ontology.py @@ -9,6 +9,11 @@ class Ontology(UniversalBaseModel): + edge_type_hierarchy: typing.Optional[typing.Dict[str, typing.Any]] = pydantic.Field(default=None) + """ + The edge type hierarchy. Omitted when the ontology has no edge subtypes. + """ + edge_types: typing.Optional[typing.List[EdgeType]] = pydantic.Field(default=None) """ The edge types defined in the ontology in effect at this scope. @@ -16,7 +21,7 @@ class Ontology(UniversalBaseModel): entity_type_hierarchy: typing.Optional[typing.Dict[str, typing.Any]] = pydantic.Field(default=None) """ - The entity type hierarchy (spec ontology-1). Omitted when the ontology is flat. + The entity type hierarchy. Omitted when the ontology has no entity subtypes. """ entity_types: typing.Optional[typing.List[EntityType]] = pydantic.Field(default=None) diff --git a/src/zep_cloud/types/task.py b/src/zep_cloud/types/task.py index d642b9b0..2c2dae38 100644 --- a/src/zep_cloud/types/task.py +++ b/src/zep_cloud/types/task.py @@ -51,7 +51,9 @@ class Task(UniversalBaseModel): status: typing.Optional[TaskStatus] = pydantic.Field(default=None) """ The service returns the task state. Valid values are pending, processing, - succeeded, partial, and failed. + succeeded, partial, and failed. A task has no canceled state. When a batch + becomes canceled, its batch.process task becomes failed, and the task error + code is batch_canceled. """ type: typing.Optional[str] = pydantic.Field(default=None) diff --git a/src/zep_cloud/user/client.py b/src/zep_cloud/user/client.py index aa09e611..bf4efd53 100644 --- a/src/zep_cloud/user/client.py +++ b/src/zep_cloud/user/client.py @@ -115,6 +115,43 @@ def create( ) return _response.data + def get_by_email(self, *, email: str, request_options: typing.Optional[RequestOptions] = None) -> User: + """ + Send `{"email": "jane@example.com"}` to get the user with this email. + An email matches only when the stored and requested values are equal after normalization. + Normalization lowercases both values and trims leading and trailing whitespace. + The operation returns `404 not_found` when no active user matches. + The operation returns `400 invalid_request` with `param: "email"` when multiple active users match. + The operation returns `400 invalid_request` with `param: "email"` when BYOK is active for the account. + An email that was stored encrypted with BYOK does not match. + + Parameters + ---------- + email : str + The user's email address. Matching ignores case and leading and trailing whitespace. + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + User + OK + + Examples + -------- + from zep_cloud import Zep + + client = Zep( + api_key="YOUR_API_KEY", + ) + client.user.get_by_email( + email="jane@example.com", + ) + """ + _response = self._raw_client.get_by_email(email=email, request_options=request_options) + return _response.data + def list( self, *, @@ -573,6 +610,51 @@ async def main() -> None: ) return _response.data + async def get_by_email(self, *, email: str, request_options: typing.Optional[RequestOptions] = None) -> User: + """ + Send `{"email": "jane@example.com"}` to get the user with this email. + An email matches only when the stored and requested values are equal after normalization. + Normalization lowercases both values and trims leading and trailing whitespace. + The operation returns `404 not_found` when no active user matches. + The operation returns `400 invalid_request` with `param: "email"` when multiple active users match. + The operation returns `400 invalid_request` with `param: "email"` when BYOK is active for the account. + An email that was stored encrypted with BYOK does not match. + + Parameters + ---------- + email : str + The user's email address. Matching ignores case and leading and trailing whitespace. + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + User + OK + + Examples + -------- + import asyncio + + from zep_cloud import AsyncZep + + client = AsyncZep( + api_key="YOUR_API_KEY", + ) + + + async def main() -> None: + await client.user.get_by_email( + email="jane@example.com", + ) + + + asyncio.run(main()) + """ + _response = await self._raw_client.get_by_email(email=email, request_options=request_options) + return _response.data + async def list( self, *, diff --git a/src/zep_cloud/user/raw_client.py b/src/zep_cloud/user/raw_client.py index 732bc7b4..6051f5fa 100644 --- a/src/zep_cloud/user/raw_client.py +++ b/src/zep_cloud/user/raw_client.py @@ -184,6 +184,100 @@ def create( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) + def get_by_email( + self, *, email: str, request_options: typing.Optional[RequestOptions] = None + ) -> HttpResponse[User]: + """ + Send `{"email": "jane@example.com"}` to get the user with this email. + An email matches only when the stored and requested values are equal after normalization. + Normalization lowercases both values and trims leading and trailing whitespace. + The operation returns `404 not_found` when no active user matches. + The operation returns `400 invalid_request` with `param: "email"` when multiple active users match. + The operation returns `400 invalid_request` with `param: "email"` when BYOK is active for the account. + An email that was stored encrypted with BYOK does not match. + + Parameters + ---------- + email : str + The user's email address. Matching ignores case and leading and trailing whitespace. + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + HttpResponse[User] + OK + """ + _response = self._client_wrapper.httpx_client.request( + "users/get-by-email", + method="POST", + json={ + "email": email, + }, + headers={ + "content-type": "application/json", + "Idempotency-Key": generate_idempotency_key(), + }, + request_options=request_options, + omit=OMIT, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + User, + parse_obj_as( + type_=User, # type: ignore + object_=_response.json(), + ), + ) + return HttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 401: + raise UnauthorizedError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.text + ) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response_json + ) + def list( self, *, @@ -1148,6 +1242,100 @@ async def create( status_code=_response.status_code, headers=dict(_response.headers), body=_response_json ) + async def get_by_email( + self, *, email: str, request_options: typing.Optional[RequestOptions] = None + ) -> AsyncHttpResponse[User]: + """ + Send `{"email": "jane@example.com"}` to get the user with this email. + An email matches only when the stored and requested values are equal after normalization. + Normalization lowercases both values and trims leading and trailing whitespace. + The operation returns `404 not_found` when no active user matches. + The operation returns `400 invalid_request` with `param: "email"` when multiple active users match. + The operation returns `400 invalid_request` with `param: "email"` when BYOK is active for the account. + An email that was stored encrypted with BYOK does not match. + + Parameters + ---------- + email : str + The user's email address. Matching ignores case and leading and trailing whitespace. + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AsyncHttpResponse[User] + OK + """ + _response = await self._client_wrapper.httpx_client.request( + "users/get-by-email", + method="POST", + json={ + "email": email, + }, + headers={ + "content-type": "application/json", + "Idempotency-Key": generate_idempotency_key(), + }, + request_options=request_options, + omit=OMIT, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + User, + parse_obj_as( + type_=User, # type: ignore + object_=_response.json(), + ), + ) + return AsyncHttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 401: + raise UnauthorizedError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + types_api_error_ApiError, + parse_obj_as( + type_=types_api_error_ApiError, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.text + ) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise core_api_error_ApiError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response_json + ) + async def list( self, *,