एजेंट को वेबहुक से जोड़ना
वेबहुक इवेंट प्राप्त करना और उनके उत्तर में एजेंट कार्यप्रवाह शुरू करना।
एजेंट को वेबहुक से जोड़ना, CoddyKit पर AI एजेंट का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह AI एजेंट सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। AI एजेंट पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
वेबहुक क्या है?
वेबहुक एक HTTP कॉलबैक है। किसी बाहरी सेवा में घटना होने पर वह घटना के डेटा के साथ आपके एंडपॉइंट पर POST अनुरोध भेजती है। आपका एजेंट पेलोड को संसाधित करके कार्रवाई करता है।
वेबहुक पुश-आधारित होते हैं (घटनाएँ होते ही प्राप्त हो जाती हैं), जबकि पोलिंग में आप बार-बार जाँच करते हैं।
FastAPI वेबहुक एंडपॉइंट
FastAPI वेबहुक रिसीवर बनाना आसान बनाता है। POST रूट परिभाषित करें, JSON body को पार्स करें और उसे अपने एजेंट के तर्क को सौंप दें।
from fastapi import FastAPI, Request
from pydantic import BaseModel
app = FastAPI()
class WebhookPayload(BaseModel):
event: str
data: dict
@app.post('/webhook')
async def receive_webhook(payload: WebhookPayload):
print(f'Received event: {payload.event}')
print(f'Data: {payload.data}')
# Route to the right agent handler
if payload.event == 'email.received':
await handle_email_event(payload.data)
elif payload.event == 'file.uploaded':
await handle_file_event(payload.data)
return {'status': 'accepted'}
async def handle_email_event(data: dict):
print(f'Processing email from: {data.get("from")}')
async def handle_file_event(data: dict):
print(f'Processing file: {data.get("filename")}')वेबहुक हस्ताक्षर सत्यापन
हमेशा सत्यापित करें कि वेबहुक अनुरोध अपेक्षित प्रेषक से ही आए हैं। अधिकांश सेवाएँ साझा गुप्त कुंजी का उपयोग करके अपने पेलोड पर HMAC-SHA256 हस्ताक्षर करती हैं। अमान्य हस्ताक्षर वाले अनुरोधों को अस्वीकार करें।
import hmac
import hashlib
from fastapi import FastAPI, Request, HTTPException
app = FastAPI()
WEBHOOK_SECRET = 'your-webhook-secret-here'
def verify_signature(payload_bytes: bytes, signature_header: str) -> bool:
expected = hmac.new(
WEBHOOK_SECRET.encode(),
payload_bytes,
hashlib.sha256
).hexdigest()
received = signature_header.replace('sha256=', '')
return hmac.compare_digest(expected, received)
@app.post('/webhook/verified')
async def verified_webhook(request: Request):
payload_bytes = await request.body()
signature = request.headers.get('X-Signature', '')
if not verify_signature(payload_bytes, signature):
raise HTTPException(status_code=401, detail='Invalid signature')
# Safe to process
import json
data = json.loads(payload_bytes)
return {'status': 'verified', 'event': data.get('event')}इडेम्पोटेंसी कुंजियाँ
बाहरी सेवाएँ अक्सर विफल वेबहुक डिलीवरी को दोबारा भेजती हैं। इडेम्पोटेंसी कुंजी प्रत्येक घटना के साथ भेजी जाने वाली एक विशिष्ट ID होती है। संसाधित की गई कुंजियों को संग्रहीत करें और दोहराई गई घटनाओं को छोड़ दें।
from fastapi import FastAPI, Request, HTTPException
import redis
import json
app = FastAPI()
r = redis.Redis(host='localhost', port=6379, decode_responses=True)
@app.post('/webhook/idempotent')
async def idempotent_webhook(request: Request):
payload = await request.json()
# Extract idempotency key from header or payload
idempotency_key = request.headers.get('Idempotency-Key') or payload.get('event_id')
if not idempotency_key:
raise HTTPException(status_code=400, detail='Missing idempotency key')
redis_key = f'webhook:processed:{idempotency_key}'
# Check if already processed
if r.exists(redis_key):
print(f'Duplicate event {idempotency_key}, skipping')
return {'status': 'duplicate', 'idempotency_key': idempotency_key}
# Process event
# ... agent logic here ...
# Mark as processed (expire after 24h)
r.setex(redis_key, 86400, '1')
return {'status': 'processed', 'idempotency_key': idempotency_key}दोबारा प्रयासों के डिडुप्लिकेशन की रणनीति
इडेम्पोटेंसी कुंजियों के अलावा, डिडुप्लिकेशन विंडो पर भी विचार करें। यदि आपको कम समय-अंतराल में एक ही घटना की सामग्री मिलती है, तो वह संभवतः दोबारा किया गया प्रयास है। दोबारा किए गए प्रयासों को पहचानने और हटाने के लिए घटना हैश की तुलना करें।
import hashlib
import json
from datetime import datetime
# In-memory store; use Redis in production
recent_hashes = {}
DEDUP_WINDOW_SECONDS = 300 # 5 minutes
def is_duplicate(payload: dict) -> bool:
# Hash the event content
content = json.dumps(payload, sort_keys=True)
event_hash = hashlib.md5(content.encode()).hexdigest()
now = datetime.utcnow().timestamp()
# Clean up old entries
expired = [h for h, ts in recent_hashes.items() if now - ts > DEDUP_WINDOW_SECONDS]
for h in expired:
del recent_hashes[h]
if event_hash in recent_hashes:
return True
recent_hashes[event_hash] = now
return False
# Test
payload = {'event': 'payment.completed', 'amount': 100}
print('First:', is_duplicate(payload)) # False
print('Second:', is_duplicate(payload)) # True (duplicate)एजेंट को असिंक्रोनस रूप से चलाना
वेबहुक हैंडलर को तुरंत (5 सेकंड से कम समय में) प्रतिक्रिया देनी चाहिए और एजेंट के तर्क को पृष्ठभूमि में संसाधित करना चाहिए। समय-सीमा समाप्त होने से बचने के लिए FastAPI में BackgroundTasks का उपयोग करें।
from fastapi import FastAPI, BackgroundTasks
import asyncio
app = FastAPI()
async def run_agent_job(event: str, data: dict):
print(f'Agent starting for event: {event}')
await asyncio.sleep(2) # Simulate LLM call
print(f'Agent finished for event: {event}')
@app.post('/webhook/async')
async def async_webhook(request_data: dict, background_tasks: BackgroundTasks):
event = request_data.get('event', 'unknown')
data = request_data.get('data', {})
# Respond immediately
background_tasks.add_task(run_agent_job, event, data)
return {'status': 'accepted', 'message': 'Processing in background'}जटिल पेलोड को पार्स करना
अलग-अलग सेवाएँ पेलोड के अलग-अलग प्रारूप भेजती हैं। प्रत्येक सेवा के लिए समर्पित पार्सर फ़ंक्शन लिखें, ताकि आपके एजेंट को हमेशा एक मानकीकृत घटना ऑब्जेक्ट प्राप्त हो।
from dataclasses import dataclass
from typing import Optional
@dataclass
class NormalizedEvent:
event_type: str
source: str
resource_id: str
metadata: dict
def parse_github_webhook(payload: dict) -> NormalizedEvent:
return NormalizedEvent(
event_type='github.' + payload.get('action', 'unknown'),
source='github',
resource_id=str(payload.get('repository', {}).get('id', '')),
metadata={
'repo': payload.get('repository', {}).get('full_name'),
'sender': payload.get('sender', {}).get('login')
}
)
def parse_stripe_webhook(payload: dict) -> NormalizedEvent:
return NormalizedEvent(
event_type=payload.get('type', 'unknown'),
source='stripe',
resource_id=payload.get('id', ''),
metadata={'amount': payload.get('data', {}).get('object', {}).get('amount')}
)
# Usage
github_payload = {'action': 'opened', 'repository': {'id': 123, 'full_name': 'user/repo'}, 'sender': {'login': 'alice'}}
event = parse_github_webhook(github_payload)
print(event)वेबहुक प्रतिक्रिया कोड महत्वपूर्ण हैं
सही HTTP स्थिति लौटाएँ। 2xx प्रेषक को बताता है कि वेबहुक स्वीकार कर लिया गया है। 4xx का अर्थ क्लाइंट की त्रुटि है (खराब पेलोड)। 5xx या समय-सीमा समाप्त होने पर प्रेषक दोबारा प्रयास करता है।
- 200: स्वीकार किया गया और संसाधित किया गया
- 202: असिंक्रोनस संसाधन के लिए स्वीकार किया गया
- 400: गलत अनुरोध (कुछ फ़ील्ड अनुपस्थित हैं)
- 401: गलत हस्ताक्षर
from fastapi import FastAPI, Request, HTTPException
from fastapi.responses import JSONResponse
app = FastAPI()
@app.post('/webhook/proper-responses')
async def proper_webhook(request: Request):
try:
payload = await request.json()
except Exception:
raise HTTPException(status_code=400, detail='Invalid JSON body')
required_fields = ['event', 'data']
for field in required_fields:
if field not in payload:
raise HTTPException(status_code=400, detail=f'Missing field: {field}')
event = payload['event']
known_events = ['email.received', 'file.uploaded', 'payment.completed']
if event not in known_events:
# Acknowledge unknown events gracefully - do not retry
return JSONResponse(status_code=200, content={'status': 'ignored', 'reason': 'unknown event'})
# Start background processing
return JSONResponse(status_code=202, content={'status': 'accepted'})स्थानीय रूप से वेबहुक का परीक्षण
परीक्षण के लिए अपने स्थानीय सर्वर को इंटरनेट पर उपलब्ध कराने हेतु ngrok का उपयोग करें। अपने स्थानीय FastAPI ऐप तक टनल करने वाला सार्वजनिक URL पाने के लिए ngrok http 8000 चलाएँ।
# Start your FastAPI app
# uvicorn main:app --reload --port 8000
# In another terminal, start ngrok:
# ngrok http 8000
# You get: https://abc123.ngrok.io
# Now configure your webhook in Stripe/GitHub/etc. to:
# https://abc123.ngrok.io/webhook
# Test with curl:
import subprocess
def test_webhook_locally():
test_payload = '{"event": "email.received", "data": {"from": "test@example.com"}}'
# In real usage you would run this in terminal:
# curl -X POST http://localhost:8000/webhook \
# -H 'Content-Type: application/json' \
# -d '{"event": "email.received", "data": {"from": "test@example.com"}}'
print('Test payload:', test_payload)
print('Send to: http://localhost:8000/webhook')
test_webhook_locally()वेबहुक घटनाओं का लॉग दर्ज करना
हर आने वाले वेबहुक के साथ timestamp, स्रोत, घटना प्रकार और संसाधन परिणाम का लॉग दर्ज करें। छूटी हुई घटनाओं या दोहरे संसाधन से जुड़ी समस्याओं को डीबग करने के लिए यह ऑडिट रिकॉर्ड आवश्यक है।
import logging
import json
from datetime import datetime
import sys
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s %(levelname)s %(message)s',
stream=sys.stdout
)
logger = logging.getLogger('webhook')
def log_webhook_event(event_id: str, event_type: str, source: str, status: str, details: dict = None):
logger.info(json.dumps({
'timestamp': datetime.utcnow().isoformat(),
'event_id': event_id,
'event_type': event_type,
'source': source,
'status': status,
'details': details or {}
}))
# Usage in webhook handler
log_webhook_event(
event_id='evt_123',
event_type='email.received',
source='gmail',
status='processed',
details={'from': 'user@example.com', 'action_taken': 'reply_sent'}
)आने वाले वेबहुक पर दर-सीमा लगाना
दर-सीमा लगाकर अपने वेबहुक एंडपॉइंट को अत्यधिक अनुरोधों से प्रभावित होने से बचाएँ। slowapi लाइब्रेरी बहुत कम कोड के साथ FastAPI में दर-सीमा जोड़ती है।
from fastapi import FastAPI, Request
from slowapi import Limiter, _rate_limit_exceeded_handler
from slowapi.util import get_remote_address
from slowapi.errors import RateLimitExceeded
limiter = Limiter(key_func=get_remote_address)
app = FastAPI()
app.state.limiter = limiter
app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler)
@app.post('/webhook/limited')
@limiter.limit('100/minute')
async def rate_limited_webhook(request: Request):
payload = await request.json()
return {'status': 'accepted', 'event': payload.get('event')}ज्ञान जाँच: वेबहुक
एजेंट के लिए वेबहुक की सर्वोत्तम प्रथाओं की अपनी समझ का परीक्षण करें।
उत्पादन में वेबहुक
उत्पादन में सभी पैटर्न को मिलाएँ: हस्ताक्षर सत्यापन, इडेम्पोटेंसी कुंजियाँ, पृष्ठभूमि में संसाधन, संरचित लॉग दर्ज करना और दर-सीमा। TLS समाप्ति और अतिरिक्त सुरक्षा के लिए nginx जैसे रिवर्स प्रॉक्सी के पीछे परिनियोजित करें।
एआई शिक्षक के साथ AI एजेंट सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 60
- पाठ
- 239
अक्सर पूछे जाने वाले प्रश्न
क्या “एजेंट को वेबहुक से जोड़ना” पाठ निःशुल्क है?
हाँ—“एजेंट को वेबहुक से जोड़ना” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और AI एजेंट पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। AI एजेंट पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“एजेंट को वेबहुक से जोड़ना” में मैं क्या सीखूँगा?
वेबहुक इवेंट प्राप्त करना और उनके उत्तर में एजेंट कार्यप्रवाह शुरू करना। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ AI एजेंट का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या AI एजेंट शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर AI एजेंट शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।
“एजेंट को वेबहुक से जोड़ना” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस AI एजेंट पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर AI एजेंट पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- ट्रिगर-कार्रवाई एजेंट पैटर्न
- एजेंट को वेबहुक से जोड़ना
- शेड्यूलिंग और Cron-आधारित एजेंट
- बहु-ऐप स्वचालन पाइपलाइन बनाना