langchain-trigger-server 0.2.1__tar.gz → 0.2.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of langchain-trigger-server might be problematic. Click here for more details.
- {langchain_trigger_server-0.2.1 → langchain_trigger_server-0.2.3}/PKG-INFO +1 -1
- {langchain_trigger_server-0.2.1 → langchain_trigger_server-0.2.3}/langchain_triggers/app.py +4 -14
- {langchain_trigger_server-0.2.1 → langchain_trigger_server-0.2.3}/langchain_triggers/core.py +1 -8
- {langchain_trigger_server-0.2.1 → langchain_trigger_server-0.2.3}/langchain_triggers/cron_manager.py +9 -4
- {langchain_trigger_server-0.2.1 → langchain_trigger_server-0.2.3}/langchain_triggers/database/interface.py +1 -2
- {langchain_trigger_server-0.2.1 → langchain_trigger_server-0.2.3}/langchain_triggers/database/supabase.py +4 -6
- {langchain_trigger_server-0.2.1 → langchain_trigger_server-0.2.3}/pyproject.toml +1 -1
- {langchain_trigger_server-0.2.1 → langchain_trigger_server-0.2.3}/uv.lock +828 -826
- {langchain_trigger_server-0.2.1 → langchain_trigger_server-0.2.3}/.github/workflows/release.yml +0 -0
- {langchain_trigger_server-0.2.1 → langchain_trigger_server-0.2.3}/.vscode/settings.json +0 -0
- {langchain_trigger_server-0.2.1 → langchain_trigger_server-0.2.3}/README.md +0 -0
- {langchain_trigger_server-0.2.1 → langchain_trigger_server-0.2.3}/langchain_triggers/__init__.py +0 -0
- {langchain_trigger_server-0.2.1 → langchain_trigger_server-0.2.3}/langchain_triggers/database/__init__.py +0 -0
- {langchain_trigger_server-0.2.1 → langchain_trigger_server-0.2.3}/langchain_triggers/decorators.py +0 -0
- {langchain_trigger_server-0.2.1 → langchain_trigger_server-0.2.3}/langchain_triggers/triggers/__init__.py +0 -0
- {langchain_trigger_server-0.2.1 → langchain_trigger_server-0.2.3}/langchain_triggers/triggers/cron_trigger.py +0 -0
- {langchain_trigger_server-0.2.1 → langchain_trigger_server-0.2.3}/test_framework.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: langchain-trigger-server
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.3
|
|
4
4
|
Summary: Generic event-driven triggers framework
|
|
5
5
|
Project-URL: Homepage, https://github.com/langchain-ai/open-agent-platform
|
|
6
6
|
Project-URL: Repository, https://github.com/langchain-ai/open-agent-platform
|
|
@@ -181,7 +181,6 @@ class TriggerServer:
|
|
|
181
181
|
name=trigger.name,
|
|
182
182
|
description=trigger.description,
|
|
183
183
|
registration_schema=trigger.registration_model.model_json_schema(),
|
|
184
|
-
require_display_name=getattr(trigger.registration_model, 'require_display_name', False)
|
|
185
184
|
)
|
|
186
185
|
logger.info(f"✓ Successfully created trigger template: {trigger.name} ({trigger.id})")
|
|
187
186
|
else:
|
|
@@ -217,7 +216,6 @@ class TriggerServer:
|
|
|
217
216
|
"path": "/api/triggers/registrations",
|
|
218
217
|
"method": "POST",
|
|
219
218
|
"payloadSchema": template.get("registration_schema", {}),
|
|
220
|
-
"requireDisplayName": template.get("require_display_name", False),
|
|
221
219
|
})
|
|
222
220
|
|
|
223
221
|
return {
|
|
@@ -263,7 +261,7 @@ class TriggerServer:
|
|
|
263
261
|
try:
|
|
264
262
|
payload = await request.json()
|
|
265
263
|
logger.info(f"Registration payload received: {payload}")
|
|
266
|
-
|
|
264
|
+
|
|
267
265
|
user_id = current_user["identity"]
|
|
268
266
|
trigger_id = payload.get("type")
|
|
269
267
|
if not trigger_id:
|
|
@@ -272,7 +270,7 @@ class TriggerServer:
|
|
|
272
270
|
trigger = next((t for t in self.triggers if t.id == trigger_id), None)
|
|
273
271
|
if not trigger:
|
|
274
272
|
raise HTTPException(status_code=400, detail=f"Unknown trigger type: {trigger_id}")
|
|
275
|
-
|
|
273
|
+
|
|
276
274
|
# Parse payload into registration model first
|
|
277
275
|
try:
|
|
278
276
|
registration_instance = trigger.registration_model(**payload)
|
|
@@ -289,15 +287,12 @@ class TriggerServer:
|
|
|
289
287
|
template_id=trigger.id,
|
|
290
288
|
resource_data=resource_dict
|
|
291
289
|
)
|
|
292
|
-
|
|
290
|
+
|
|
293
291
|
if existing_registration:
|
|
294
292
|
raise HTTPException(
|
|
295
293
|
status_code=400,
|
|
296
294
|
detail=f"You already have a registration with this configuration for trigger type '{trigger.id}'. Registration ID: {existing_registration.get('id')}"
|
|
297
295
|
)
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
# Call the trigger's registration handler with parsed registration model
|
|
301
296
|
result = await trigger.registration_handler(user_id, self.langchain_auth_client, registration_instance)
|
|
302
297
|
|
|
303
298
|
# Check if handler requested to skip registration (e.g., for OAuth or URL verification)
|
|
@@ -311,12 +306,7 @@ class TriggerServer:
|
|
|
311
306
|
media_type="application/json"
|
|
312
307
|
)
|
|
313
308
|
|
|
314
|
-
resource_dict = registration_instance.model_dump(
|
|
315
|
-
|
|
316
|
-
# Remove display_name if it's null/None and not required
|
|
317
|
-
if (not getattr(trigger.registration_model, 'require_display_name', False) and
|
|
318
|
-
resource_dict.get('display_name') is None):
|
|
319
|
-
resource_dict.pop('display_name', None)
|
|
309
|
+
resource_dict = registration_instance.model_dump()
|
|
320
310
|
|
|
321
311
|
registration = await self.database.create_trigger_registration(
|
|
322
312
|
user_id=user_id,
|
{langchain_trigger_server-0.2.1 → langchain_trigger_server-0.2.3}/langchain_triggers/core.py
RENAMED
|
@@ -75,11 +75,4 @@ class TriggerRegistrationResult(BaseModel):
|
|
|
75
75
|
|
|
76
76
|
class TriggerRegistrationModel(BaseModel):
|
|
77
77
|
"""Base class for trigger resource models that define how webhooks are matched to registrations."""
|
|
78
|
-
|
|
79
|
-
require_display_name: bool = False # Class attribute to indicate if display_name is required
|
|
80
|
-
display_name: Optional[str] = Field(default=None, description="Optional display name for this registration")
|
|
81
|
-
|
|
82
|
-
def model_post_init(self, __context) -> None:
|
|
83
|
-
"""Validate that display_name is provided when require_display_name is True."""
|
|
84
|
-
if self.require_display_name and not self.display_name:
|
|
85
|
-
raise ValueError(f"{self.__class__.__name__} requires display_name to be set")
|
|
78
|
+
pass
|
{langchain_trigger_server-0.2.1 → langchain_trigger_server-0.2.3}/langchain_triggers/cron_manager.py
RENAMED
|
@@ -170,7 +170,10 @@ class CronTriggerManager:
|
|
|
170
170
|
"""Execute a scheduled cron job with full monitoring and error handling."""
|
|
171
171
|
registration_id = registration["id"]
|
|
172
172
|
cron_pattern = registration["resource"]["crontab"]
|
|
173
|
-
|
|
173
|
+
|
|
174
|
+
# Log immediately when callback is invoked to verify APScheduler is calling us
|
|
175
|
+
logger.info(f"Cron callback invoked for job {registration_id}")
|
|
176
|
+
|
|
174
177
|
execution = CronJobExecution(
|
|
175
178
|
registration_id=registration_id,
|
|
176
179
|
cron_pattern=cron_pattern,
|
|
@@ -178,8 +181,8 @@ class CronTriggerManager:
|
|
|
178
181
|
actual_start_time=datetime.utcnow(),
|
|
179
182
|
status="running"
|
|
180
183
|
)
|
|
181
|
-
|
|
182
|
-
logger.info(f"
|
|
184
|
+
|
|
185
|
+
logger.info(f"Executing cron job {registration_id} with pattern '{cron_pattern}'")
|
|
183
186
|
|
|
184
187
|
try:
|
|
185
188
|
agents_invoked = await self._execute_cron_job(registration)
|
|
@@ -202,8 +205,10 @@ class CronTriggerManager:
|
|
|
202
205
|
user_id = registration["user_id"]
|
|
203
206
|
|
|
204
207
|
# Get agent links
|
|
208
|
+
logger.info(f"Querying database for agents linked to cron job {registration_id}")
|
|
205
209
|
agent_links = await self.trigger_server.database.get_agents_for_trigger(registration_id)
|
|
206
|
-
|
|
210
|
+
logger.info(f"Found {len(agent_links) if agent_links else 0} agent links for cron job {registration_id}")
|
|
211
|
+
|
|
207
212
|
if not agent_links:
|
|
208
213
|
logger.warning(f"No agents linked to cron job {registration_id}")
|
|
209
214
|
return 0
|
|
@@ -16,8 +16,7 @@ class TriggerDatabaseInterface(ABC):
|
|
|
16
16
|
provider: str,
|
|
17
17
|
name: str,
|
|
18
18
|
description: str = None,
|
|
19
|
-
registration_schema: Dict = None
|
|
20
|
-
require_display_name: bool = False
|
|
19
|
+
registration_schema: Dict = None
|
|
21
20
|
) -> Optional[Dict[str, Any]]:
|
|
22
21
|
"""Create a new trigger template."""
|
|
23
22
|
pass
|
|
@@ -75,8 +75,7 @@ class SupabaseTriggerDatabase(TriggerDatabaseInterface):
|
|
|
75
75
|
provider: str,
|
|
76
76
|
name: str,
|
|
77
77
|
description: str = None,
|
|
78
|
-
registration_schema: Dict = None
|
|
79
|
-
require_display_name: bool = False
|
|
78
|
+
registration_schema: Dict = None
|
|
80
79
|
) -> Optional[Dict[str, Any]]:
|
|
81
80
|
"""Create a new trigger template."""
|
|
82
81
|
try:
|
|
@@ -85,8 +84,7 @@ class SupabaseTriggerDatabase(TriggerDatabaseInterface):
|
|
|
85
84
|
"provider": provider,
|
|
86
85
|
"name": name,
|
|
87
86
|
"description": description,
|
|
88
|
-
"registration_schema": registration_schema or {}
|
|
89
|
-
"require_display_name": require_display_name
|
|
87
|
+
"registration_schema": registration_schema or {}
|
|
90
88
|
}
|
|
91
89
|
|
|
92
90
|
response = self.client.table("trigger_templates").insert(data).execute()
|
|
@@ -261,7 +259,7 @@ class SupabaseTriggerDatabase(TriggerDatabaseInterface):
|
|
|
261
259
|
# Build query to match against trigger_registrations with template_id filter
|
|
262
260
|
query = self.client.table("trigger_registrations").select(
|
|
263
261
|
"*, trigger_templates(id, name, description)"
|
|
264
|
-
).eq("
|
|
262
|
+
).eq("template_id", template_id)
|
|
265
263
|
|
|
266
264
|
# Add resource field matches
|
|
267
265
|
for field, value in resource_data.items():
|
|
@@ -288,7 +286,7 @@ class SupabaseTriggerDatabase(TriggerDatabaseInterface):
|
|
|
288
286
|
# Build query to match against trigger_registrations with template_id and user_id filter
|
|
289
287
|
query = self.client.table("trigger_registrations").select(
|
|
290
288
|
"*, trigger_templates(id, name, description)"
|
|
291
|
-
).eq("
|
|
289
|
+
).eq("template_id", template_id).eq("user_id", user_id)
|
|
292
290
|
|
|
293
291
|
# Add resource field matches
|
|
294
292
|
for field, value in resource_data.items():
|