letta-client 0.1.233__py3-none-any.whl → 0.1.234__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of letta-client might be problematic. Click here for more details.

Files changed (438) hide show
  1. letta_client/__init__.py +2 -0
  2. letta_client/agents/__init__.py +2 -0
  3. letta_client/agents/blocks/__init__.py +2 -0
  4. letta_client/agents/blocks/client.py +72 -313
  5. letta_client/agents/blocks/raw_client.py +654 -0
  6. letta_client/agents/client.py +329 -869
  7. letta_client/agents/context/__init__.py +2 -0
  8. letta_client/agents/context/client.py +31 -66
  9. letta_client/agents/context/raw_client.py +122 -0
  10. letta_client/agents/core_memory/__init__.py +2 -0
  11. letta_client/agents/core_memory/client.py +31 -66
  12. letta_client/agents/core_memory/raw_client.py +124 -0
  13. letta_client/agents/files/__init__.py +2 -0
  14. letta_client/agents/files/client.py +39 -178
  15. letta_client/agents/files/raw_client.py +349 -0
  16. letta_client/agents/folders/__init__.py +2 -0
  17. letta_client/agents/folders/client.py +39 -178
  18. letta_client/agents/folders/raw_client.py +327 -0
  19. letta_client/agents/groups/__init__.py +2 -0
  20. letta_client/agents/groups/client.py +31 -72
  21. letta_client/agents/groups/raw_client.py +142 -0
  22. letta_client/agents/memory_variables/__init__.py +2 -0
  23. letta_client/agents/memory_variables/client.py +31 -65
  24. letta_client/agents/memory_variables/raw_client.py +125 -0
  25. letta_client/agents/memory_variables/types/__init__.py +2 -0
  26. letta_client/agents/memory_variables/types/memory_variables_list_response.py +3 -2
  27. letta_client/agents/messages/__init__.py +2 -0
  28. letta_client/agents/messages/client.py +150 -589
  29. letta_client/agents/messages/raw_client.py +1384 -0
  30. letta_client/agents/messages/types/__init__.py +2 -0
  31. letta_client/agents/messages/types/letta_streaming_response.py +6 -5
  32. letta_client/agents/messages/types/messages_modify_request.py +3 -2
  33. letta_client/agents/messages/types/messages_modify_response.py +5 -4
  34. letta_client/agents/messages/types/messages_preview_raw_payload_request.py +1 -0
  35. letta_client/agents/passages/__init__.py +2 -0
  36. letta_client/agents/passages/client.py +89 -301
  37. letta_client/agents/passages/raw_client.py +678 -0
  38. letta_client/agents/raw_client.py +2068 -0
  39. letta_client/agents/sources/__init__.py +2 -0
  40. letta_client/agents/sources/client.py +39 -178
  41. letta_client/agents/sources/raw_client.py +327 -0
  42. letta_client/agents/templates/__init__.py +2 -0
  43. letta_client/agents/templates/client.py +57 -276
  44. letta_client/agents/templates/raw_client.py +505 -0
  45. letta_client/agents/templates/types/__init__.py +2 -0
  46. letta_client/agents/templates/types/templates_create_response.py +5 -4
  47. letta_client/agents/templates/types/templates_migrate_response.py +3 -2
  48. letta_client/agents/tools/__init__.py +2 -0
  49. letta_client/agents/tools/client.py +40 -179
  50. letta_client/agents/tools/raw_client.py +327 -0
  51. letta_client/agents/types/__init__.py +2 -0
  52. letta_client/agents/types/agents_search_request_search_item.py +4 -3
  53. letta_client/agents/types/agents_search_request_search_item_field.py +4 -3
  54. letta_client/agents/types/agents_search_request_search_item_one.py +4 -3
  55. letta_client/agents/types/agents_search_request_search_item_three.py +3 -2
  56. letta_client/agents/types/agents_search_request_search_item_two.py +3 -2
  57. letta_client/agents/types/agents_search_request_search_item_zero.py +3 -2
  58. letta_client/agents/types/agents_search_response.py +5 -4
  59. letta_client/agents/types/create_agent_request_response_format.py +1 -0
  60. letta_client/agents/types/create_agent_request_tool_rules_item.py +4 -3
  61. letta_client/agents/types/update_agent_response_format.py +1 -0
  62. letta_client/agents/types/update_agent_tool_rules_item.py +4 -3
  63. letta_client/base_client.py +41 -49
  64. letta_client/batches/__init__.py +2 -0
  65. letta_client/batches/client.py +45 -253
  66. letta_client/batches/raw_client.py +457 -0
  67. letta_client/blocks/__init__.py +2 -0
  68. letta_client/blocks/agents/__init__.py +2 -0
  69. letta_client/blocks/agents/client.py +33 -70
  70. letta_client/blocks/agents/raw_client.py +144 -0
  71. letta_client/blocks/client.py +126 -424
  72. letta_client/blocks/raw_client.py +973 -0
  73. letta_client/client_side_access_tokens/__init__.py +2 -0
  74. letta_client/client_side_access_tokens/client.py +45 -216
  75. letta_client/client_side_access_tokens/raw_client.py +435 -0
  76. letta_client/client_side_access_tokens/types/__init__.py +2 -0
  77. letta_client/client_side_access_tokens/types/client_side_access_tokens_create_request_policy_item.py +4 -3
  78. letta_client/client_side_access_tokens/types/client_side_access_tokens_create_response.py +6 -5
  79. letta_client/client_side_access_tokens/types/client_side_access_tokens_create_response_policy.py +4 -3
  80. letta_client/client_side_access_tokens/types/client_side_access_tokens_create_response_policy_data_item.py +4 -3
  81. letta_client/client_side_access_tokens/types/client_side_access_tokens_list_client_side_access_tokens_response.py +6 -5
  82. letta_client/client_side_access_tokens/types/client_side_access_tokens_list_client_side_access_tokens_response_tokens_item.py +6 -5
  83. letta_client/client_side_access_tokens/types/client_side_access_tokens_list_client_side_access_tokens_response_tokens_item_policy.py +4 -3
  84. letta_client/client_side_access_tokens/types/client_side_access_tokens_list_client_side_access_tokens_response_tokens_item_policy_data_item.py +4 -3
  85. letta_client/core/__init__.py +5 -0
  86. letta_client/core/api_error.py +13 -5
  87. letta_client/core/client_wrapper.py +14 -5
  88. letta_client/core/force_multipart.py +16 -0
  89. letta_client/core/http_client.py +70 -26
  90. letta_client/core/http_response.py +55 -0
  91. letta_client/core/jsonable_encoder.py +0 -1
  92. letta_client/core/pydantic_utilities.py +70 -111
  93. letta_client/core/serialization.py +7 -3
  94. letta_client/core/unchecked_base_model.py +40 -4
  95. letta_client/embedding_models/__init__.py +2 -0
  96. letta_client/embedding_models/client.py +31 -65
  97. letta_client/embedding_models/raw_client.py +117 -0
  98. letta_client/errors/__init__.py +2 -0
  99. letta_client/errors/bad_request_error.py +4 -3
  100. letta_client/errors/conflict_error.py +4 -2
  101. letta_client/errors/internal_server_error.py +4 -3
  102. letta_client/errors/not_found_error.py +4 -3
  103. letta_client/errors/payment_required_error.py +4 -2
  104. letta_client/errors/unprocessable_entity_error.py +4 -2
  105. letta_client/folders/__init__.py +2 -0
  106. letta_client/folders/client.py +100 -564
  107. letta_client/folders/files/__init__.py +2 -0
  108. letta_client/folders/files/client.py +44 -189
  109. letta_client/folders/files/raw_client.py +391 -0
  110. letta_client/folders/passages/__init__.py +2 -0
  111. letta_client/folders/passages/client.py +33 -74
  112. letta_client/folders/passages/raw_client.py +162 -0
  113. letta_client/folders/raw_client.py +1084 -0
  114. letta_client/groups/__init__.py +2 -0
  115. letta_client/groups/client.py +87 -406
  116. letta_client/groups/messages/__init__.py +2 -0
  117. letta_client/groups/messages/client.py +110 -371
  118. letta_client/groups/messages/raw_client.py +881 -0
  119. letta_client/groups/messages/types/__init__.py +2 -0
  120. letta_client/groups/messages/types/letta_streaming_response.py +5 -4
  121. letta_client/groups/messages/types/messages_modify_request.py +3 -2
  122. letta_client/groups/messages/types/messages_modify_response.py +5 -4
  123. letta_client/groups/raw_client.py +807 -0
  124. letta_client/groups/types/__init__.py +2 -0
  125. letta_client/groups/types/group_create_manager_config.py +1 -0
  126. letta_client/groups/types/group_update_manager_config.py +1 -0
  127. letta_client/health/__init__.py +2 -0
  128. letta_client/health/client.py +31 -43
  129. letta_client/health/raw_client.py +85 -0
  130. letta_client/identities/__init__.py +2 -0
  131. letta_client/identities/client.py +115 -498
  132. letta_client/identities/properties/__init__.py +2 -0
  133. letta_client/identities/properties/client.py +32 -76
  134. letta_client/identities/properties/raw_client.py +152 -0
  135. letta_client/identities/raw_client.py +1010 -0
  136. letta_client/jobs/__init__.py +2 -0
  137. letta_client/jobs/client.py +67 -310
  138. letta_client/jobs/raw_client.py +624 -0
  139. letta_client/messages/__init__.py +2 -0
  140. letta_client/messages/client.py +41 -74
  141. letta_client/messages/raw_client.py +186 -0
  142. letta_client/models/__init__.py +2 -0
  143. letta_client/models/client.py +39 -73
  144. letta_client/models/raw_client.py +151 -0
  145. letta_client/projects/__init__.py +2 -0
  146. letta_client/projects/client.py +31 -53
  147. letta_client/projects/raw_client.py +125 -0
  148. letta_client/projects/types/__init__.py +2 -0
  149. letta_client/projects/types/projects_list_response.py +5 -4
  150. letta_client/projects/types/projects_list_response_projects_item.py +3 -2
  151. letta_client/providers/__init__.py +2 -0
  152. letta_client/providers/client.py +62 -335
  153. letta_client/providers/raw_client.py +664 -0
  154. letta_client/runs/__init__.py +2 -0
  155. letta_client/runs/client.py +56 -258
  156. letta_client/runs/messages/__init__.py +2 -0
  157. letta_client/runs/messages/client.py +34 -79
  158. letta_client/runs/messages/raw_client.py +209 -0
  159. letta_client/runs/raw_client.py +440 -0
  160. letta_client/runs/steps/__init__.py +2 -0
  161. letta_client/runs/steps/client.py +33 -76
  162. letta_client/runs/steps/raw_client.py +192 -0
  163. letta_client/runs/usage/__init__.py +2 -0
  164. letta_client/runs/usage/client.py +31 -66
  165. letta_client/runs/usage/raw_client.py +122 -0
  166. letta_client/sources/__init__.py +2 -0
  167. letta_client/sources/client.py +107 -625
  168. letta_client/sources/files/__init__.py +2 -0
  169. letta_client/sources/files/client.py +44 -189
  170. letta_client/sources/files/raw_client.py +391 -0
  171. letta_client/sources/passages/__init__.py +2 -0
  172. letta_client/sources/passages/client.py +33 -74
  173. letta_client/sources/passages/raw_client.py +162 -0
  174. letta_client/sources/raw_client.py +1209 -0
  175. letta_client/steps/__init__.py +2 -0
  176. letta_client/steps/client.py +65 -153
  177. letta_client/steps/feedback/__init__.py +2 -0
  178. letta_client/steps/feedback/client.py +32 -73
  179. letta_client/steps/feedback/raw_client.py +141 -0
  180. letta_client/steps/raw_client.py +355 -0
  181. letta_client/steps/types/__init__.py +2 -0
  182. letta_client/tags/__init__.py +2 -0
  183. letta_client/tags/client.py +33 -73
  184. letta_client/tags/raw_client.py +148 -0
  185. letta_client/telemetry/__init__.py +2 -0
  186. letta_client/telemetry/client.py +31 -66
  187. letta_client/telemetry/raw_client.py +118 -0
  188. letta_client/templates/__init__.py +2 -0
  189. letta_client/templates/agents/__init__.py +2 -0
  190. letta_client/templates/agents/client.py +48 -96
  191. letta_client/templates/agents/raw_client.py +227 -0
  192. letta_client/templates/agents/types/__init__.py +2 -0
  193. letta_client/templates/agents/types/agents_create_request_initial_message_sequence_item.py +4 -3
  194. letta_client/templates/agents/types/agents_create_response.py +4 -3
  195. letta_client/templates/client.py +36 -57
  196. letta_client/templates/raw_client.py +133 -0
  197. letta_client/templates/types/__init__.py +2 -0
  198. letta_client/templates/types/templates_list_response.py +5 -4
  199. letta_client/templates/types/templates_list_response_templates_item.py +3 -2
  200. letta_client/tools/__init__.py +2 -0
  201. letta_client/tools/client.py +195 -1322
  202. letta_client/tools/raw_client.py +2565 -0
  203. letta_client/tools/types/__init__.py +2 -0
  204. letta_client/tools/types/add_mcp_server_request.py +2 -1
  205. letta_client/tools/types/add_mcp_server_response_item.py +2 -1
  206. letta_client/tools/types/connect_mcp_server_request.py +2 -1
  207. letta_client/tools/types/delete_mcp_server_response_item.py +2 -1
  208. letta_client/tools/types/list_mcp_servers_response_value.py +1 -0
  209. letta_client/tools/types/streaming_response.py +5 -4
  210. letta_client/tools/types/test_mcp_server_request.py +2 -1
  211. letta_client/tools/types/update_mcp_server_request.py +2 -1
  212. letta_client/tools/types/update_mcp_server_response.py +2 -1
  213. letta_client/types/__init__.py +2 -0
  214. letta_client/types/action_model.py +6 -5
  215. letta_client/types/action_parameters_model.py +3 -2
  216. letta_client/types/action_response_model.py +3 -2
  217. letta_client/types/agent_environment_variable.py +3 -2
  218. letta_client/types/agent_schema.py +7 -6
  219. letta_client/types/agent_schema_tool_rules_item.py +2 -1
  220. letta_client/types/agent_state.py +9 -8
  221. letta_client/types/agent_state_response_format.py +1 -0
  222. letta_client/types/agent_state_tool_rules_item.py +4 -3
  223. letta_client/types/app_auth_scheme.py +4 -3
  224. letta_client/types/app_model.py +5 -4
  225. letta_client/types/assistant_message.py +3 -2
  226. letta_client/types/assistant_message_content.py +1 -0
  227. letta_client/types/audio.py +3 -2
  228. letta_client/types/auth_request.py +2 -1
  229. letta_client/types/auth_response.py +5 -4
  230. letta_client/types/auth_scheme_field.py +3 -2
  231. letta_client/types/bad_request_error_body.py +3 -2
  232. letta_client/types/base_64_image.py +2 -1
  233. letta_client/types/base_tool_rule_schema.py +3 -2
  234. letta_client/types/batch_job.py +4 -3
  235. letta_client/types/block.py +3 -2
  236. letta_client/types/block_update.py +2 -1
  237. letta_client/types/chat_completion_assistant_message_param.py +5 -4
  238. letta_client/types/chat_completion_assistant_message_param_content.py +1 -0
  239. letta_client/types/chat_completion_assistant_message_param_content_item.py +2 -1
  240. letta_client/types/chat_completion_audio_param.py +4 -3
  241. letta_client/types/chat_completion_content_part_image_param.py +4 -3
  242. letta_client/types/chat_completion_content_part_input_audio_param.py +4 -3
  243. letta_client/types/chat_completion_content_part_refusal_param.py +3 -2
  244. letta_client/types/chat_completion_content_part_text_param.py +3 -2
  245. letta_client/types/chat_completion_developer_message_param.py +4 -3
  246. letta_client/types/chat_completion_developer_message_param_content.py +1 -0
  247. letta_client/types/chat_completion_function_call_option_param.py +3 -2
  248. letta_client/types/chat_completion_function_message_param.py +3 -2
  249. letta_client/types/chat_completion_message_tool_call.py +4 -3
  250. letta_client/types/chat_completion_message_tool_call_param.py +4 -3
  251. letta_client/types/chat_completion_named_tool_choice_param.py +4 -3
  252. letta_client/types/chat_completion_prediction_content_param.py +4 -3
  253. letta_client/types/chat_completion_prediction_content_param_content.py +1 -0
  254. letta_client/types/chat_completion_stream_options_param.py +3 -2
  255. letta_client/types/chat_completion_system_message_param.py +4 -3
  256. letta_client/types/chat_completion_system_message_param_content.py +1 -0
  257. letta_client/types/chat_completion_tool_message_param.py +4 -3
  258. letta_client/types/chat_completion_tool_message_param_content.py +1 -0
  259. letta_client/types/chat_completion_tool_param.py +4 -3
  260. letta_client/types/chat_completion_user_message_param.py +4 -3
  261. letta_client/types/chat_completion_user_message_param_content.py +1 -0
  262. letta_client/types/chat_completion_user_message_param_content_item.py +2 -1
  263. letta_client/types/child_tool_rule.py +3 -2
  264. letta_client/types/child_tool_rule_schema.py +3 -2
  265. letta_client/types/code_input.py +3 -2
  266. letta_client/types/completion_create_params_non_streaming.py +10 -9
  267. letta_client/types/completion_create_params_non_streaming_function_call.py +1 -0
  268. letta_client/types/completion_create_params_non_streaming_messages_item.py +4 -3
  269. letta_client/types/completion_create_params_non_streaming_response_format.py +3 -2
  270. letta_client/types/completion_create_params_non_streaming_tool_choice.py +1 -0
  271. letta_client/types/completion_create_params_streaming.py +10 -9
  272. letta_client/types/completion_create_params_streaming_function_call.py +1 -0
  273. letta_client/types/completion_create_params_streaming_messages_item.py +4 -3
  274. letta_client/types/completion_create_params_streaming_response_format.py +3 -2
  275. letta_client/types/completion_create_params_streaming_tool_choice.py +1 -0
  276. letta_client/types/conditional_tool_rule.py +3 -2
  277. letta_client/types/conditional_tool_rule_schema.py +3 -2
  278. letta_client/types/conflict_error_body.py +3 -2
  279. letta_client/types/context_window_overview.py +4 -3
  280. letta_client/types/continue_tool_rule.py +3 -2
  281. letta_client/types/core_memory_block_schema.py +4 -3
  282. letta_client/types/create_block.py +3 -2
  283. letta_client/types/dynamic_manager.py +2 -1
  284. letta_client/types/dynamic_manager_update.py +2 -1
  285. letta_client/types/e_2_b_sandbox_config.py +2 -1
  286. letta_client/types/embedding_config.py +4 -3
  287. letta_client/types/file.py +4 -3
  288. letta_client/types/file_block.py +4 -3
  289. letta_client/types/file_file.py +3 -2
  290. letta_client/types/file_metadata.py +5 -4
  291. letta_client/types/file_stats.py +3 -2
  292. letta_client/types/folder.py +5 -4
  293. letta_client/types/function_call.py +3 -2
  294. letta_client/types/function_definition_input.py +3 -2
  295. letta_client/types/function_definition_output.py +3 -2
  296. letta_client/types/function_output.py +3 -2
  297. letta_client/types/function_tool.py +4 -3
  298. letta_client/types/generate_tool_input.py +3 -2
  299. letta_client/types/generate_tool_output.py +4 -3
  300. letta_client/types/group.py +4 -3
  301. letta_client/types/health.py +3 -2
  302. letta_client/types/hidden_reasoning_message.py +4 -3
  303. letta_client/types/http_validation_error.py +4 -3
  304. letta_client/types/identity.py +4 -3
  305. letta_client/types/identity_property.py +5 -4
  306. letta_client/types/image_content.py +3 -2
  307. letta_client/types/image_content_source.py +1 -0
  308. letta_client/types/image_url.py +4 -3
  309. letta_client/types/init_tool_rule.py +3 -2
  310. letta_client/types/input_audio.py +4 -3
  311. letta_client/types/internal_server_error_body.py +3 -2
  312. letta_client/types/job.py +4 -3
  313. letta_client/types/json_object_response_format.py +3 -2
  314. letta_client/types/json_schema.py +4 -3
  315. letta_client/types/json_schema_response_format.py +2 -1
  316. letta_client/types/letta_batch_messages.py +4 -3
  317. letta_client/types/letta_batch_request.py +4 -3
  318. letta_client/types/letta_image.py +2 -1
  319. letta_client/types/letta_message_content_union.py +4 -3
  320. letta_client/types/letta_message_union.py +5 -4
  321. letta_client/types/letta_ping.py +2 -1
  322. letta_client/types/letta_request.py +4 -3
  323. letta_client/types/letta_request_config.py +3 -2
  324. letta_client/types/letta_response.py +4 -3
  325. letta_client/types/letta_stop_reason.py +3 -2
  326. letta_client/types/letta_streaming_request.py +9 -3
  327. letta_client/types/letta_usage_statistics.py +3 -2
  328. letta_client/types/letta_user_message_content_union.py +2 -1
  329. letta_client/types/llm_config.py +6 -5
  330. letta_client/types/local_sandbox_config.py +3 -2
  331. letta_client/types/max_count_per_step_tool_rule.py +3 -2
  332. letta_client/types/max_count_per_step_tool_rule_schema.py +3 -2
  333. letta_client/types/mcp_tool.py +4 -3
  334. letta_client/types/memory.py +4 -3
  335. letta_client/types/message.py +6 -5
  336. letta_client/types/message_content_item.py +1 -0
  337. letta_client/types/message_create.py +5 -4
  338. letta_client/types/message_create_content.py +1 -0
  339. letta_client/types/message_schema.py +4 -3
  340. letta_client/types/modal_sandbox_config.py +2 -1
  341. letta_client/types/not_found_error_body.py +3 -2
  342. letta_client/types/omitted_reasoning_content.py +3 -2
  343. letta_client/types/openai_types_chat_chat_completion_message_tool_call_param_function.py +3 -2
  344. letta_client/types/openai_types_chat_chat_completion_named_tool_choice_param_function.py +3 -2
  345. letta_client/types/openai_types_chat_completion_create_params_function.py +3 -2
  346. letta_client/types/organization.py +3 -2
  347. letta_client/types/organization_create.py +2 -1
  348. letta_client/types/organization_sources_stats.py +3 -2
  349. letta_client/types/organization_update.py +2 -1
  350. letta_client/types/parameter_properties.py +3 -2
  351. letta_client/types/parameters_schema.py +4 -3
  352. letta_client/types/parent_tool_rule.py +3 -2
  353. letta_client/types/passage.py +4 -3
  354. letta_client/types/payment_required_error_body.py +3 -2
  355. letta_client/types/pip_requirement.py +3 -2
  356. letta_client/types/provider.py +5 -4
  357. letta_client/types/provider_check.py +4 -3
  358. letta_client/types/provider_trace.py +3 -2
  359. letta_client/types/reasoning_content.py +2 -1
  360. letta_client/types/reasoning_message.py +4 -3
  361. letta_client/types/redacted_reasoning_content.py +2 -1
  362. letta_client/types/required_before_exit_tool_rule.py +3 -2
  363. letta_client/types/response_format_json_object.py +3 -2
  364. letta_client/types/response_format_json_schema.py +4 -3
  365. letta_client/types/response_format_text.py +3 -2
  366. letta_client/types/round_robin_manager.py +2 -1
  367. letta_client/types/round_robin_manager_update.py +2 -1
  368. letta_client/types/run.py +4 -3
  369. letta_client/types/sandbox_config.py +4 -3
  370. letta_client/types/sandbox_config_create.py +4 -3
  371. letta_client/types/sandbox_config_create_config.py +2 -1
  372. letta_client/types/sandbox_config_update.py +3 -2
  373. letta_client/types/sandbox_config_update_config.py +2 -1
  374. letta_client/types/sandbox_environment_variable.py +3 -2
  375. letta_client/types/sandbox_environment_variable_create.py +3 -2
  376. letta_client/types/sandbox_environment_variable_update.py +2 -1
  377. letta_client/types/sleeptime_manager.py +2 -1
  378. letta_client/types/sleeptime_manager_update.py +2 -1
  379. letta_client/types/source.py +5 -4
  380. letta_client/types/source_create.py +4 -3
  381. letta_client/types/source_stats.py +4 -3
  382. letta_client/types/source_update.py +3 -2
  383. letta_client/types/sse_server_config.py +4 -3
  384. letta_client/types/stdio_server_config.py +4 -3
  385. letta_client/types/step.py +5 -4
  386. letta_client/types/streamable_http_server_config.py +4 -3
  387. letta_client/types/supervisor_manager.py +2 -1
  388. letta_client/types/supervisor_manager_update.py +2 -1
  389. letta_client/types/system_message.py +2 -1
  390. letta_client/types/tag_schema.py +3 -2
  391. letta_client/types/terminal_tool_rule.py +3 -2
  392. letta_client/types/text_content.py +2 -1
  393. letta_client/types/text_response_format.py +3 -2
  394. letta_client/types/tool.py +5 -4
  395. letta_client/types/tool_annotations.py +4 -3
  396. letta_client/types/tool_call.py +3 -2
  397. letta_client/types/tool_call_content.py +2 -1
  398. letta_client/types/tool_call_delta.py +3 -2
  399. letta_client/types/tool_call_message.py +4 -3
  400. letta_client/types/tool_call_message_tool_call.py +1 -0
  401. letta_client/types/tool_create.py +3 -2
  402. letta_client/types/tool_env_var_schema.py +3 -2
  403. letta_client/types/tool_json_schema.py +4 -3
  404. letta_client/types/tool_return.py +4 -3
  405. letta_client/types/tool_return_content.py +2 -1
  406. letta_client/types/tool_return_message.py +4 -3
  407. letta_client/types/tool_schema.py +5 -4
  408. letta_client/types/update_assistant_message.py +3 -2
  409. letta_client/types/update_assistant_message_content.py +1 -0
  410. letta_client/types/update_reasoning_message.py +3 -2
  411. letta_client/types/update_ssemcp_server.py +2 -1
  412. letta_client/types/update_stdio_mcp_server.py +3 -2
  413. letta_client/types/update_streamable_httpmcp_server.py +2 -1
  414. letta_client/types/update_system_message.py +2 -1
  415. letta_client/types/update_user_message.py +3 -2
  416. letta_client/types/update_user_message_content.py +1 -0
  417. letta_client/types/url_image.py +2 -1
  418. letta_client/types/usage_statistics.py +5 -4
  419. letta_client/types/usage_statistics_completion_token_details.py +3 -2
  420. letta_client/types/usage_statistics_prompt_token_details.py +3 -2
  421. letta_client/types/user.py +3 -2
  422. letta_client/types/user_create.py +3 -2
  423. letta_client/types/user_message.py +3 -2
  424. letta_client/types/user_message_content.py +1 -0
  425. letta_client/types/user_update.py +3 -2
  426. letta_client/types/validation_error.py +4 -3
  427. letta_client/types/voice_sleeptime_manager.py +2 -1
  428. letta_client/types/voice_sleeptime_manager_update.py +2 -1
  429. letta_client/types/web_search_options.py +4 -3
  430. letta_client/types/web_search_options_user_location.py +4 -3
  431. letta_client/types/web_search_options_user_location_approximate.py +3 -2
  432. letta_client/voice/__init__.py +2 -0
  433. letta_client/voice/client.py +33 -74
  434. letta_client/voice/raw_client.py +154 -0
  435. {letta_client-0.1.233.dist-info → letta_client-0.1.234.dist-info}/METADATA +24 -3
  436. letta_client-0.1.234.dist-info/RECORD +503 -0
  437. letta_client-0.1.233.dist-info/RECORD +0 -455
  438. {letta_client-0.1.233.dist-info → letta_client-0.1.234.dist-info}/WHEEL +0 -0
@@ -0,0 +1,1084 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+ from json.decoder import JSONDecodeError
5
+
6
+ from ..core.api_error import ApiError
7
+ from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
8
+ from ..core.http_response import AsyncHttpResponse, HttpResponse
9
+ from ..core.jsonable_encoder import jsonable_encoder
10
+ from ..core.request_options import RequestOptions
11
+ from ..core.serialization import convert_and_respect_annotation_metadata
12
+ from ..core.unchecked_base_model import construct_type
13
+ from ..errors.unprocessable_entity_error import UnprocessableEntityError
14
+ from ..types.embedding_config import EmbeddingConfig
15
+ from ..types.folder import Folder
16
+ from ..types.http_validation_error import HttpValidationError
17
+ from ..types.organization_sources_stats import OrganizationSourcesStats
18
+
19
+ # this is used as the default value for optional parameters
20
+ OMIT = typing.cast(typing.Any, ...)
21
+
22
+
23
+ class RawFoldersClient:
24
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
25
+ self._client_wrapper = client_wrapper
26
+
27
+ def count(self, *, request_options: typing.Optional[RequestOptions] = None) -> HttpResponse[int]:
28
+ """
29
+ Count all data folders created by a user.
30
+
31
+ Parameters
32
+ ----------
33
+ request_options : typing.Optional[RequestOptions]
34
+ Request-specific configuration.
35
+
36
+ Returns
37
+ -------
38
+ HttpResponse[int]
39
+ Successful Response
40
+ """
41
+ _response = self._client_wrapper.httpx_client.request(
42
+ "v1/folders/count",
43
+ method="GET",
44
+ request_options=request_options,
45
+ )
46
+ try:
47
+ if 200 <= _response.status_code < 300:
48
+ _data = typing.cast(
49
+ int,
50
+ construct_type(
51
+ type_=int, # type: ignore
52
+ object_=_response.json(),
53
+ ),
54
+ )
55
+ return HttpResponse(response=_response, data=_data)
56
+ if _response.status_code == 422:
57
+ raise UnprocessableEntityError(
58
+ headers=dict(_response.headers),
59
+ body=typing.cast(
60
+ HttpValidationError,
61
+ construct_type(
62
+ type_=HttpValidationError, # type: ignore
63
+ object_=_response.json(),
64
+ ),
65
+ ),
66
+ )
67
+ _response_json = _response.json()
68
+ except JSONDecodeError:
69
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
70
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
71
+
72
+ def retrieve(
73
+ self, folder_id: str, *, request_options: typing.Optional[RequestOptions] = None
74
+ ) -> HttpResponse[Folder]:
75
+ """
76
+ Get a folder by ID
77
+
78
+ Parameters
79
+ ----------
80
+ folder_id : str
81
+
82
+ request_options : typing.Optional[RequestOptions]
83
+ Request-specific configuration.
84
+
85
+ Returns
86
+ -------
87
+ HttpResponse[Folder]
88
+ Successful Response
89
+ """
90
+ _response = self._client_wrapper.httpx_client.request(
91
+ f"v1/folders/{jsonable_encoder(folder_id)}",
92
+ method="GET",
93
+ request_options=request_options,
94
+ )
95
+ try:
96
+ if 200 <= _response.status_code < 300:
97
+ _data = typing.cast(
98
+ Folder,
99
+ construct_type(
100
+ type_=Folder, # type: ignore
101
+ object_=_response.json(),
102
+ ),
103
+ )
104
+ return HttpResponse(response=_response, data=_data)
105
+ if _response.status_code == 422:
106
+ raise UnprocessableEntityError(
107
+ headers=dict(_response.headers),
108
+ body=typing.cast(
109
+ HttpValidationError,
110
+ construct_type(
111
+ type_=HttpValidationError, # type: ignore
112
+ object_=_response.json(),
113
+ ),
114
+ ),
115
+ )
116
+ _response_json = _response.json()
117
+ except JSONDecodeError:
118
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
119
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
120
+
121
+ def delete(
122
+ self, folder_id: str, *, request_options: typing.Optional[RequestOptions] = None
123
+ ) -> HttpResponse[typing.Optional[typing.Any]]:
124
+ """
125
+ Delete a data folder.
126
+
127
+ Parameters
128
+ ----------
129
+ folder_id : str
130
+
131
+ request_options : typing.Optional[RequestOptions]
132
+ Request-specific configuration.
133
+
134
+ Returns
135
+ -------
136
+ HttpResponse[typing.Optional[typing.Any]]
137
+ Successful Response
138
+ """
139
+ _response = self._client_wrapper.httpx_client.request(
140
+ f"v1/folders/{jsonable_encoder(folder_id)}",
141
+ method="DELETE",
142
+ request_options=request_options,
143
+ )
144
+ try:
145
+ if _response is None or not _response.text.strip():
146
+ return HttpResponse(response=_response, data=None)
147
+ if 200 <= _response.status_code < 300:
148
+ _data = typing.cast(
149
+ typing.Optional[typing.Any],
150
+ construct_type(
151
+ type_=typing.Optional[typing.Any], # type: ignore
152
+ object_=_response.json(),
153
+ ),
154
+ )
155
+ return HttpResponse(response=_response, data=_data)
156
+ if _response.status_code == 422:
157
+ raise UnprocessableEntityError(
158
+ headers=dict(_response.headers),
159
+ body=typing.cast(
160
+ HttpValidationError,
161
+ construct_type(
162
+ type_=HttpValidationError, # type: ignore
163
+ object_=_response.json(),
164
+ ),
165
+ ),
166
+ )
167
+ _response_json = _response.json()
168
+ except JSONDecodeError:
169
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
170
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
171
+
172
+ def modify(
173
+ self,
174
+ folder_id: str,
175
+ *,
176
+ name: typing.Optional[str] = OMIT,
177
+ description: typing.Optional[str] = OMIT,
178
+ instructions: typing.Optional[str] = OMIT,
179
+ metadata: typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]] = OMIT,
180
+ embedding_config: typing.Optional[EmbeddingConfig] = OMIT,
181
+ request_options: typing.Optional[RequestOptions] = None,
182
+ ) -> HttpResponse[Folder]:
183
+ """
184
+ Update the name or documentation of an existing data folder.
185
+
186
+ Parameters
187
+ ----------
188
+ folder_id : str
189
+
190
+ name : typing.Optional[str]
191
+ The name of the source.
192
+
193
+ description : typing.Optional[str]
194
+ The description of the source.
195
+
196
+ instructions : typing.Optional[str]
197
+ Instructions for how to use the source.
198
+
199
+ metadata : typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]]
200
+ Metadata associated with the source.
201
+
202
+ embedding_config : typing.Optional[EmbeddingConfig]
203
+ The embedding configuration used by the source.
204
+
205
+ request_options : typing.Optional[RequestOptions]
206
+ Request-specific configuration.
207
+
208
+ Returns
209
+ -------
210
+ HttpResponse[Folder]
211
+ Successful Response
212
+ """
213
+ _response = self._client_wrapper.httpx_client.request(
214
+ f"v1/folders/{jsonable_encoder(folder_id)}",
215
+ method="PATCH",
216
+ json={
217
+ "name": name,
218
+ "description": description,
219
+ "instructions": instructions,
220
+ "metadata": metadata,
221
+ "embedding_config": convert_and_respect_annotation_metadata(
222
+ object_=embedding_config, annotation=EmbeddingConfig, direction="write"
223
+ ),
224
+ },
225
+ headers={
226
+ "content-type": "application/json",
227
+ },
228
+ request_options=request_options,
229
+ omit=OMIT,
230
+ )
231
+ try:
232
+ if 200 <= _response.status_code < 300:
233
+ _data = typing.cast(
234
+ Folder,
235
+ construct_type(
236
+ type_=Folder, # type: ignore
237
+ object_=_response.json(),
238
+ ),
239
+ )
240
+ return HttpResponse(response=_response, data=_data)
241
+ if _response.status_code == 422:
242
+ raise UnprocessableEntityError(
243
+ headers=dict(_response.headers),
244
+ body=typing.cast(
245
+ HttpValidationError,
246
+ construct_type(
247
+ type_=HttpValidationError, # type: ignore
248
+ object_=_response.json(),
249
+ ),
250
+ ),
251
+ )
252
+ _response_json = _response.json()
253
+ except JSONDecodeError:
254
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
255
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
256
+
257
+ def retrieve_by_name(
258
+ self, folder_name: str, *, request_options: typing.Optional[RequestOptions] = None
259
+ ) -> HttpResponse[str]:
260
+ """
261
+ Get a folder by name
262
+
263
+ Parameters
264
+ ----------
265
+ folder_name : str
266
+
267
+ request_options : typing.Optional[RequestOptions]
268
+ Request-specific configuration.
269
+
270
+ Returns
271
+ -------
272
+ HttpResponse[str]
273
+ Successful Response
274
+ """
275
+ _response = self._client_wrapper.httpx_client.request(
276
+ f"v1/folders/name/{jsonable_encoder(folder_name)}",
277
+ method="GET",
278
+ request_options=request_options,
279
+ )
280
+ try:
281
+ if 200 <= _response.status_code < 300:
282
+ _data = typing.cast(
283
+ str,
284
+ construct_type(
285
+ type_=str, # type: ignore
286
+ object_=_response.json(),
287
+ ),
288
+ )
289
+ return HttpResponse(response=_response, data=_data)
290
+ if _response.status_code == 422:
291
+ raise UnprocessableEntityError(
292
+ headers=dict(_response.headers),
293
+ body=typing.cast(
294
+ HttpValidationError,
295
+ construct_type(
296
+ type_=HttpValidationError, # type: ignore
297
+ object_=_response.json(),
298
+ ),
299
+ ),
300
+ )
301
+ _response_json = _response.json()
302
+ except JSONDecodeError:
303
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
304
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
305
+
306
+ def get_folders_metadata(
307
+ self,
308
+ *,
309
+ include_detailed_per_source_metadata: typing.Optional[bool] = None,
310
+ request_options: typing.Optional[RequestOptions] = None,
311
+ ) -> HttpResponse[OrganizationSourcesStats]:
312
+ """
313
+ Get aggregated metadata for all folders in an organization.
314
+
315
+ Returns structured metadata including:
316
+ - Total number of folders
317
+ - Total number of files across all folders
318
+ - Total size of all files
319
+ - Per-source breakdown with file details (file_name, file_size per file) if include_detailed_per_source_metadata is True
320
+
321
+ Parameters
322
+ ----------
323
+ include_detailed_per_source_metadata : typing.Optional[bool]
324
+
325
+ request_options : typing.Optional[RequestOptions]
326
+ Request-specific configuration.
327
+
328
+ Returns
329
+ -------
330
+ HttpResponse[OrganizationSourcesStats]
331
+ Successful Response
332
+ """
333
+ _response = self._client_wrapper.httpx_client.request(
334
+ "v1/folders/metadata",
335
+ method="GET",
336
+ params={
337
+ "include_detailed_per_source_metadata": include_detailed_per_source_metadata,
338
+ },
339
+ request_options=request_options,
340
+ )
341
+ try:
342
+ if 200 <= _response.status_code < 300:
343
+ _data = typing.cast(
344
+ OrganizationSourcesStats,
345
+ construct_type(
346
+ type_=OrganizationSourcesStats, # type: ignore
347
+ object_=_response.json(),
348
+ ),
349
+ )
350
+ return HttpResponse(response=_response, data=_data)
351
+ if _response.status_code == 422:
352
+ raise UnprocessableEntityError(
353
+ headers=dict(_response.headers),
354
+ body=typing.cast(
355
+ HttpValidationError,
356
+ construct_type(
357
+ type_=HttpValidationError, # type: ignore
358
+ object_=_response.json(),
359
+ ),
360
+ ),
361
+ )
362
+ _response_json = _response.json()
363
+ except JSONDecodeError:
364
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
365
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
366
+
367
+ def list(self, *, request_options: typing.Optional[RequestOptions] = None) -> HttpResponse[typing.List[Folder]]:
368
+ """
369
+ List all data folders created by a user.
370
+
371
+ Parameters
372
+ ----------
373
+ request_options : typing.Optional[RequestOptions]
374
+ Request-specific configuration.
375
+
376
+ Returns
377
+ -------
378
+ HttpResponse[typing.List[Folder]]
379
+ Successful Response
380
+ """
381
+ _response = self._client_wrapper.httpx_client.request(
382
+ "v1/folders/",
383
+ method="GET",
384
+ request_options=request_options,
385
+ )
386
+ try:
387
+ if 200 <= _response.status_code < 300:
388
+ _data = typing.cast(
389
+ typing.List[Folder],
390
+ construct_type(
391
+ type_=typing.List[Folder], # type: ignore
392
+ object_=_response.json(),
393
+ ),
394
+ )
395
+ return HttpResponse(response=_response, data=_data)
396
+ if _response.status_code == 422:
397
+ raise UnprocessableEntityError(
398
+ headers=dict(_response.headers),
399
+ body=typing.cast(
400
+ HttpValidationError,
401
+ construct_type(
402
+ type_=HttpValidationError, # type: ignore
403
+ object_=_response.json(),
404
+ ),
405
+ ),
406
+ )
407
+ _response_json = _response.json()
408
+ except JSONDecodeError:
409
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
410
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
411
+
412
+ def create(
413
+ self,
414
+ *,
415
+ name: str,
416
+ description: typing.Optional[str] = OMIT,
417
+ instructions: typing.Optional[str] = OMIT,
418
+ metadata: typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]] = OMIT,
419
+ embedding: typing.Optional[str] = OMIT,
420
+ embedding_chunk_size: typing.Optional[int] = OMIT,
421
+ embedding_config: typing.Optional[EmbeddingConfig] = OMIT,
422
+ request_options: typing.Optional[RequestOptions] = None,
423
+ ) -> HttpResponse[Folder]:
424
+ """
425
+ Create a new data folder.
426
+
427
+ Parameters
428
+ ----------
429
+ name : str
430
+ The name of the source.
431
+
432
+ description : typing.Optional[str]
433
+ The description of the source.
434
+
435
+ instructions : typing.Optional[str]
436
+ Instructions for how to use the source.
437
+
438
+ metadata : typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]]
439
+ Metadata associated with the source.
440
+
441
+ embedding : typing.Optional[str]
442
+ The handle for the embedding config used by the source.
443
+
444
+ embedding_chunk_size : typing.Optional[int]
445
+ The chunk size of the embedding.
446
+
447
+ embedding_config : typing.Optional[EmbeddingConfig]
448
+ (Legacy) The embedding configuration used by the source.
449
+
450
+ request_options : typing.Optional[RequestOptions]
451
+ Request-specific configuration.
452
+
453
+ Returns
454
+ -------
455
+ HttpResponse[Folder]
456
+ Successful Response
457
+ """
458
+ _response = self._client_wrapper.httpx_client.request(
459
+ "v1/folders/",
460
+ method="POST",
461
+ json={
462
+ "name": name,
463
+ "description": description,
464
+ "instructions": instructions,
465
+ "metadata": metadata,
466
+ "embedding": embedding,
467
+ "embedding_chunk_size": embedding_chunk_size,
468
+ "embedding_config": convert_and_respect_annotation_metadata(
469
+ object_=embedding_config, annotation=EmbeddingConfig, direction="write"
470
+ ),
471
+ },
472
+ headers={
473
+ "content-type": "application/json",
474
+ },
475
+ request_options=request_options,
476
+ omit=OMIT,
477
+ )
478
+ try:
479
+ if 200 <= _response.status_code < 300:
480
+ _data = typing.cast(
481
+ Folder,
482
+ construct_type(
483
+ type_=Folder, # type: ignore
484
+ object_=_response.json(),
485
+ ),
486
+ )
487
+ return HttpResponse(response=_response, data=_data)
488
+ if _response.status_code == 422:
489
+ raise UnprocessableEntityError(
490
+ headers=dict(_response.headers),
491
+ body=typing.cast(
492
+ HttpValidationError,
493
+ construct_type(
494
+ type_=HttpValidationError, # type: ignore
495
+ object_=_response.json(),
496
+ ),
497
+ ),
498
+ )
499
+ _response_json = _response.json()
500
+ except JSONDecodeError:
501
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
502
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
503
+
504
+ def get_agents_for_folder(
505
+ self, folder_id: str, *, request_options: typing.Optional[RequestOptions] = None
506
+ ) -> HttpResponse[typing.List[str]]:
507
+ """
508
+ Get all agent IDs that have the specified folder attached.
509
+
510
+ Parameters
511
+ ----------
512
+ folder_id : str
513
+
514
+ request_options : typing.Optional[RequestOptions]
515
+ Request-specific configuration.
516
+
517
+ Returns
518
+ -------
519
+ HttpResponse[typing.List[str]]
520
+ Successful Response
521
+ """
522
+ _response = self._client_wrapper.httpx_client.request(
523
+ f"v1/folders/{jsonable_encoder(folder_id)}/agents",
524
+ method="GET",
525
+ request_options=request_options,
526
+ )
527
+ try:
528
+ if 200 <= _response.status_code < 300:
529
+ _data = typing.cast(
530
+ typing.List[str],
531
+ construct_type(
532
+ type_=typing.List[str], # type: ignore
533
+ object_=_response.json(),
534
+ ),
535
+ )
536
+ return HttpResponse(response=_response, data=_data)
537
+ if _response.status_code == 422:
538
+ raise UnprocessableEntityError(
539
+ headers=dict(_response.headers),
540
+ body=typing.cast(
541
+ HttpValidationError,
542
+ construct_type(
543
+ type_=HttpValidationError, # type: ignore
544
+ object_=_response.json(),
545
+ ),
546
+ ),
547
+ )
548
+ _response_json = _response.json()
549
+ except JSONDecodeError:
550
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
551
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
552
+
553
+
554
+ class AsyncRawFoldersClient:
555
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
556
+ self._client_wrapper = client_wrapper
557
+
558
+ async def count(self, *, request_options: typing.Optional[RequestOptions] = None) -> AsyncHttpResponse[int]:
559
+ """
560
+ Count all data folders created by a user.
561
+
562
+ Parameters
563
+ ----------
564
+ request_options : typing.Optional[RequestOptions]
565
+ Request-specific configuration.
566
+
567
+ Returns
568
+ -------
569
+ AsyncHttpResponse[int]
570
+ Successful Response
571
+ """
572
+ _response = await self._client_wrapper.httpx_client.request(
573
+ "v1/folders/count",
574
+ method="GET",
575
+ request_options=request_options,
576
+ )
577
+ try:
578
+ if 200 <= _response.status_code < 300:
579
+ _data = typing.cast(
580
+ int,
581
+ construct_type(
582
+ type_=int, # type: ignore
583
+ object_=_response.json(),
584
+ ),
585
+ )
586
+ return AsyncHttpResponse(response=_response, data=_data)
587
+ if _response.status_code == 422:
588
+ raise UnprocessableEntityError(
589
+ headers=dict(_response.headers),
590
+ body=typing.cast(
591
+ HttpValidationError,
592
+ construct_type(
593
+ type_=HttpValidationError, # type: ignore
594
+ object_=_response.json(),
595
+ ),
596
+ ),
597
+ )
598
+ _response_json = _response.json()
599
+ except JSONDecodeError:
600
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
601
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
602
+
603
+ async def retrieve(
604
+ self, folder_id: str, *, request_options: typing.Optional[RequestOptions] = None
605
+ ) -> AsyncHttpResponse[Folder]:
606
+ """
607
+ Get a folder by ID
608
+
609
+ Parameters
610
+ ----------
611
+ folder_id : str
612
+
613
+ request_options : typing.Optional[RequestOptions]
614
+ Request-specific configuration.
615
+
616
+ Returns
617
+ -------
618
+ AsyncHttpResponse[Folder]
619
+ Successful Response
620
+ """
621
+ _response = await self._client_wrapper.httpx_client.request(
622
+ f"v1/folders/{jsonable_encoder(folder_id)}",
623
+ method="GET",
624
+ request_options=request_options,
625
+ )
626
+ try:
627
+ if 200 <= _response.status_code < 300:
628
+ _data = typing.cast(
629
+ Folder,
630
+ construct_type(
631
+ type_=Folder, # type: ignore
632
+ object_=_response.json(),
633
+ ),
634
+ )
635
+ return AsyncHttpResponse(response=_response, data=_data)
636
+ if _response.status_code == 422:
637
+ raise UnprocessableEntityError(
638
+ headers=dict(_response.headers),
639
+ body=typing.cast(
640
+ HttpValidationError,
641
+ construct_type(
642
+ type_=HttpValidationError, # type: ignore
643
+ object_=_response.json(),
644
+ ),
645
+ ),
646
+ )
647
+ _response_json = _response.json()
648
+ except JSONDecodeError:
649
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
650
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
651
+
652
+ async def delete(
653
+ self, folder_id: str, *, request_options: typing.Optional[RequestOptions] = None
654
+ ) -> AsyncHttpResponse[typing.Optional[typing.Any]]:
655
+ """
656
+ Delete a data folder.
657
+
658
+ Parameters
659
+ ----------
660
+ folder_id : str
661
+
662
+ request_options : typing.Optional[RequestOptions]
663
+ Request-specific configuration.
664
+
665
+ Returns
666
+ -------
667
+ AsyncHttpResponse[typing.Optional[typing.Any]]
668
+ Successful Response
669
+ """
670
+ _response = await self._client_wrapper.httpx_client.request(
671
+ f"v1/folders/{jsonable_encoder(folder_id)}",
672
+ method="DELETE",
673
+ request_options=request_options,
674
+ )
675
+ try:
676
+ if _response is None or not _response.text.strip():
677
+ return AsyncHttpResponse(response=_response, data=None)
678
+ if 200 <= _response.status_code < 300:
679
+ _data = typing.cast(
680
+ typing.Optional[typing.Any],
681
+ construct_type(
682
+ type_=typing.Optional[typing.Any], # type: ignore
683
+ object_=_response.json(),
684
+ ),
685
+ )
686
+ return AsyncHttpResponse(response=_response, data=_data)
687
+ if _response.status_code == 422:
688
+ raise UnprocessableEntityError(
689
+ headers=dict(_response.headers),
690
+ body=typing.cast(
691
+ HttpValidationError,
692
+ construct_type(
693
+ type_=HttpValidationError, # type: ignore
694
+ object_=_response.json(),
695
+ ),
696
+ ),
697
+ )
698
+ _response_json = _response.json()
699
+ except JSONDecodeError:
700
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
701
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
702
+
703
+ async def modify(
704
+ self,
705
+ folder_id: str,
706
+ *,
707
+ name: typing.Optional[str] = OMIT,
708
+ description: typing.Optional[str] = OMIT,
709
+ instructions: typing.Optional[str] = OMIT,
710
+ metadata: typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]] = OMIT,
711
+ embedding_config: typing.Optional[EmbeddingConfig] = OMIT,
712
+ request_options: typing.Optional[RequestOptions] = None,
713
+ ) -> AsyncHttpResponse[Folder]:
714
+ """
715
+ Update the name or documentation of an existing data folder.
716
+
717
+ Parameters
718
+ ----------
719
+ folder_id : str
720
+
721
+ name : typing.Optional[str]
722
+ The name of the source.
723
+
724
+ description : typing.Optional[str]
725
+ The description of the source.
726
+
727
+ instructions : typing.Optional[str]
728
+ Instructions for how to use the source.
729
+
730
+ metadata : typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]]
731
+ Metadata associated with the source.
732
+
733
+ embedding_config : typing.Optional[EmbeddingConfig]
734
+ The embedding configuration used by the source.
735
+
736
+ request_options : typing.Optional[RequestOptions]
737
+ Request-specific configuration.
738
+
739
+ Returns
740
+ -------
741
+ AsyncHttpResponse[Folder]
742
+ Successful Response
743
+ """
744
+ _response = await self._client_wrapper.httpx_client.request(
745
+ f"v1/folders/{jsonable_encoder(folder_id)}",
746
+ method="PATCH",
747
+ json={
748
+ "name": name,
749
+ "description": description,
750
+ "instructions": instructions,
751
+ "metadata": metadata,
752
+ "embedding_config": convert_and_respect_annotation_metadata(
753
+ object_=embedding_config, annotation=EmbeddingConfig, direction="write"
754
+ ),
755
+ },
756
+ headers={
757
+ "content-type": "application/json",
758
+ },
759
+ request_options=request_options,
760
+ omit=OMIT,
761
+ )
762
+ try:
763
+ if 200 <= _response.status_code < 300:
764
+ _data = typing.cast(
765
+ Folder,
766
+ construct_type(
767
+ type_=Folder, # type: ignore
768
+ object_=_response.json(),
769
+ ),
770
+ )
771
+ return AsyncHttpResponse(response=_response, data=_data)
772
+ if _response.status_code == 422:
773
+ raise UnprocessableEntityError(
774
+ headers=dict(_response.headers),
775
+ body=typing.cast(
776
+ HttpValidationError,
777
+ construct_type(
778
+ type_=HttpValidationError, # type: ignore
779
+ object_=_response.json(),
780
+ ),
781
+ ),
782
+ )
783
+ _response_json = _response.json()
784
+ except JSONDecodeError:
785
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
786
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
787
+
788
+ async def retrieve_by_name(
789
+ self, folder_name: str, *, request_options: typing.Optional[RequestOptions] = None
790
+ ) -> AsyncHttpResponse[str]:
791
+ """
792
+ Get a folder by name
793
+
794
+ Parameters
795
+ ----------
796
+ folder_name : str
797
+
798
+ request_options : typing.Optional[RequestOptions]
799
+ Request-specific configuration.
800
+
801
+ Returns
802
+ -------
803
+ AsyncHttpResponse[str]
804
+ Successful Response
805
+ """
806
+ _response = await self._client_wrapper.httpx_client.request(
807
+ f"v1/folders/name/{jsonable_encoder(folder_name)}",
808
+ method="GET",
809
+ request_options=request_options,
810
+ )
811
+ try:
812
+ if 200 <= _response.status_code < 300:
813
+ _data = typing.cast(
814
+ str,
815
+ construct_type(
816
+ type_=str, # type: ignore
817
+ object_=_response.json(),
818
+ ),
819
+ )
820
+ return AsyncHttpResponse(response=_response, data=_data)
821
+ if _response.status_code == 422:
822
+ raise UnprocessableEntityError(
823
+ headers=dict(_response.headers),
824
+ body=typing.cast(
825
+ HttpValidationError,
826
+ construct_type(
827
+ type_=HttpValidationError, # type: ignore
828
+ object_=_response.json(),
829
+ ),
830
+ ),
831
+ )
832
+ _response_json = _response.json()
833
+ except JSONDecodeError:
834
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
835
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
836
+
837
+ async def get_folders_metadata(
838
+ self,
839
+ *,
840
+ include_detailed_per_source_metadata: typing.Optional[bool] = None,
841
+ request_options: typing.Optional[RequestOptions] = None,
842
+ ) -> AsyncHttpResponse[OrganizationSourcesStats]:
843
+ """
844
+ Get aggregated metadata for all folders in an organization.
845
+
846
+ Returns structured metadata including:
847
+ - Total number of folders
848
+ - Total number of files across all folders
849
+ - Total size of all files
850
+ - Per-source breakdown with file details (file_name, file_size per file) if include_detailed_per_source_metadata is True
851
+
852
+ Parameters
853
+ ----------
854
+ include_detailed_per_source_metadata : typing.Optional[bool]
855
+
856
+ request_options : typing.Optional[RequestOptions]
857
+ Request-specific configuration.
858
+
859
+ Returns
860
+ -------
861
+ AsyncHttpResponse[OrganizationSourcesStats]
862
+ Successful Response
863
+ """
864
+ _response = await self._client_wrapper.httpx_client.request(
865
+ "v1/folders/metadata",
866
+ method="GET",
867
+ params={
868
+ "include_detailed_per_source_metadata": include_detailed_per_source_metadata,
869
+ },
870
+ request_options=request_options,
871
+ )
872
+ try:
873
+ if 200 <= _response.status_code < 300:
874
+ _data = typing.cast(
875
+ OrganizationSourcesStats,
876
+ construct_type(
877
+ type_=OrganizationSourcesStats, # type: ignore
878
+ object_=_response.json(),
879
+ ),
880
+ )
881
+ return AsyncHttpResponse(response=_response, data=_data)
882
+ if _response.status_code == 422:
883
+ raise UnprocessableEntityError(
884
+ headers=dict(_response.headers),
885
+ body=typing.cast(
886
+ HttpValidationError,
887
+ construct_type(
888
+ type_=HttpValidationError, # type: ignore
889
+ object_=_response.json(),
890
+ ),
891
+ ),
892
+ )
893
+ _response_json = _response.json()
894
+ except JSONDecodeError:
895
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
896
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
897
+
898
+ async def list(
899
+ self, *, request_options: typing.Optional[RequestOptions] = None
900
+ ) -> AsyncHttpResponse[typing.List[Folder]]:
901
+ """
902
+ List all data folders created by a user.
903
+
904
+ Parameters
905
+ ----------
906
+ request_options : typing.Optional[RequestOptions]
907
+ Request-specific configuration.
908
+
909
+ Returns
910
+ -------
911
+ AsyncHttpResponse[typing.List[Folder]]
912
+ Successful Response
913
+ """
914
+ _response = await self._client_wrapper.httpx_client.request(
915
+ "v1/folders/",
916
+ method="GET",
917
+ request_options=request_options,
918
+ )
919
+ try:
920
+ if 200 <= _response.status_code < 300:
921
+ _data = typing.cast(
922
+ typing.List[Folder],
923
+ construct_type(
924
+ type_=typing.List[Folder], # type: ignore
925
+ object_=_response.json(),
926
+ ),
927
+ )
928
+ return AsyncHttpResponse(response=_response, data=_data)
929
+ if _response.status_code == 422:
930
+ raise UnprocessableEntityError(
931
+ headers=dict(_response.headers),
932
+ body=typing.cast(
933
+ HttpValidationError,
934
+ construct_type(
935
+ type_=HttpValidationError, # type: ignore
936
+ object_=_response.json(),
937
+ ),
938
+ ),
939
+ )
940
+ _response_json = _response.json()
941
+ except JSONDecodeError:
942
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
943
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
944
+
945
+ async def create(
946
+ self,
947
+ *,
948
+ name: str,
949
+ description: typing.Optional[str] = OMIT,
950
+ instructions: typing.Optional[str] = OMIT,
951
+ metadata: typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]] = OMIT,
952
+ embedding: typing.Optional[str] = OMIT,
953
+ embedding_chunk_size: typing.Optional[int] = OMIT,
954
+ embedding_config: typing.Optional[EmbeddingConfig] = OMIT,
955
+ request_options: typing.Optional[RequestOptions] = None,
956
+ ) -> AsyncHttpResponse[Folder]:
957
+ """
958
+ Create a new data folder.
959
+
960
+ Parameters
961
+ ----------
962
+ name : str
963
+ The name of the source.
964
+
965
+ description : typing.Optional[str]
966
+ The description of the source.
967
+
968
+ instructions : typing.Optional[str]
969
+ Instructions for how to use the source.
970
+
971
+ metadata : typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]]
972
+ Metadata associated with the source.
973
+
974
+ embedding : typing.Optional[str]
975
+ The handle for the embedding config used by the source.
976
+
977
+ embedding_chunk_size : typing.Optional[int]
978
+ The chunk size of the embedding.
979
+
980
+ embedding_config : typing.Optional[EmbeddingConfig]
981
+ (Legacy) The embedding configuration used by the source.
982
+
983
+ request_options : typing.Optional[RequestOptions]
984
+ Request-specific configuration.
985
+
986
+ Returns
987
+ -------
988
+ AsyncHttpResponse[Folder]
989
+ Successful Response
990
+ """
991
+ _response = await self._client_wrapper.httpx_client.request(
992
+ "v1/folders/",
993
+ method="POST",
994
+ json={
995
+ "name": name,
996
+ "description": description,
997
+ "instructions": instructions,
998
+ "metadata": metadata,
999
+ "embedding": embedding,
1000
+ "embedding_chunk_size": embedding_chunk_size,
1001
+ "embedding_config": convert_and_respect_annotation_metadata(
1002
+ object_=embedding_config, annotation=EmbeddingConfig, direction="write"
1003
+ ),
1004
+ },
1005
+ headers={
1006
+ "content-type": "application/json",
1007
+ },
1008
+ request_options=request_options,
1009
+ omit=OMIT,
1010
+ )
1011
+ try:
1012
+ if 200 <= _response.status_code < 300:
1013
+ _data = typing.cast(
1014
+ Folder,
1015
+ construct_type(
1016
+ type_=Folder, # type: ignore
1017
+ object_=_response.json(),
1018
+ ),
1019
+ )
1020
+ return AsyncHttpResponse(response=_response, data=_data)
1021
+ if _response.status_code == 422:
1022
+ raise UnprocessableEntityError(
1023
+ headers=dict(_response.headers),
1024
+ body=typing.cast(
1025
+ HttpValidationError,
1026
+ construct_type(
1027
+ type_=HttpValidationError, # type: ignore
1028
+ object_=_response.json(),
1029
+ ),
1030
+ ),
1031
+ )
1032
+ _response_json = _response.json()
1033
+ except JSONDecodeError:
1034
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1035
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1036
+
1037
+ async def get_agents_for_folder(
1038
+ self, folder_id: str, *, request_options: typing.Optional[RequestOptions] = None
1039
+ ) -> AsyncHttpResponse[typing.List[str]]:
1040
+ """
1041
+ Get all agent IDs that have the specified folder attached.
1042
+
1043
+ Parameters
1044
+ ----------
1045
+ folder_id : str
1046
+
1047
+ request_options : typing.Optional[RequestOptions]
1048
+ Request-specific configuration.
1049
+
1050
+ Returns
1051
+ -------
1052
+ AsyncHttpResponse[typing.List[str]]
1053
+ Successful Response
1054
+ """
1055
+ _response = await self._client_wrapper.httpx_client.request(
1056
+ f"v1/folders/{jsonable_encoder(folder_id)}/agents",
1057
+ method="GET",
1058
+ request_options=request_options,
1059
+ )
1060
+ try:
1061
+ if 200 <= _response.status_code < 300:
1062
+ _data = typing.cast(
1063
+ typing.List[str],
1064
+ construct_type(
1065
+ type_=typing.List[str], # type: ignore
1066
+ object_=_response.json(),
1067
+ ),
1068
+ )
1069
+ return AsyncHttpResponse(response=_response, data=_data)
1070
+ if _response.status_code == 422:
1071
+ raise UnprocessableEntityError(
1072
+ headers=dict(_response.headers),
1073
+ body=typing.cast(
1074
+ HttpValidationError,
1075
+ construct_type(
1076
+ type_=HttpValidationError, # type: ignore
1077
+ object_=_response.json(),
1078
+ ),
1079
+ ),
1080
+ )
1081
+ _response_json = _response.json()
1082
+ except JSONDecodeError:
1083
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1084
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)