managed-deepagents 0.6.2.dev4__py3-none-win_amd64.whl → 0.6.2.dev6__py3-none-win_amd64.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.
Binary file
@@ -2,30 +2,31 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- import logging
6
5
  import os
6
+ import uuid
7
7
  from collections.abc import Awaitable, Callable, Mapping
8
8
  from importlib import import_module
9
9
  from typing import TYPE_CHECKING, Any, Literal, TypedDict, cast
10
10
 
11
11
  from managed_deepagents._channels.assistant_text import extract_assistant_text
12
12
  from managed_deepagents._channels.binding import SLACK_BOT_TOKEN_ENV
13
+ from managed_deepagents._channels.trigger.client import create_trigger_client
13
14
  from managed_deepagents._identity_runtime import (
14
15
  _ambient_configurable,
15
16
  _configurable_from_runtime,
16
17
  )
18
+ from managed_deepagents._log import logger
17
19
  from managed_deepagents._memory.async_util import await_if_needed
18
20
 
19
21
  if TYPE_CHECKING:
20
22
  from langchain.agents.middleware.types import AgentMiddleware
21
23
 
24
+ from managed_deepagents._channels.trigger.types import TriggerChannelActionRequest
22
25
  from managed_deepagents._channels.types import ChannelAddress
23
26
  else:
24
27
  # Authoring-light installs may lack langchain; annotations stay deferred.
25
28
  AgentMiddleware = object
26
29
 
27
- _LOG = logging.getLogger("mda")
28
-
29
30
  _schedule_metadata_for_tests: Callable[[], Mapping[str, object] | None] | None = None
30
31
 
31
32
 
@@ -58,6 +59,16 @@ class NormalizedScheduleDeliverTo(TypedDict):
58
59
  auto_post: bool
59
60
 
60
61
 
62
+ def get_deployment_id(env: Mapping[str, str] | None = None) -> str | None:
63
+ """Return the deployment ID supplied by the managed runtime."""
64
+ resolved_env = os.environ if env is None else env
65
+ for key in ("LANGSMITH_HOST_PROJECT_ID", "LANGGRAPH_CLOUD_ID"):
66
+ value = (resolved_env.get(key) or "").strip()
67
+ if value:
68
+ return value
69
+ return None
70
+
71
+
61
72
  def read_schedule_deliver_to( # noqa: PLR0911 - validation short-circuits
62
73
  configurable: Mapping[str, object] | None,
63
74
  ) -> NormalizedScheduleDeliverTo | None:
@@ -122,7 +133,7 @@ def address_from_deliver_to(to: _ProviderConversation | _ProviderThread) -> Chan
122
133
  return {"conversation_id": to["conversation_id"]}
123
134
 
124
135
 
125
- async def deliver_schedule_result( # noqa: PLR0911 - soft-fail outcomes
136
+ async def deliver_schedule_result( # noqa: C901, PLR0911 - soft-fail outcomes
126
137
  *,
127
138
  deliver_to: NormalizedScheduleDeliverTo,
128
139
  reply_text: str,
@@ -134,9 +145,9 @@ async def deliver_schedule_result( # noqa: PLR0911 - soft-fail outcomes
134
145
  if not text or not deliver_to["auto_post"]:
135
146
  return "skipped"
136
147
  if deliver_to["channel"] != "slack":
137
- _LOG.error(
138
- "schedule deliver_to channel %r is not supported yet",
139
- deliver_to["channel"],
148
+ logger.error(
149
+ 'schedule deliver_to channel "%s" is not supported yet',
150
+ logger.log_identifier(deliver_to["channel"]),
140
151
  )
141
152
  return "failed"
142
153
 
@@ -151,15 +162,47 @@ async def deliver_schedule_result( # noqa: PLR0911 - soft-fail outcomes
151
162
  if hasattr(result, "__await__"):
152
163
  await cast("Awaitable[object]", result)
153
164
  return "posted"
154
- except Exception: # noqa: BLE001 - soft-fail schedule delivery
155
- _LOG.exception("schedule Slack delivery failed")
165
+ except Exception as error: # noqa: BLE001 - soft-fail schedule delivery
166
+ logger.error(
167
+ "schedule Slack delivery failed (%s)",
168
+ logger.safe_error_label(error),
169
+ )
170
+ return "failed"
171
+
172
+ deployment_id = get_deployment_id()
173
+ try:
174
+ client = create_trigger_client()
175
+ except ValueError:
176
+ client = None
177
+ if client is not None and deployment_id:
178
+ action: TriggerChannelActionRequest = {
179
+ "type": "post",
180
+ "action_id": str(uuid.uuid4()),
181
+ "address": dict(address),
182
+ "message": {"text": text},
183
+ }
184
+ try:
185
+ await client.post_deployment_action(
186
+ deployment_id,
187
+ deliver_to["channel"],
188
+ action,
189
+ )
190
+ return "posted"
191
+ except Exception as error: # noqa: BLE001 - soft-fail schedule delivery
192
+ logger.error(
193
+ "schedule Trigger channel delivery failed (%s)",
194
+ logger.safe_error_label(error),
195
+ )
156
196
  return "failed"
157
197
 
158
198
  token = (
159
199
  bot_token if bot_token is not None else os.environ.get(SLACK_BOT_TOKEN_ENV) or ""
160
200
  ).strip()
161
201
  if not token:
162
- _LOG.error("schedule deliver_to requires SLACK_BOT_TOKEN; skipping auto-post")
202
+ logger.error(
203
+ "schedule deliver_to requires Trigger channel configuration or "
204
+ "SLACK_BOT_TOKEN; skipping auto-post"
205
+ )
163
206
  return "failed"
164
207
 
165
208
  try:
@@ -176,8 +219,11 @@ async def deliver_schedule_result( # noqa: PLR0911 - soft-fail outcomes
176
219
  if hasattr(posted, "__await__"):
177
220
  await cast("Awaitable[object]", posted)
178
221
  return "posted"
179
- except Exception: # noqa: BLE001 - soft-fail schedule delivery
180
- _LOG.exception("schedule Slack delivery failed")
222
+ except Exception as error: # noqa: BLE001 - soft-fail schedule delivery
223
+ logger.error(
224
+ "schedule Slack delivery failed (%s)",
225
+ logger.safe_error_label(error),
226
+ )
181
227
  return "failed"
182
228
 
183
229
 
@@ -297,6 +343,7 @@ __all__ = [
297
343
  "address_from_deliver_to",
298
344
  "create_schedule_delivery_middleware",
299
345
  "deliver_schedule_result",
346
+ "get_deployment_id",
300
347
  "is_trusted_schedule_delivery_run",
301
348
  "read_schedule_deliver_to",
302
349
  ]
@@ -93,18 +93,41 @@ class TriggerClient(TriggerClientLike):
93
93
  channel_id: str,
94
94
  body: TriggerChannelActionRequest,
95
95
  ) -> TriggerChannelActionResponse:
96
- response = await self._post("actions", channel_id, body)
97
- response_id = response.get("id") if isinstance(response, dict) else None
98
- if not isinstance(response_id, str) or not response_id.strip():
99
- raise TriggerClientError("actions")
100
- return {"id": response_id}
96
+ encoded_channel_id = urllib.parse.quote(channel_id, safe="")
97
+ response = await self._post(
98
+ "actions",
99
+ f"{self._api_base}/channels/{encoded_channel_id}/actions",
100
+ body,
101
+ )
102
+ return _parse_action_response(response)
103
+
104
+ async def post_deployment_action(
105
+ self,
106
+ deployment_id: str,
107
+ channel_name: str,
108
+ body: TriggerChannelActionRequest,
109
+ ) -> TriggerChannelActionResponse:
110
+ query = urllib.parse.urlencode(
111
+ {"deployment_id": deployment_id, "channel_name": channel_name}
112
+ )
113
+ response = await self._post(
114
+ "actions",
115
+ f"{self._api_base}/channels/actions?{query}",
116
+ body,
117
+ )
118
+ return _parse_action_response(response)
101
119
 
102
120
  async def post_runtime_event(
103
121
  self,
104
122
  channel_id: str,
105
123
  body: TriggerChannelRuntimeEventRequest,
106
124
  ) -> TriggerChannelRuntimeEventResponse:
107
- response = await self._post("events", channel_id, body)
125
+ encoded_channel_id = urllib.parse.quote(channel_id, safe="")
126
+ response = await self._post(
127
+ "events",
128
+ f"{self._api_base}/channels/{encoded_channel_id}/events",
129
+ body,
130
+ )
108
131
  status = response.get("status") if isinstance(response, dict) else None
109
132
  if not isinstance(status, str):
110
133
  raise TriggerClientError("events")
@@ -113,11 +136,9 @@ class TriggerClient(TriggerClientLike):
113
136
  async def _post(
114
137
  self,
115
138
  operation: TriggerClientOperation,
116
- channel_id: str,
139
+ url: str,
117
140
  body: TriggerChannelActionRequest | TriggerChannelRuntimeEventRequest,
118
141
  ) -> object:
119
- encoded_channel_id = urllib.parse.quote(channel_id, safe="")
120
- url = f"{self._api_base}/channels/{encoded_channel_id}/{operation}"
121
142
  headers = {
122
143
  "content-type": "application/json",
123
144
  "x-api-key": self._api_key,
@@ -144,6 +165,13 @@ class TriggerClient(TriggerClientLike):
144
165
  raise TriggerClientError(operation) from None
145
166
 
146
167
 
168
+ def _parse_action_response(response: object) -> TriggerChannelActionResponse:
169
+ response_id = response.get("id") if isinstance(response, dict) else None
170
+ if not isinstance(response_id, str) or not response_id.strip():
171
+ raise TriggerClientError("actions")
172
+ return {"id": response_id}
173
+
174
+
147
175
  def create_trigger_client(
148
176
  *,
149
177
  user_id: str | None = None,
@@ -66,14 +66,17 @@ class TriggerChannelActionMessage(TypedDict):
66
66
  text: str
67
67
 
68
68
 
69
- class TriggerChannelActionRequest(TypedDict):
69
+ class TriggerChannelActionRequestRequired(TypedDict):
70
70
  type: Literal["post"]
71
71
  action_id: str
72
72
  address: TriggerChannelAddress
73
- source_thread_key: str
74
73
  message: TriggerChannelActionMessage
75
74
 
76
75
 
76
+ class TriggerChannelActionRequest(TriggerChannelActionRequestRequired, total=False):
77
+ source_thread_key: str
78
+
79
+
77
80
  class TriggerChannelActionResponse(TypedDict):
78
81
  id: str
79
82
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: managed-deepagents
3
- Version: 0.6.2.dev4
3
+ Version: 0.6.2.dev6
4
4
  Summary: Managed Deep Agents — the define_deep_agent authoring interface plus the CLI that compiles and deploys a code-first Deep Agent repository to a managed LangGraph runtime.
5
5
  Author: LangChain
6
6
  License: MIT
@@ -24,7 +24,7 @@ managed_deepagents/py.typed,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
24
24
  managed_deepagents/runtime.py,sha256=vRAFLVxoYKW-MA8C8aei-23NpS-0MRgjSn4WhezFAR8,64712
25
25
  managed_deepagents/sandbox.py,sha256=xlpcWa6CoVX6GKip2nK-0Lw-HBCoFGFYm0r4x9eYwcY,2530
26
26
  managed_deepagents/schedules.py,sha256=MtTQN4tlm1NizFDCjZZv_huGfbQx-dj9WP1dIBybCug,5237
27
- managed_deepagents/_binaries/mda.exe,sha256=Tq3ggZyrxUsBb7xIMnceQ7qE6PacG3ErM_i928e28q0,3744768
27
+ managed_deepagents/_binaries/mda.exe,sha256=ngWx0uGQFytZU9DxaWBH6SQDflmWph6OT_Tvr0vL5r8,3746816
28
28
  managed_deepagents/_channels/__init__.py,sha256=Z6eXmzaLxG09DSyJoY_CX34axcsBo9gSJ0G7pRm2D6M,1216
29
29
  managed_deepagents/_channels/assistant_text.py,sha256=f-Z3J3PlQFXZHztgBxlRoqB2LigU1Hj1YpwoXBMTR18,2171
30
30
  managed_deepagents/_channels/binding.py,sha256=6vAKbWpg-eyLErJ0SsozH4mZc50hA1NhquM63mVmWDQ,3423
@@ -34,7 +34,7 @@ managed_deepagents/_channels/registry.py,sha256=Y-dYgc1ClR5r1qdyxeQC6kVfOeUnaBP6
34
34
  managed_deepagents/_channels/registry_store.py,sha256=1jDlzL3WS9TkqjKmHS0zLeNeB7c_0p_NgbayQS9u2ak,705
35
35
  managed_deepagents/_channels/response_format.py,sha256=DbXVhj1YyOF0nSr7Lglu440IvAmMA9ulfGXvkmFVsSo,2554
36
36
  managed_deepagents/_channels/runtime.py,sha256=86qFJ4lqNUD-dSn5arwL7yHPWd4LKLVmcGAvAkrPSqY,6542
37
- managed_deepagents/_channels/schedule_delivery.py,sha256=TkN3VAlSc_CeL17Grg2kbP-fJisy-UOBjMIysKhsDGE,10994
37
+ managed_deepagents/_channels/schedule_delivery.py,sha256=MqpGIjSit6ybhoRq5MTAggUfPK4kfSUCyk9Gaz02XjE,12694
38
38
  managed_deepagents/_channels/store.py,sha256=NfQyqqB7KiWyGq23Lt79t9I5EPwrKBUvSUWZnx_z7JY,4454
39
39
  managed_deepagents/_channels/types.py,sha256=E-bQyPeYXmjcUIgu8t4U9nr6O3Aqn_HgSZ0FubEpq2I,4675
40
40
  managed_deepagents/_channels/slack/__init__.py,sha256=5d7Su1eGArEYv71RMXy_O5srH0klr9bbSzvyYnS3UFs,9062
@@ -45,9 +45,9 @@ managed_deepagents/_channels/slack/source_thread.py,sha256=loHsYK7nKBOMetFr9hLSP
45
45
  managed_deepagents/_channels/slack/transport.py,sha256=_xQmzK2hBpPOoY3zKFhzc3vvluoF0wkvRb_UfJYU040,8404
46
46
  managed_deepagents/_channels/trigger/__init__.py,sha256=bWj66XoPbDdrztPUCKBuSJBBS2pBocn4EA8FDE3WeBA,48
47
47
  managed_deepagents/_channels/trigger/channel.py,sha256=rKSvOABOZX58ZIvZ3hKcYxvTx9npQ0YXPQWk9JEy6XE,5108
48
- managed_deepagents/_channels/trigger/client.py,sha256=HmKD3RLpgvzamYOQJjhDAQfqGEcP66a9HMyiKwpvO1Q,7778
48
+ managed_deepagents/_channels/trigger/client.py,sha256=cM97gzYWUTFC9o3uoveFe9-HxZc6_VqiqC8u4fKqjXc,8572
49
49
  managed_deepagents/_channels/trigger/http.py,sha256=_rav5ER_4TL5R94NCVUONH-tfjoblopg_WMWfGaPZng,12303
50
- managed_deepagents/_channels/trigger/types.py,sha256=aI2AszYR6sN7OmSQOBhBWMvE0WZxJqE0m-SyksgBX2M,6182
50
+ managed_deepagents/_channels/trigger/types.py,sha256=G4kW1zKV2JlNyV7evGra-lSrZ_ZpVsRQm2iSx0iLEGE,6277
51
51
  managed_deepagents/_connectors/__init__.py,sha256=c_SdH3T7T6bgX7-I5jxAqDzHojmqVUCX0AXRI7g5Ovs,575
52
52
  managed_deepagents/_connectors/tool_selection.py,sha256=xMvohEvg_rguQvziUXzxKn4V140mmearZHel97F8tVs,2978
53
53
  managed_deepagents/_connectors/mcp/__init__.py,sha256=UX3mPj6mg7QWsCD8PZshk-j3reHCW-8DyyNxNip9E68,8562
@@ -64,9 +64,9 @@ managed_deepagents/identity/__init__.py,sha256=7qfGbOfQf4-5EQT6Ssrf8_CRhkihr-ENf
64
64
  managed_deepagents/identity/claims.py,sha256=prby7r_8Lww3MmoBm8PX6PsSGE3GwSHkr8mVIz_08nU,1180
65
65
  managed_deepagents/identity/options.py,sha256=x_yMbXEFR7zXyehEjDHG2qjAlukXjrRBcQLcM6IndLM,2550
66
66
  managed_deepagents/identity/supabase.py,sha256=8uobl3WCrQL_ieSXG8KTLf1th7Qjim9liZT50HeaJE0,6026
67
- managed_deepagents-0.6.2.dev4.dist-info/licenses/LICENSE,sha256=WnPZQQ608ojZUkXl7BW6VbKloIAibZiGm1K6cjeZOL8,1066
68
- managed_deepagents-0.6.2.dev4.dist-info/METADATA,sha256=0alJE7loSiE2eMsfn7yOu7q7X9iLxMiw4g5WhBviPRU,12848
69
- managed_deepagents-0.6.2.dev4.dist-info/WHEEL,sha256=3I5VVWZdsFlU417aCS2bMRuerS8wsfvBq99MyatBV3A,97
70
- managed_deepagents-0.6.2.dev4.dist-info/entry_points.txt,sha256=ziZqkKuaDO3qHCjKmBhrx9cm3ok8bZ9xcEDpUTj4unM,53
71
- managed_deepagents-0.6.2.dev4.dist-info/top_level.txt,sha256=fdBo4O0Hlol_w022tTLB5ftZpamb4yJoQ3MUvjgTGfA,19
72
- managed_deepagents-0.6.2.dev4.dist-info/RECORD,,
67
+ managed_deepagents-0.6.2.dev6.dist-info/licenses/LICENSE,sha256=WnPZQQ608ojZUkXl7BW6VbKloIAibZiGm1K6cjeZOL8,1066
68
+ managed_deepagents-0.6.2.dev6.dist-info/METADATA,sha256=Xj7KIRtdPojE3228J5SuLI-sYHT_-qnSQI35kjeAfwU,12848
69
+ managed_deepagents-0.6.2.dev6.dist-info/WHEEL,sha256=3I5VVWZdsFlU417aCS2bMRuerS8wsfvBq99MyatBV3A,97
70
+ managed_deepagents-0.6.2.dev6.dist-info/entry_points.txt,sha256=ziZqkKuaDO3qHCjKmBhrx9cm3ok8bZ9xcEDpUTj4unM,53
71
+ managed_deepagents-0.6.2.dev6.dist-info/top_level.txt,sha256=fdBo4O0Hlol_w022tTLB5ftZpamb4yJoQ3MUvjgTGfA,19
72
+ managed_deepagents-0.6.2.dev6.dist-info/RECORD,,