durable-agents-sdk 1.0.20260608003.dev0__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.
Files changed (260) hide show
  1. durable_agents/__init__.py +17 -0
  2. durable_agents/_build_info.py +3 -0
  3. durable_agents/client.py +461 -0
  4. durable_agents/errors.py +61 -0
  5. durable_agents/generated/__init__.py +3 -0
  6. durable_agents/generated/api/api_request_builder.py +33 -0
  7. durable_agents/generated/api/durable/accounts/accounts_request_builder.py +156 -0
  8. durable_agents/generated/api/durable/accounts/item/connect/connect_request_builder.py +81 -0
  9. durable_agents/generated/api/durable/accounts/item/with_account_item_request_builder.py +130 -0
  10. durable_agents/generated/api/durable/agents/agents_request_builder.py +155 -0
  11. durable_agents/generated/api/durable/agents/item/runs/runs_request_builder.py +99 -0
  12. durable_agents/generated/api/durable/agents/item/webhooks/item/with_webhook_token_item_request_builder.py +89 -0
  13. durable_agents/generated/api/durable/agents/item/webhooks/item/with_webhook_token_post_request_body.py +43 -0
  14. durable_agents/generated/api/durable/agents/item/webhooks/webhooks_request_builder.py +38 -0
  15. durable_agents/generated/api/durable/agents/item/with_agent_item_request_builder.py +186 -0
  16. durable_agents/generated/api/durable/audit/audit_request_builder.py +91 -0
  17. durable_agents/generated/api/durable/billing/billing_request_builder.py +33 -0
  18. durable_agents/generated/api/durable/billing/usage/usage_request_builder.py +81 -0
  19. durable_agents/generated/api/durable/channels/bindings/bindings_request_builder.py +136 -0
  20. durable_agents/generated/api/durable/channels/channels_request_builder.py +83 -0
  21. durable_agents/generated/api/durable/channels/connectors/channel_connector_create.py +121 -0
  22. durable_agents/generated/api/durable/channels/connectors/connectors_request_builder.py +153 -0
  23. durable_agents/generated/api/durable/channels/connectors/item/with_connector_item_request_builder.py +81 -0
  24. durable_agents/generated/api/durable/channels/email/email_request_builder.py +33 -0
  25. durable_agents/generated/api/durable/channels/email/inboxes/inboxes_request_builder.py +153 -0
  26. durable_agents/generated/api/durable/channels/email/inboxes/item/messages/item/with_message_item_request_builder.py +81 -0
  27. durable_agents/generated/api/durable/channels/email/inboxes/item/messages/messages_request_builder.py +153 -0
  28. durable_agents/generated/api/durable/channels/email/inboxes/item/with_inbox_item_request_builder.py +91 -0
  29. durable_agents/generated/api/durable/channels/endpoints/endpoints_request_builder.py +96 -0
  30. durable_agents/generated/api/durable/channels/messaging/messaging_request_builder.py +43 -0
  31. durable_agents/generated/api/durable/channels/messaging/phones/confirm/confirm_request_builder.py +89 -0
  32. durable_agents/generated/api/durable/channels/messaging/phones/item/with_phone_item_request_builder.py +81 -0
  33. durable_agents/generated/api/durable/channels/messaging/phones/phones_request_builder.py +116 -0
  34. durable_agents/generated/api/durable/channels/messaging/phones/verify/verify_request_builder.py +89 -0
  35. durable_agents/generated/api/durable/channels/messaging/status/status_request_builder.py +81 -0
  36. durable_agents/generated/api/durable/channels/slack/manifest/manifest_request_builder.py +89 -0
  37. durable_agents/generated/api/durable/channels/slack/slack_request_builder.py +33 -0
  38. durable_agents/generated/api/durable/connectors/connectors_request_builder.py +155 -0
  39. durable_agents/generated/api/durable/connectors/item/connect/connect_request_builder.py +81 -0
  40. durable_agents/generated/api/durable/connectors/item/disconnect/disconnect_request_builder.py +81 -0
  41. durable_agents/generated/api/durable/connectors/item/with_connector_item_request_builder.py +186 -0
  42. durable_agents/generated/api/durable/content/content_request_builder.py +170 -0
  43. durable_agents/generated/api/durable/content/item/with_content_item_request_builder.py +166 -0
  44. durable_agents/generated/api/durable/data_sources/data_sources_request_builder.py +176 -0
  45. durable_agents/generated/api/durable/data_sources/discover/discover_request_builder.py +38 -0
  46. durable_agents/generated/api/durable/data_sources/discover/item/with_type_item_request_builder.py +89 -0
  47. durable_agents/generated/api/durable/data_sources/item/pause/pause_request_builder.py +81 -0
  48. durable_agents/generated/api/durable/data_sources/item/resume/resume_request_builder.py +81 -0
  49. durable_agents/generated/api/durable/data_sources/item/sync/sync_request_builder.py +81 -0
  50. durable_agents/generated/api/durable/data_sources/item/with_source_item_request_builder.py +196 -0
  51. durable_agents/generated/api/durable/durable_request_builder.py +163 -0
  52. durable_agents/generated/api/durable/keys/claim/claim_request_builder.py +89 -0
  53. durable_agents/generated/api/durable/keys/item/with_key_item_request_builder.py +81 -0
  54. durable_agents/generated/api/durable/keys/keys_request_builder.py +153 -0
  55. durable_agents/generated/api/durable/models_requests/models_request_builder.py +81 -0
  56. durable_agents/generated/api/durable/personas/item/with_persona_item_request_builder.py +166 -0
  57. durable_agents/generated/api/durable/personas/personas_request_builder.py +155 -0
  58. durable_agents/generated/api/durable/runs/item/cancel/cancel_request_builder.py +81 -0
  59. durable_agents/generated/api/durable/runs/item/events/events_request_builder.py +95 -0
  60. durable_agents/generated/api/durable/runs/item/pause/pause_request_builder.py +81 -0
  61. durable_agents/generated/api/durable/runs/item/prompt/prompt_request_builder.py +99 -0
  62. durable_agents/generated/api/durable/runs/item/replay/replay_request_builder.py +81 -0
  63. durable_agents/generated/api/durable/runs/item/resume/resume_request_builder.py +89 -0
  64. durable_agents/generated/api/durable/runs/item/with_run_item_request_builder.py +141 -0
  65. durable_agents/generated/api/durable/runs/runs_request_builder.py +111 -0
  66. durable_agents/generated/api/durable/skills/item/with_skill_item_request_builder.py +166 -0
  67. durable_agents/generated/api/durable/skills/skills_request_builder.py +153 -0
  68. durable_agents/generated/api/durable/vfs/entries/entries_request_builder.py +113 -0
  69. durable_agents/generated/api/durable/vfs/item_escaped/item_escaped_request_builder.py +92 -0
  70. durable_agents/generated/api/durable/vfs/search/search_request_builder.py +113 -0
  71. durable_agents/generated/api/durable/vfs/vfs_request_builder.py +53 -0
  72. durable_agents/generated/durable_api_client.py +54 -0
  73. durable_agents/generated/models/account.py +74 -0
  74. durable_agents/generated/models/account_create.py +50 -0
  75. durable_agents/generated/models/account_list.py +54 -0
  76. durable_agents/generated/models/account_mutation_result.py +61 -0
  77. durable_agents/generated/models/account_mutation_result_authorize_url.py +62 -0
  78. durable_agents/generated/models/account_mutation_result_authorize_url_member1.py +43 -0
  79. durable_agents/generated/models/account_provider.py +22 -0
  80. durable_agents/generated/models/account_status.py +7 -0
  81. durable_agents/generated/models/agent.py +128 -0
  82. durable_agents/generated/models/agent_create.py +107 -0
  83. durable_agents/generated/models/agent_list.py +54 -0
  84. durable_agents/generated/models/agent_mode.py +9 -0
  85. durable_agents/generated/models/agent_mutable_state.py +6 -0
  86. durable_agents/generated/models/agent_patch.py +114 -0
  87. durable_agents/generated/models/api_key.py +75 -0
  88. durable_agents/generated/models/api_key_claim.py +43 -0
  89. durable_agents/generated/models/api_key_create.py +51 -0
  90. durable_agents/generated/models/api_key_list.py +54 -0
  91. durable_agents/generated/models/audit_event.py +81 -0
  92. durable_agents/generated/models/audit_event_actor.py +9 -0
  93. durable_agents/generated/models/audit_event_data.py +43 -0
  94. durable_agents/generated/models/audit_event_list.py +54 -0
  95. durable_agents/generated/models/billing_usage.py +118 -0
  96. durable_agents/generated/models/billing_usage_provider_kind.py +6 -0
  97. durable_agents/generated/models/billing_usage_status.py +9 -0
  98. durable_agents/generated/models/channel.py +64 -0
  99. durable_agents/generated/models/channel_binding.py +89 -0
  100. durable_agents/generated/models/channel_binding_delete.py +73 -0
  101. durable_agents/generated/models/channel_binding_put.py +88 -0
  102. durable_agents/generated/models/channel_config.py +43 -0
  103. durable_agents/generated/models/channel_connector.py +82 -0
  104. durable_agents/generated/models/channel_connector_list.py +54 -0
  105. durable_agents/generated/models/channel_connector_status.py +7 -0
  106. durable_agents/generated/models/channel_endpoint.py +91 -0
  107. durable_agents/generated/models/channel_endpoint_list.py +54 -0
  108. durable_agents/generated/models/channel_endpoint_status.py +7 -0
  109. durable_agents/generated/models/channel_input.py +64 -0
  110. durable_agents/generated/models/channel_input_config.py +43 -0
  111. durable_agents/generated/models/channel_setup_guide.py +70 -0
  112. durable_agents/generated/models/channel_setup_guide_required_credentials.py +6 -0
  113. durable_agents/generated/models/channel_status.py +7 -0
  114. durable_agents/generated/models/channel_type.py +13 -0
  115. durable_agents/generated/models/connector.py +96 -0
  116. durable_agents/generated/models/connector_auth_status.py +80 -0
  117. durable_agents/generated/models/connector_create.py +72 -0
  118. durable_agents/generated/models/connector_create_env.py +43 -0
  119. durable_agents/generated/models/connector_create_headers.py +43 -0
  120. durable_agents/generated/models/connector_create_type.py +6 -0
  121. durable_agents/generated/models/connector_list.py +54 -0
  122. durable_agents/generated/models/connector_mutation_result.py +61 -0
  123. durable_agents/generated/models/connector_mutation_result_authorize_url.py +62 -0
  124. durable_agents/generated/models/connector_mutation_result_authorize_url_member1.py +43 -0
  125. durable_agents/generated/models/connector_provider.py +10 -0
  126. durable_agents/generated/models/connector_status.py +8 -0
  127. durable_agents/generated/models/connector_type.py +7 -0
  128. durable_agents/generated/models/connector_update.py +65 -0
  129. durable_agents/generated/models/connector_update_env.py +43 -0
  130. durable_agents/generated/models/connector_update_headers.py +43 -0
  131. durable_agents/generated/models/content.py +161 -0
  132. durable_agents/generated/models/content_create.py +66 -0
  133. durable_agents/generated/models/content_list.py +54 -0
  134. durable_agents/generated/models/content_patch.py +51 -0
  135. durable_agents/generated/models/content_source_metadata.py +58 -0
  136. durable_agents/generated/models/content_type.py +17 -0
  137. durable_agents/generated/models/data_source.py +98 -0
  138. durable_agents/generated/models/data_source_account.py +61 -0
  139. durable_agents/generated/models/data_source_account_member1.py +43 -0
  140. durable_agents/generated/models/data_source_account_member2.py +47 -0
  141. durable_agents/generated/models/data_source_create.py +188 -0
  142. durable_agents/generated/models/data_source_create_result.py +54 -0
  143. durable_agents/generated/models/data_source_discover_request.py +67 -0
  144. durable_agents/generated/models/data_source_discovery_item.py +66 -0
  145. durable_agents/generated/models/data_source_discovery_list.py +54 -0
  146. durable_agents/generated/models/data_source_list.py +54 -0
  147. durable_agents/generated/models/data_source_provider.py +33 -0
  148. durable_agents/generated/models/data_source_read_limit.py +62 -0
  149. durable_agents/generated/models/data_source_read_limit_member1.py +43 -0
  150. durable_agents/generated/models/data_source_resource.py +62 -0
  151. durable_agents/generated/models/data_source_resource_input.py +58 -0
  152. durable_agents/generated/models/data_source_resource_kind.py +25 -0
  153. durable_agents/generated/models/data_source_schedule.py +16 -0
  154. durable_agents/generated/models/data_source_status.py +9 -0
  155. durable_agents/generated/models/data_source_type.py +71 -0
  156. durable_agents/generated/models/data_source_update.py +58 -0
  157. durable_agents/generated/models/deleted_response.py +43 -0
  158. durable_agents/generated/models/discord_channel_connector_create.py +58 -0
  159. durable_agents/generated/models/discord_connector_secrets.py +51 -0
  160. durable_agents/generated/models/effort.py +8 -0
  161. durable_agents/generated/models/email_inbox.py +67 -0
  162. durable_agents/generated/models/email_inbox_create.py +43 -0
  163. durable_agents/generated/models/email_inbox_list.py +54 -0
  164. durable_agents/generated/models/email_inbox_status.py +6 -0
  165. durable_agents/generated/models/email_message.py +85 -0
  166. durable_agents/generated/models/email_message_attachment.py +63 -0
  167. durable_agents/generated/models/email_message_headers.py +43 -0
  168. durable_agents/generated/models/email_message_list.py +54 -0
  169. durable_agents/generated/models/email_message_send.py +67 -0
  170. durable_agents/generated/models/email_message_send_result.py +47 -0
  171. durable_agents/generated/models/email_message_summary.py +112 -0
  172. durable_agents/generated/models/endpoint_provider.py +12 -0
  173. durable_agents/generated/models/endpoint_type.py +8 -0
  174. durable_agents/generated/models/entity_state.py +32 -0
  175. durable_agents/generated/models/error_body.py +47 -0
  176. durable_agents/generated/models/error_envelope.py +61 -0
  177. durable_agents/generated/models/file_type.py +20 -0
  178. durable_agents/generated/models/google_chat_channel_connector_create.py +58 -0
  179. durable_agents/generated/models/google_chat_connector_secrets.py +47 -0
  180. durable_agents/generated/models/heartbeat.py +78 -0
  181. durable_agents/generated/models/heartbeat_probe_thresholds.py +43 -0
  182. durable_agents/generated/models/key_create_response.py +54 -0
  183. durable_agents/generated/models/messaging_status.py +68 -0
  184. durable_agents/generated/models/messaging_status_provider.py +5 -0
  185. durable_agents/generated/models/model.py +70 -0
  186. durable_agents/generated/models/model_durable_preset.py +62 -0
  187. durable_agents/generated/models/model_durable_preset_member1.py +43 -0
  188. durable_agents/generated/models/model_list.py +54 -0
  189. durable_agents/generated/models/named_ref.py +47 -0
  190. durable_agents/generated/models/persona.py +79 -0
  191. durable_agents/generated/models/persona_create.py +51 -0
  192. durable_agents/generated/models/persona_list.py +54 -0
  193. durable_agents/generated/models/persona_patch.py +51 -0
  194. durable_agents/generated/models/phone_confirm_request.py +47 -0
  195. durable_agents/generated/models/phone_verify_request.py +43 -0
  196. durable_agents/generated/models/ref.py +43 -0
  197. durable_agents/generated/models/registered_phone.py +56 -0
  198. durable_agents/generated/models/registered_phone_list.py +54 -0
  199. durable_agents/generated/models/run.py +113 -0
  200. durable_agents/generated/models/run_create.py +69 -0
  201. durable_agents/generated/models/run_create_input.py +43 -0
  202. durable_agents/generated/models/run_create_mode.py +62 -0
  203. durable_agents/generated/models/run_create_mode_member1.py +43 -0
  204. durable_agents/generated/models/run_error.py +47 -0
  205. durable_agents/generated/models/run_event.py +82 -0
  206. durable_agents/generated/models/run_event_data.py +46 -0
  207. durable_agents/generated/models/run_event_list.py +54 -0
  208. durable_agents/generated/models/run_event_type.py +24 -0
  209. durable_agents/generated/models/run_input.py +43 -0
  210. durable_agents/generated/models/run_list.py +54 -0
  211. durable_agents/generated/models/run_mode.py +9 -0
  212. durable_agents/generated/models/run_output.py +43 -0
  213. durable_agents/generated/models/run_prompt.py +65 -0
  214. durable_agents/generated/models/run_prompt_input.py +43 -0
  215. durable_agents/generated/models/run_prompt_mode.py +62 -0
  216. durable_agents/generated/models/run_prompt_mode_member1.py +43 -0
  217. durable_agents/generated/models/run_replay.py +57 -0
  218. durable_agents/generated/models/run_resume.py +43 -0
  219. durable_agents/generated/models/run_status.py +12 -0
  220. durable_agents/generated/models/schedule.py +62 -0
  221. durable_agents/generated/models/schedule_recurrence_type.py +8 -0
  222. durable_agents/generated/models/sent_response.py +43 -0
  223. durable_agents/generated/models/skill.py +82 -0
  224. durable_agents/generated/models/skill_argument.py +51 -0
  225. durable_agents/generated/models/skill_create.py +62 -0
  226. durable_agents/generated/models/skill_list.py +54 -0
  227. durable_agents/generated/models/skill_patch.py +62 -0
  228. durable_agents/generated/models/slack_channel_connector_create.py +58 -0
  229. durable_agents/generated/models/slack_connector_secrets.py +51 -0
  230. durable_agents/generated/models/target.py +72 -0
  231. durable_agents/generated/models/target_config.py +43 -0
  232. durable_agents/generated/models/target_input.py +72 -0
  233. durable_agents/generated/models/target_input_config.py +43 -0
  234. durable_agents/generated/models/target_input_type.py +30 -0
  235. durable_agents/generated/models/target_type.py +30 -0
  236. durable_agents/generated/models/teams_channel_connector_create.py +58 -0
  237. durable_agents/generated/models/teams_connector_secrets.py +51 -0
  238. durable_agents/generated/models/telegram_channel_connector_create.py +58 -0
  239. durable_agents/generated/models/telegram_connector_secrets.py +51 -0
  240. durable_agents/generated/models/usage_summary.py +67 -0
  241. durable_agents/generated/models/vfs_body.py +54 -0
  242. durable_agents/generated/models/vfs_body_format.py +7 -0
  243. durable_agents/generated/models/vfs_children.py +47 -0
  244. durable_agents/generated/models/vfs_entry.py +119 -0
  245. durable_agents/generated/models/vfs_entry_kind.py +6 -0
  246. durable_agents/generated/models/vfs_entry_list.py +54 -0
  247. durable_agents/generated/models/vfs_item.py +71 -0
  248. durable_agents/generated/models/vfs_search_match.py +99 -0
  249. durable_agents/generated/models/vfs_search_match_list.py +54 -0
  250. durable_agents/generated/models/webhook_ack.py +54 -0
  251. durable_agents/generated/models/whats_app_channel_connector_create.py +58 -0
  252. durable_agents/generated/models/whats_app_connector_secrets.py +55 -0
  253. durable_agents/pagination.py +31 -0
  254. durable_agents/py.typed +1 -0
  255. durable_agents/streaming.py +111 -0
  256. durable_agents_sdk-1.0.20260608003.dev0.dist-info/METADATA +114 -0
  257. durable_agents_sdk-1.0.20260608003.dev0.dist-info/RECORD +260 -0
  258. durable_agents_sdk-1.0.20260608003.dev0.dist-info/WHEEL +5 -0
  259. durable_agents_sdk-1.0.20260608003.dev0.dist-info/licenses/LICENSE +21 -0
  260. durable_agents_sdk-1.0.20260608003.dev0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,17 @@
1
+ from ._build_info import DEFAULT_BASE_URL, SDK_CHANNEL, SDK_VERSION
2
+ from .client import DurableClient
3
+ from .errors import DurableApiError
4
+ from .pagination import paginate
5
+ from .streaming import DurableRunEvent, DurableSseParseError, parse_sse_text
6
+
7
+ __all__ = [
8
+ "DEFAULT_BASE_URL",
9
+ "SDK_CHANNEL",
10
+ "SDK_VERSION",
11
+ "DurableApiError",
12
+ "DurableClient",
13
+ "DurableRunEvent",
14
+ "DurableSseParseError",
15
+ "paginate",
16
+ "parse_sse_text",
17
+ ]
@@ -0,0 +1,3 @@
1
+ SDK_VERSION = "1.0.20260608003.dev0"
2
+ SDK_CHANNEL = "dev"
3
+ DEFAULT_BASE_URL = "https://dev.durableagents.ai"
@@ -0,0 +1,461 @@
1
+ from __future__ import annotations
2
+
3
+ import os
4
+ from collections.abc import Iterator, Mapping
5
+ from types import TracebackType
6
+ from typing import Self
7
+ from urllib.parse import quote
8
+
9
+ import httpx
10
+
11
+ from ._build_info import DEFAULT_BASE_URL, SDK_VERSION
12
+ from .errors import error_from_response
13
+ from .pagination import paginate
14
+ from .streaming import DurableRunEvent, iter_sse_lines
15
+
16
+ JsonObject = Mapping[str, object]
17
+ QueryParams = Mapping[str, object]
18
+
19
+
20
+ class DurableClient:
21
+ def __init__(
22
+ self,
23
+ api_key: str | None = None,
24
+ base_url: str | None = None,
25
+ timeout: float | httpx.Timeout | None = None,
26
+ headers: Mapping[str, str] | None = None,
27
+ transport: httpx.BaseTransport | None = None,
28
+ ) -> None:
29
+ self.api_key = api_key or os.getenv("DURABLE_API_KEY")
30
+ self.base_url = _strip_trailing_slash(
31
+ base_url or os.getenv("DURABLE_API_BASE_URL") or DEFAULT_BASE_URL
32
+ )
33
+ default_headers = {
34
+ "User-Agent": f"durable-agents-sdk-python/{SDK_VERSION}",
35
+ **dict(headers or {}),
36
+ }
37
+ if self.api_key:
38
+ default_headers["Authorization"] = f"Bearer {self.api_key}"
39
+
40
+ self._client = httpx.Client(
41
+ base_url=self.base_url,
42
+ timeout=timeout,
43
+ headers=default_headers,
44
+ transport=transport,
45
+ )
46
+
47
+ self.keys = _Keys(self)
48
+ self.agents = _Agents(self)
49
+ self.runs = _Runs(self)
50
+ self.library = _Library(self)
51
+ self.vfs = _Vfs(self)
52
+ self.personas = _ResourceGroup(self, "/api/durable/personas")
53
+ self.skills = _ResourceGroup(self, "/api/durable/skills")
54
+ self.models = _Models(self)
55
+ self.accounts = _Accounts(self)
56
+ self.sources = _Sources(self)
57
+ self.connectors = _Connectors(self)
58
+ self.channels = _Channels(self)
59
+ self.usage = _Usage(self)
60
+ self.audit = _Audit(self)
61
+
62
+ def __enter__(self) -> Self:
63
+ return self
64
+
65
+ def __exit__(
66
+ self,
67
+ exc_type: type[BaseException] | None,
68
+ exc_value: BaseException | None,
69
+ traceback: TracebackType | None,
70
+ ) -> None:
71
+ self.close()
72
+
73
+ def close(self) -> None:
74
+ self._client.close()
75
+
76
+ def request(
77
+ self,
78
+ method: str,
79
+ path: str,
80
+ *,
81
+ params: QueryParams | None = None,
82
+ body: object | None = None,
83
+ headers: Mapping[str, str] | None = None,
84
+ files: object | None = None,
85
+ ) -> object:
86
+ kwargs: dict[str, object] = {
87
+ "params": _clean_params(params),
88
+ "headers": dict(headers or {}),
89
+ }
90
+
91
+ if files is not None:
92
+ kwargs["files"] = files
93
+ if isinstance(body, Mapping):
94
+ kwargs["data"] = dict(body)
95
+ elif body is not None:
96
+ kwargs["json"] = body
97
+
98
+ response = self._client.request(method, path, **kwargs)
99
+ if response.is_error:
100
+ raise error_from_response(response)
101
+ if response.status_code == 204:
102
+ return {}
103
+ return response.json()
104
+
105
+
106
+ class _ResourceGroup:
107
+ def __init__(self, client: DurableClient, path: str) -> None:
108
+ self._client = client
109
+ self._path = path
110
+
111
+ def list(self, **params: object) -> object:
112
+ return self._client.request("GET", self._path, params=params)
113
+
114
+ def iterate(self, **params: object) -> Iterator[object]:
115
+ return paginate(lambda page_params: _expect_mapping(self.list(**page_params)), params)
116
+
117
+ def create(self, input: JsonObject) -> object:
118
+ return self._client.request("POST", self._path, body=input)
119
+
120
+ def get(self, id: str) -> object:
121
+ return self._client.request("GET", f"{self._path}/{_path(id)}")
122
+
123
+ def update(self, id: str, input: JsonObject) -> object:
124
+ return self._client.request("PATCH", f"{self._path}/{_path(id)}", body=input)
125
+
126
+ def delete(self, id: str) -> object:
127
+ return self._client.request("DELETE", f"{self._path}/{_path(id)}")
128
+
129
+
130
+ class _Keys:
131
+ def __init__(self, client: DurableClient) -> None:
132
+ self._client = client
133
+
134
+ def list(self, **params: object) -> object:
135
+ return self._client.request("GET", "/api/durable/keys", params=params)
136
+
137
+ def create(self, input: JsonObject) -> object:
138
+ return self._client.request("POST", "/api/durable/keys", body=input)
139
+
140
+ def claim(self, input: JsonObject) -> object:
141
+ return self._client.request("POST", "/api/durable/keys/claim", body=input)
142
+
143
+ def revoke(self, key: str) -> object:
144
+ return self._client.request("DELETE", f"/api/durable/keys/{_path(key)}")
145
+
146
+
147
+ class _Agents(_ResourceGroup):
148
+ def __init__(self, client: DurableClient) -> None:
149
+ super().__init__(client, "/api/durable/agents")
150
+
151
+ def start(self, agent_id: str, input: JsonObject) -> object:
152
+ return self._client.request("POST", f"/api/durable/agents/{_path(agent_id)}/runs", body=input)
153
+
154
+
155
+ class _Runs:
156
+ def __init__(self, client: DurableClient) -> None:
157
+ self._client = client
158
+
159
+ def list(self, **params: object) -> object:
160
+ return self._client.request("GET", "/api/durable/runs", params=params)
161
+
162
+ def iterate(self, **params: object) -> Iterator[object]:
163
+ return paginate(lambda page_params: _expect_mapping(self.list(**page_params)), params)
164
+
165
+ def get(self, run_id: str) -> object:
166
+ return self._client.request("GET", f"/api/durable/runs/{_path(run_id)}")
167
+
168
+ def events(self, run_id: str, **params: object) -> object:
169
+ return self._client.request("GET", f"/api/durable/runs/{_path(run_id)}/events", params=params)
170
+
171
+ def watch(self, run_id: str, cursor: str | None = None) -> Iterator[DurableRunEvent]:
172
+ params = {"cursor": cursor} if cursor else None
173
+ with self._client._client.stream(
174
+ "GET",
175
+ f"/api/durable/runs/{_path(run_id)}/events",
176
+ params=params,
177
+ headers={"Accept": "text/event-stream"},
178
+ ) as response:
179
+ if response.is_error:
180
+ response.read()
181
+ raise error_from_response(response)
182
+ yield from iter_sse_lines(response.iter_text())
183
+
184
+ def replay(self, run_id: str) -> object:
185
+ return self._client.request("POST", f"/api/durable/runs/{_path(run_id)}/replay")
186
+
187
+ def cancel(self, run_id: str) -> object:
188
+ return self._client.request("POST", f"/api/durable/runs/{_path(run_id)}/cancel")
189
+
190
+ def pause(self, run_id: str) -> object:
191
+ return self._client.request("POST", f"/api/durable/runs/{_path(run_id)}/pause")
192
+
193
+ def resume(self, run_id: str) -> object:
194
+ return self._client.request("POST", f"/api/durable/runs/{_path(run_id)}/resume")
195
+
196
+ def prompt(self, run_id: str, input: JsonObject) -> object:
197
+ return self._client.request("POST", f"/api/durable/runs/{_path(run_id)}/prompt", body=input)
198
+
199
+
200
+ class _Library:
201
+ def __init__(self, client: DurableClient) -> None:
202
+ self._client = client
203
+
204
+ def list(self, **params: object) -> object:
205
+ return self._client.request("GET", "/api/durable/content", params=params)
206
+
207
+ def iterate(self, **params: object) -> Iterator[object]:
208
+ return paginate(lambda page_params: _expect_mapping(self.list(**page_params)), params)
209
+
210
+ def ingest(self, input: JsonObject | None = None, files: object | None = None) -> object:
211
+ return self._client.request("POST", "/api/durable/content", body=input, files=files)
212
+
213
+ def get(self, content_id: str) -> object:
214
+ return self._client.request("GET", f"/api/durable/content/{_path(content_id)}")
215
+
216
+ def update(self, content_id: str, input: JsonObject) -> object:
217
+ return self._client.request("PATCH", f"/api/durable/content/{_path(content_id)}", body=input)
218
+
219
+ def delete(self, content_id: str) -> object:
220
+ return self._client.request("DELETE", f"/api/durable/content/{_path(content_id)}")
221
+
222
+
223
+ class _Vfs:
224
+ def __init__(self, client: DurableClient) -> None:
225
+ self._client = client
226
+
227
+ def entries(self, **params: object) -> object:
228
+ return self._client.request("GET", "/api/durable/vfs/entries", params=params)
229
+
230
+ def item(self, **params: object) -> object:
231
+ return self._client.request("GET", "/api/durable/vfs/item", params=params)
232
+
233
+ def search(self, **params: object) -> object:
234
+ return self._client.request("GET", "/api/durable/vfs/search", params=params)
235
+
236
+
237
+ class _Models:
238
+ def __init__(self, client: DurableClient) -> None:
239
+ self._client = client
240
+
241
+ def list(self, **params: object) -> object:
242
+ return self._client.request("GET", "/api/durable/models", params=params)
243
+
244
+
245
+ class _Accounts:
246
+ def __init__(self, client: DurableClient) -> None:
247
+ self._client = client
248
+
249
+ def list(self, **params: object) -> object:
250
+ return self._client.request("GET", "/api/durable/accounts", params=params)
251
+
252
+ def create(self, input: JsonObject) -> object:
253
+ return self._client.request("POST", "/api/durable/accounts", body=input)
254
+
255
+ def get(self, account_id: str) -> object:
256
+ return self._client.request("GET", f"/api/durable/accounts/{_path(account_id)}")
257
+
258
+ def delete(self, account_id: str) -> object:
259
+ return self._client.request("DELETE", f"/api/durable/accounts/{_path(account_id)}")
260
+
261
+ def connect(self, account_id: str, input: JsonObject | None = None) -> object:
262
+ return self._client.request(
263
+ "POST",
264
+ f"/api/durable/accounts/{_path(account_id)}/connect",
265
+ body=input or {},
266
+ )
267
+
268
+
269
+ class _Sources(_ResourceGroup):
270
+ def __init__(self, client: DurableClient) -> None:
271
+ super().__init__(client, "/api/durable/data-sources")
272
+
273
+ def pause(self, source_id: str) -> object:
274
+ return self._client.request("POST", f"/api/durable/data-sources/{_path(source_id)}/pause")
275
+
276
+ def resume(self, source_id: str) -> object:
277
+ return self._client.request("POST", f"/api/durable/data-sources/{_path(source_id)}/resume")
278
+
279
+ def sync(self, source_id: str) -> object:
280
+ return self._client.request("POST", f"/api/durable/data-sources/{_path(source_id)}/sync")
281
+
282
+ def discover(self, source_type: str, **params: object) -> object:
283
+ return self._client.request(
284
+ "GET",
285
+ f"/api/durable/data-sources/discover/{_path(source_type)}",
286
+ params=params,
287
+ )
288
+
289
+
290
+ class _Connectors(_ResourceGroup):
291
+ def __init__(self, client: DurableClient) -> None:
292
+ super().__init__(client, "/api/durable/connectors")
293
+
294
+ def connect(self, connector_id: str, input: JsonObject | None = None) -> object:
295
+ return self._client.request(
296
+ "POST",
297
+ f"/api/durable/connectors/{_path(connector_id)}/connect",
298
+ body=input or {},
299
+ )
300
+
301
+ def disconnect(self, connector_id: str) -> object:
302
+ return self._client.request(
303
+ "POST",
304
+ f"/api/durable/connectors/{_path(connector_id)}/disconnect",
305
+ )
306
+
307
+
308
+ class _Channels:
309
+ def __init__(self, client: DurableClient) -> None:
310
+ self.connectors = _ChannelConnectors(client)
311
+ self.email = _EmailChannels(client)
312
+ self.messaging = _MessagingChannels(client)
313
+ self.slack = _SlackChannels(client)
314
+ self.endpoints = _ChannelEndpoints(client)
315
+ self.bindings = _ChannelBindings(client)
316
+
317
+
318
+ class _ChannelConnectors(_ResourceGroup):
319
+ def __init__(self, client: DurableClient) -> None:
320
+ super().__init__(client, "/api/durable/channels/connectors")
321
+
322
+ def get(self, id: str) -> object:
323
+ raise NotImplementedError("Channel connectors do not expose a get endpoint.")
324
+
325
+ def update(self, id: str, input: JsonObject) -> object:
326
+ raise NotImplementedError("Channel connectors do not expose an update endpoint.")
327
+
328
+
329
+ class _EmailChannels:
330
+ def __init__(self, client: DurableClient) -> None:
331
+ self.inboxes = _EmailInboxes(client)
332
+
333
+
334
+ class _EmailInboxes:
335
+ def __init__(self, client: DurableClient) -> None:
336
+ self._client = client
337
+ self.messages = _EmailInboxMessages(client)
338
+
339
+ def list(self, **params: object) -> object:
340
+ return self._client.request("GET", "/api/durable/channels/email/inboxes", params=params)
341
+
342
+ def create(self, input: JsonObject) -> object:
343
+ return self._client.request("POST", "/api/durable/channels/email/inboxes", body=input)
344
+
345
+ def delete(self, inbox_id: str) -> object:
346
+ return self._client.request("DELETE", f"/api/durable/channels/email/inboxes/{_path(inbox_id)}")
347
+
348
+
349
+ class _EmailInboxMessages:
350
+ def __init__(self, client: DurableClient) -> None:
351
+ self._client = client
352
+
353
+ def list(self, inbox_id: str, **params: object) -> object:
354
+ return self._client.request(
355
+ "GET",
356
+ f"/api/durable/channels/email/inboxes/{_path(inbox_id)}/messages",
357
+ params=params,
358
+ )
359
+
360
+ def send(self, inbox_id: str, input: JsonObject) -> object:
361
+ return self._client.request(
362
+ "POST",
363
+ f"/api/durable/channels/email/inboxes/{_path(inbox_id)}/messages",
364
+ body=input,
365
+ )
366
+
367
+ def get(self, inbox_id: str, message_id: str) -> object:
368
+ return self._client.request(
369
+ "GET",
370
+ f"/api/durable/channels/email/inboxes/{_path(inbox_id)}/messages/{_path(message_id)}",
371
+ )
372
+
373
+
374
+ class _MessagingChannels:
375
+ def __init__(self, client: DurableClient) -> None:
376
+ self._client = client
377
+ self.phones = _MessagingPhones(client)
378
+
379
+ def status(self) -> object:
380
+ return self._client.request("GET", "/api/durable/channels/messaging/status")
381
+
382
+
383
+ class _MessagingPhones:
384
+ def __init__(self, client: DurableClient) -> None:
385
+ self._client = client
386
+
387
+ def list(self, **params: object) -> object:
388
+ return self._client.request("GET", "/api/durable/channels/messaging/phones", params=params)
389
+
390
+ def verify(self, input: JsonObject) -> object:
391
+ return self._client.request("POST", "/api/durable/channels/messaging/phones/verify", body=input)
392
+
393
+ def confirm(self, input: JsonObject) -> object:
394
+ return self._client.request("POST", "/api/durable/channels/messaging/phones/confirm", body=input)
395
+
396
+ def delete(self, phone_id: str) -> object:
397
+ return self._client.request("DELETE", f"/api/durable/channels/messaging/phones/{_path(phone_id)}")
398
+
399
+
400
+ class _SlackChannels:
401
+ def __init__(self, client: DurableClient) -> None:
402
+ self._client = client
403
+
404
+ def manifest(self, **params: object) -> object:
405
+ return self._client.request("GET", "/api/durable/channels/slack/manifest", params=params)
406
+
407
+
408
+ class _ChannelEndpoints:
409
+ def __init__(self, client: DurableClient) -> None:
410
+ self._client = client
411
+
412
+ def list(self, **params: object) -> object:
413
+ return self._client.request("GET", "/api/durable/channels/endpoints", params=params)
414
+
415
+
416
+ class _ChannelBindings:
417
+ def __init__(self, client: DurableClient) -> None:
418
+ self._client = client
419
+
420
+ def put(self, input: JsonObject) -> object:
421
+ return self._client.request("POST", "/api/durable/channels/bindings", body=input)
422
+
423
+ def delete(self, input: JsonObject) -> object:
424
+ return self._client.request("DELETE", "/api/durable/channels/bindings", body=input)
425
+
426
+
427
+ class _Usage:
428
+ def __init__(self, client: DurableClient) -> None:
429
+ self._client = client
430
+
431
+ def get(self) -> object:
432
+ return self._client.request("GET", "/api/durable/billing/usage")
433
+
434
+
435
+ class _Audit:
436
+ def __init__(self, client: DurableClient) -> None:
437
+ self._client = client
438
+
439
+ def list(self, **params: object) -> object:
440
+ return self._client.request("GET", "/api/durable/audit", params=params)
441
+
442
+ def iterate(self, **params: object) -> Iterator[object]:
443
+ return paginate(lambda page_params: _expect_mapping(self.list(**page_params)), params)
444
+
445
+
446
+ def _path(value: str) -> str:
447
+ return quote(value, safe="")
448
+
449
+
450
+ def _strip_trailing_slash(value: str) -> str:
451
+ return value.rstrip("/")
452
+
453
+
454
+ def _clean_params(params: QueryParams | None) -> dict[str, object]:
455
+ return {key: value for key, value in dict(params or {}).items() if value is not None}
456
+
457
+
458
+ def _expect_mapping(value: object) -> Mapping[str, object]:
459
+ if not isinstance(value, Mapping):
460
+ raise TypeError("Expected Durable API page response to be a mapping.")
461
+ return value
@@ -0,0 +1,61 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Mapping
4
+
5
+ import httpx
6
+
7
+
8
+ class DurableApiError(Exception):
9
+ """Normalized Durable API error."""
10
+
11
+ def __init__(
12
+ self,
13
+ *,
14
+ status_code: int,
15
+ code: str,
16
+ message: str,
17
+ request_id: str | None = None,
18
+ details: object | None = None,
19
+ headers: Mapping[str, str] | None = None,
20
+ ) -> None:
21
+ super().__init__(message)
22
+ self.status_code = status_code
23
+ self.code = code
24
+ self.message = message
25
+ self.request_id = request_id
26
+ self.details = details
27
+ self.headers = dict(headers or {})
28
+
29
+
30
+ def error_from_response(response: httpx.Response) -> DurableApiError:
31
+ headers = dict(response.headers)
32
+ fallback_message = f"Durable API request failed with status {response.status_code}"
33
+
34
+ try:
35
+ body = response.json()
36
+ except ValueError:
37
+ body = None
38
+
39
+ if isinstance(body, dict):
40
+ error = body.get("error")
41
+ if isinstance(error, dict):
42
+ code = error.get("code")
43
+ message = error.get("message")
44
+ if isinstance(code, str) and isinstance(message, str):
45
+ request_id = body.get("request_id")
46
+ return DurableApiError(
47
+ status_code=response.status_code,
48
+ code=code,
49
+ message=message,
50
+ request_id=request_id if isinstance(request_id, str) else None,
51
+ details=error.get("details"),
52
+ headers=headers,
53
+ )
54
+
55
+ return DurableApiError(
56
+ status_code=response.status_code,
57
+ code="unauthorized" if response.status_code == 401 else "api_error",
58
+ message=fallback_message,
59
+ request_id=response.headers.get("x-request-id"),
60
+ headers=headers,
61
+ )
@@ -0,0 +1,3 @@
1
+ from .durable_api_client import DurableApiClient
2
+
3
+ __all__ = ["DurableApiClient"]
@@ -0,0 +1,33 @@
1
+ from __future__ import annotations
2
+ from collections.abc import Callable
3
+ from kiota_abstractions.base_request_builder import BaseRequestBuilder
4
+ from kiota_abstractions.get_path_parameters import get_path_parameters
5
+ from kiota_abstractions.request_adapter import RequestAdapter
6
+ from typing import Any, Optional, TYPE_CHECKING, Union
7
+
8
+ if TYPE_CHECKING:
9
+ from .durable.durable_request_builder import DurableRequestBuilder
10
+
11
+ class ApiRequestBuilder(BaseRequestBuilder):
12
+ """
13
+ Builds and executes requests for operations under /api
14
+ """
15
+ def __init__(self,request_adapter: RequestAdapter, path_parameters: Union[str, dict[str, Any]]) -> None:
16
+ """
17
+ Instantiates a new ApiRequestBuilder and sets the default values.
18
+ param path_parameters: The raw url or the url-template parameters for the request.
19
+ param request_adapter: The request adapter to use to execute the requests.
20
+ Returns: None
21
+ """
22
+ super().__init__(request_adapter, "{+baseurl}/api", path_parameters)
23
+
24
+ @property
25
+ def durable(self) -> DurableRequestBuilder:
26
+ """
27
+ The durable property
28
+ """
29
+ from .durable.durable_request_builder import DurableRequestBuilder
30
+
31
+ return DurableRequestBuilder(self.request_adapter, self.path_parameters)
32
+
33
+