managed-deepagents 0.6.2.dev5__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.
- managed_deepagents/_binaries/mda.exe +0 -0
- managed_deepagents/_channels/schedule_delivery.py +59 -12
- managed_deepagents/_channels/trigger/client.py +37 -9
- managed_deepagents/_channels/trigger/types.py +5 -2
- {managed_deepagents-0.6.2.dev5.dist-info → managed_deepagents-0.6.2.dev6.dist-info}/METADATA +1 -1
- {managed_deepagents-0.6.2.dev5.dist-info → managed_deepagents-0.6.2.dev6.dist-info}/RECORD +10 -10
- {managed_deepagents-0.6.2.dev5.dist-info → managed_deepagents-0.6.2.dev6.dist-info}/WHEEL +0 -0
- {managed_deepagents-0.6.2.dev5.dist-info → managed_deepagents-0.6.2.dev6.dist-info}/entry_points.txt +0 -0
- {managed_deepagents-0.6.2.dev5.dist-info → managed_deepagents-0.6.2.dev6.dist-info}/licenses/LICENSE +0 -0
- {managed_deepagents-0.6.2.dev5.dist-info → managed_deepagents-0.6.2.dev6.dist-info}/top_level.txt +0 -0
|
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
|
-
|
|
138
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
{managed_deepagents-0.6.2.dev5.dist-info → managed_deepagents-0.6.2.dev6.dist-info}/METADATA
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: managed-deepagents
|
|
3
|
-
Version: 0.6.2.
|
|
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
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
68
|
-
managed_deepagents-0.6.2.
|
|
69
|
-
managed_deepagents-0.6.2.
|
|
70
|
-
managed_deepagents-0.6.2.
|
|
71
|
-
managed_deepagents-0.6.2.
|
|
72
|
-
managed_deepagents-0.6.2.
|
|
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,,
|
|
File without changes
|
{managed_deepagents-0.6.2.dev5.dist-info → managed_deepagents-0.6.2.dev6.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{managed_deepagents-0.6.2.dev5.dist-info → managed_deepagents-0.6.2.dev6.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|
{managed_deepagents-0.6.2.dev5.dist-info → managed_deepagents-0.6.2.dev6.dist-info}/top_level.txt
RENAMED
|
File without changes
|