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.
- durable_agents/__init__.py +17 -0
- durable_agents/_build_info.py +3 -0
- durable_agents/client.py +461 -0
- durable_agents/errors.py +61 -0
- durable_agents/generated/__init__.py +3 -0
- durable_agents/generated/api/api_request_builder.py +33 -0
- durable_agents/generated/api/durable/accounts/accounts_request_builder.py +156 -0
- durable_agents/generated/api/durable/accounts/item/connect/connect_request_builder.py +81 -0
- durable_agents/generated/api/durable/accounts/item/with_account_item_request_builder.py +130 -0
- durable_agents/generated/api/durable/agents/agents_request_builder.py +155 -0
- durable_agents/generated/api/durable/agents/item/runs/runs_request_builder.py +99 -0
- durable_agents/generated/api/durable/agents/item/webhooks/item/with_webhook_token_item_request_builder.py +89 -0
- durable_agents/generated/api/durable/agents/item/webhooks/item/with_webhook_token_post_request_body.py +43 -0
- durable_agents/generated/api/durable/agents/item/webhooks/webhooks_request_builder.py +38 -0
- durable_agents/generated/api/durable/agents/item/with_agent_item_request_builder.py +186 -0
- durable_agents/generated/api/durable/audit/audit_request_builder.py +91 -0
- durable_agents/generated/api/durable/billing/billing_request_builder.py +33 -0
- durable_agents/generated/api/durable/billing/usage/usage_request_builder.py +81 -0
- durable_agents/generated/api/durable/channels/bindings/bindings_request_builder.py +136 -0
- durable_agents/generated/api/durable/channels/channels_request_builder.py +83 -0
- durable_agents/generated/api/durable/channels/connectors/channel_connector_create.py +121 -0
- durable_agents/generated/api/durable/channels/connectors/connectors_request_builder.py +153 -0
- durable_agents/generated/api/durable/channels/connectors/item/with_connector_item_request_builder.py +81 -0
- durable_agents/generated/api/durable/channels/email/email_request_builder.py +33 -0
- durable_agents/generated/api/durable/channels/email/inboxes/inboxes_request_builder.py +153 -0
- durable_agents/generated/api/durable/channels/email/inboxes/item/messages/item/with_message_item_request_builder.py +81 -0
- durable_agents/generated/api/durable/channels/email/inboxes/item/messages/messages_request_builder.py +153 -0
- durable_agents/generated/api/durable/channels/email/inboxes/item/with_inbox_item_request_builder.py +91 -0
- durable_agents/generated/api/durable/channels/endpoints/endpoints_request_builder.py +96 -0
- durable_agents/generated/api/durable/channels/messaging/messaging_request_builder.py +43 -0
- durable_agents/generated/api/durable/channels/messaging/phones/confirm/confirm_request_builder.py +89 -0
- durable_agents/generated/api/durable/channels/messaging/phones/item/with_phone_item_request_builder.py +81 -0
- durable_agents/generated/api/durable/channels/messaging/phones/phones_request_builder.py +116 -0
- durable_agents/generated/api/durable/channels/messaging/phones/verify/verify_request_builder.py +89 -0
- durable_agents/generated/api/durable/channels/messaging/status/status_request_builder.py +81 -0
- durable_agents/generated/api/durable/channels/slack/manifest/manifest_request_builder.py +89 -0
- durable_agents/generated/api/durable/channels/slack/slack_request_builder.py +33 -0
- durable_agents/generated/api/durable/connectors/connectors_request_builder.py +155 -0
- durable_agents/generated/api/durable/connectors/item/connect/connect_request_builder.py +81 -0
- durable_agents/generated/api/durable/connectors/item/disconnect/disconnect_request_builder.py +81 -0
- durable_agents/generated/api/durable/connectors/item/with_connector_item_request_builder.py +186 -0
- durable_agents/generated/api/durable/content/content_request_builder.py +170 -0
- durable_agents/generated/api/durable/content/item/with_content_item_request_builder.py +166 -0
- durable_agents/generated/api/durable/data_sources/data_sources_request_builder.py +176 -0
- durable_agents/generated/api/durable/data_sources/discover/discover_request_builder.py +38 -0
- durable_agents/generated/api/durable/data_sources/discover/item/with_type_item_request_builder.py +89 -0
- durable_agents/generated/api/durable/data_sources/item/pause/pause_request_builder.py +81 -0
- durable_agents/generated/api/durable/data_sources/item/resume/resume_request_builder.py +81 -0
- durable_agents/generated/api/durable/data_sources/item/sync/sync_request_builder.py +81 -0
- durable_agents/generated/api/durable/data_sources/item/with_source_item_request_builder.py +196 -0
- durable_agents/generated/api/durable/durable_request_builder.py +163 -0
- durable_agents/generated/api/durable/keys/claim/claim_request_builder.py +89 -0
- durable_agents/generated/api/durable/keys/item/with_key_item_request_builder.py +81 -0
- durable_agents/generated/api/durable/keys/keys_request_builder.py +153 -0
- durable_agents/generated/api/durable/models_requests/models_request_builder.py +81 -0
- durable_agents/generated/api/durable/personas/item/with_persona_item_request_builder.py +166 -0
- durable_agents/generated/api/durable/personas/personas_request_builder.py +155 -0
- durable_agents/generated/api/durable/runs/item/cancel/cancel_request_builder.py +81 -0
- durable_agents/generated/api/durable/runs/item/events/events_request_builder.py +95 -0
- durable_agents/generated/api/durable/runs/item/pause/pause_request_builder.py +81 -0
- durable_agents/generated/api/durable/runs/item/prompt/prompt_request_builder.py +99 -0
- durable_agents/generated/api/durable/runs/item/replay/replay_request_builder.py +81 -0
- durable_agents/generated/api/durable/runs/item/resume/resume_request_builder.py +89 -0
- durable_agents/generated/api/durable/runs/item/with_run_item_request_builder.py +141 -0
- durable_agents/generated/api/durable/runs/runs_request_builder.py +111 -0
- durable_agents/generated/api/durable/skills/item/with_skill_item_request_builder.py +166 -0
- durable_agents/generated/api/durable/skills/skills_request_builder.py +153 -0
- durable_agents/generated/api/durable/vfs/entries/entries_request_builder.py +113 -0
- durable_agents/generated/api/durable/vfs/item_escaped/item_escaped_request_builder.py +92 -0
- durable_agents/generated/api/durable/vfs/search/search_request_builder.py +113 -0
- durable_agents/generated/api/durable/vfs/vfs_request_builder.py +53 -0
- durable_agents/generated/durable_api_client.py +54 -0
- durable_agents/generated/models/account.py +74 -0
- durable_agents/generated/models/account_create.py +50 -0
- durable_agents/generated/models/account_list.py +54 -0
- durable_agents/generated/models/account_mutation_result.py +61 -0
- durable_agents/generated/models/account_mutation_result_authorize_url.py +62 -0
- durable_agents/generated/models/account_mutation_result_authorize_url_member1.py +43 -0
- durable_agents/generated/models/account_provider.py +22 -0
- durable_agents/generated/models/account_status.py +7 -0
- durable_agents/generated/models/agent.py +128 -0
- durable_agents/generated/models/agent_create.py +107 -0
- durable_agents/generated/models/agent_list.py +54 -0
- durable_agents/generated/models/agent_mode.py +9 -0
- durable_agents/generated/models/agent_mutable_state.py +6 -0
- durable_agents/generated/models/agent_patch.py +114 -0
- durable_agents/generated/models/api_key.py +75 -0
- durable_agents/generated/models/api_key_claim.py +43 -0
- durable_agents/generated/models/api_key_create.py +51 -0
- durable_agents/generated/models/api_key_list.py +54 -0
- durable_agents/generated/models/audit_event.py +81 -0
- durable_agents/generated/models/audit_event_actor.py +9 -0
- durable_agents/generated/models/audit_event_data.py +43 -0
- durable_agents/generated/models/audit_event_list.py +54 -0
- durable_agents/generated/models/billing_usage.py +118 -0
- durable_agents/generated/models/billing_usage_provider_kind.py +6 -0
- durable_agents/generated/models/billing_usage_status.py +9 -0
- durable_agents/generated/models/channel.py +64 -0
- durable_agents/generated/models/channel_binding.py +89 -0
- durable_agents/generated/models/channel_binding_delete.py +73 -0
- durable_agents/generated/models/channel_binding_put.py +88 -0
- durable_agents/generated/models/channel_config.py +43 -0
- durable_agents/generated/models/channel_connector.py +82 -0
- durable_agents/generated/models/channel_connector_list.py +54 -0
- durable_agents/generated/models/channel_connector_status.py +7 -0
- durable_agents/generated/models/channel_endpoint.py +91 -0
- durable_agents/generated/models/channel_endpoint_list.py +54 -0
- durable_agents/generated/models/channel_endpoint_status.py +7 -0
- durable_agents/generated/models/channel_input.py +64 -0
- durable_agents/generated/models/channel_input_config.py +43 -0
- durable_agents/generated/models/channel_setup_guide.py +70 -0
- durable_agents/generated/models/channel_setup_guide_required_credentials.py +6 -0
- durable_agents/generated/models/channel_status.py +7 -0
- durable_agents/generated/models/channel_type.py +13 -0
- durable_agents/generated/models/connector.py +96 -0
- durable_agents/generated/models/connector_auth_status.py +80 -0
- durable_agents/generated/models/connector_create.py +72 -0
- durable_agents/generated/models/connector_create_env.py +43 -0
- durable_agents/generated/models/connector_create_headers.py +43 -0
- durable_agents/generated/models/connector_create_type.py +6 -0
- durable_agents/generated/models/connector_list.py +54 -0
- durable_agents/generated/models/connector_mutation_result.py +61 -0
- durable_agents/generated/models/connector_mutation_result_authorize_url.py +62 -0
- durable_agents/generated/models/connector_mutation_result_authorize_url_member1.py +43 -0
- durable_agents/generated/models/connector_provider.py +10 -0
- durable_agents/generated/models/connector_status.py +8 -0
- durable_agents/generated/models/connector_type.py +7 -0
- durable_agents/generated/models/connector_update.py +65 -0
- durable_agents/generated/models/connector_update_env.py +43 -0
- durable_agents/generated/models/connector_update_headers.py +43 -0
- durable_agents/generated/models/content.py +161 -0
- durable_agents/generated/models/content_create.py +66 -0
- durable_agents/generated/models/content_list.py +54 -0
- durable_agents/generated/models/content_patch.py +51 -0
- durable_agents/generated/models/content_source_metadata.py +58 -0
- durable_agents/generated/models/content_type.py +17 -0
- durable_agents/generated/models/data_source.py +98 -0
- durable_agents/generated/models/data_source_account.py +61 -0
- durable_agents/generated/models/data_source_account_member1.py +43 -0
- durable_agents/generated/models/data_source_account_member2.py +47 -0
- durable_agents/generated/models/data_source_create.py +188 -0
- durable_agents/generated/models/data_source_create_result.py +54 -0
- durable_agents/generated/models/data_source_discover_request.py +67 -0
- durable_agents/generated/models/data_source_discovery_item.py +66 -0
- durable_agents/generated/models/data_source_discovery_list.py +54 -0
- durable_agents/generated/models/data_source_list.py +54 -0
- durable_agents/generated/models/data_source_provider.py +33 -0
- durable_agents/generated/models/data_source_read_limit.py +62 -0
- durable_agents/generated/models/data_source_read_limit_member1.py +43 -0
- durable_agents/generated/models/data_source_resource.py +62 -0
- durable_agents/generated/models/data_source_resource_input.py +58 -0
- durable_agents/generated/models/data_source_resource_kind.py +25 -0
- durable_agents/generated/models/data_source_schedule.py +16 -0
- durable_agents/generated/models/data_source_status.py +9 -0
- durable_agents/generated/models/data_source_type.py +71 -0
- durable_agents/generated/models/data_source_update.py +58 -0
- durable_agents/generated/models/deleted_response.py +43 -0
- durable_agents/generated/models/discord_channel_connector_create.py +58 -0
- durable_agents/generated/models/discord_connector_secrets.py +51 -0
- durable_agents/generated/models/effort.py +8 -0
- durable_agents/generated/models/email_inbox.py +67 -0
- durable_agents/generated/models/email_inbox_create.py +43 -0
- durable_agents/generated/models/email_inbox_list.py +54 -0
- durable_agents/generated/models/email_inbox_status.py +6 -0
- durable_agents/generated/models/email_message.py +85 -0
- durable_agents/generated/models/email_message_attachment.py +63 -0
- durable_agents/generated/models/email_message_headers.py +43 -0
- durable_agents/generated/models/email_message_list.py +54 -0
- durable_agents/generated/models/email_message_send.py +67 -0
- durable_agents/generated/models/email_message_send_result.py +47 -0
- durable_agents/generated/models/email_message_summary.py +112 -0
- durable_agents/generated/models/endpoint_provider.py +12 -0
- durable_agents/generated/models/endpoint_type.py +8 -0
- durable_agents/generated/models/entity_state.py +32 -0
- durable_agents/generated/models/error_body.py +47 -0
- durable_agents/generated/models/error_envelope.py +61 -0
- durable_agents/generated/models/file_type.py +20 -0
- durable_agents/generated/models/google_chat_channel_connector_create.py +58 -0
- durable_agents/generated/models/google_chat_connector_secrets.py +47 -0
- durable_agents/generated/models/heartbeat.py +78 -0
- durable_agents/generated/models/heartbeat_probe_thresholds.py +43 -0
- durable_agents/generated/models/key_create_response.py +54 -0
- durable_agents/generated/models/messaging_status.py +68 -0
- durable_agents/generated/models/messaging_status_provider.py +5 -0
- durable_agents/generated/models/model.py +70 -0
- durable_agents/generated/models/model_durable_preset.py +62 -0
- durable_agents/generated/models/model_durable_preset_member1.py +43 -0
- durable_agents/generated/models/model_list.py +54 -0
- durable_agents/generated/models/named_ref.py +47 -0
- durable_agents/generated/models/persona.py +79 -0
- durable_agents/generated/models/persona_create.py +51 -0
- durable_agents/generated/models/persona_list.py +54 -0
- durable_agents/generated/models/persona_patch.py +51 -0
- durable_agents/generated/models/phone_confirm_request.py +47 -0
- durable_agents/generated/models/phone_verify_request.py +43 -0
- durable_agents/generated/models/ref.py +43 -0
- durable_agents/generated/models/registered_phone.py +56 -0
- durable_agents/generated/models/registered_phone_list.py +54 -0
- durable_agents/generated/models/run.py +113 -0
- durable_agents/generated/models/run_create.py +69 -0
- durable_agents/generated/models/run_create_input.py +43 -0
- durable_agents/generated/models/run_create_mode.py +62 -0
- durable_agents/generated/models/run_create_mode_member1.py +43 -0
- durable_agents/generated/models/run_error.py +47 -0
- durable_agents/generated/models/run_event.py +82 -0
- durable_agents/generated/models/run_event_data.py +46 -0
- durable_agents/generated/models/run_event_list.py +54 -0
- durable_agents/generated/models/run_event_type.py +24 -0
- durable_agents/generated/models/run_input.py +43 -0
- durable_agents/generated/models/run_list.py +54 -0
- durable_agents/generated/models/run_mode.py +9 -0
- durable_agents/generated/models/run_output.py +43 -0
- durable_agents/generated/models/run_prompt.py +65 -0
- durable_agents/generated/models/run_prompt_input.py +43 -0
- durable_agents/generated/models/run_prompt_mode.py +62 -0
- durable_agents/generated/models/run_prompt_mode_member1.py +43 -0
- durable_agents/generated/models/run_replay.py +57 -0
- durable_agents/generated/models/run_resume.py +43 -0
- durable_agents/generated/models/run_status.py +12 -0
- durable_agents/generated/models/schedule.py +62 -0
- durable_agents/generated/models/schedule_recurrence_type.py +8 -0
- durable_agents/generated/models/sent_response.py +43 -0
- durable_agents/generated/models/skill.py +82 -0
- durable_agents/generated/models/skill_argument.py +51 -0
- durable_agents/generated/models/skill_create.py +62 -0
- durable_agents/generated/models/skill_list.py +54 -0
- durable_agents/generated/models/skill_patch.py +62 -0
- durable_agents/generated/models/slack_channel_connector_create.py +58 -0
- durable_agents/generated/models/slack_connector_secrets.py +51 -0
- durable_agents/generated/models/target.py +72 -0
- durable_agents/generated/models/target_config.py +43 -0
- durable_agents/generated/models/target_input.py +72 -0
- durable_agents/generated/models/target_input_config.py +43 -0
- durable_agents/generated/models/target_input_type.py +30 -0
- durable_agents/generated/models/target_type.py +30 -0
- durable_agents/generated/models/teams_channel_connector_create.py +58 -0
- durable_agents/generated/models/teams_connector_secrets.py +51 -0
- durable_agents/generated/models/telegram_channel_connector_create.py +58 -0
- durable_agents/generated/models/telegram_connector_secrets.py +51 -0
- durable_agents/generated/models/usage_summary.py +67 -0
- durable_agents/generated/models/vfs_body.py +54 -0
- durable_agents/generated/models/vfs_body_format.py +7 -0
- durable_agents/generated/models/vfs_children.py +47 -0
- durable_agents/generated/models/vfs_entry.py +119 -0
- durable_agents/generated/models/vfs_entry_kind.py +6 -0
- durable_agents/generated/models/vfs_entry_list.py +54 -0
- durable_agents/generated/models/vfs_item.py +71 -0
- durable_agents/generated/models/vfs_search_match.py +99 -0
- durable_agents/generated/models/vfs_search_match_list.py +54 -0
- durable_agents/generated/models/webhook_ack.py +54 -0
- durable_agents/generated/models/whats_app_channel_connector_create.py +58 -0
- durable_agents/generated/models/whats_app_connector_secrets.py +55 -0
- durable_agents/pagination.py +31 -0
- durable_agents/py.typed +1 -0
- durable_agents/streaming.py +111 -0
- durable_agents_sdk-1.0.20260608003.dev0.dist-info/METADATA +114 -0
- durable_agents_sdk-1.0.20260608003.dev0.dist-info/RECORD +260 -0
- durable_agents_sdk-1.0.20260608003.dev0.dist-info/WHEEL +5 -0
- durable_agents_sdk-1.0.20260608003.dev0.dist-info/licenses/LICENSE +21 -0
- 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
|
+
]
|
durable_agents/client.py
ADDED
|
@@ -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
|
durable_agents/errors.py
ADDED
|
@@ -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,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
|
+
|