0Pricing
AI Agents · Ders

Döngüde İnsan Onay Kapıları

Yüksek riskli aracı eylemleri için duraklatma-talep etme-onaylama örüntüleri.

Döngüde İnsan Onay Kapıları, CoddyKit'te ücretsiz bir AI Agents dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Agents öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Agents kursu toplamda 4 dersten oluşur.

Ajanların İnsan Onayına İhtiyaç Duyduğu Durumlar

Yüksek riskli eylemler için — sözleşme gönderme, üretim verilerini silme, bütçe harcama veya herkese açık duyuru gönderme gibi — bir ajan özerk hareket etmemelidir. İlerlemeye geçmeden önce duraklayıp insan onayı istemelidir.

Bu, İnsan Döngüde (HITL) örüntüsüdür.

Yüksek Riskli Eylemleri Tanımlama

Hangi eylemlerin insan onayı gerektirdiğini belirleyen bir sınıflandırma işlevi tanımlayın. Eşik, risk toleransına göre her devreye alma işlemi için ayarlanabilir.

HIGH_STAKES_ACTIONS = {
    'send_email',
    'delete_records',
    'publish_content',
    'transfer_funds',
    'modify_production_config',
    'export_all_data',
    'send_push_notification_to_all'
}

HIGH_STAKES_THRESHOLDS = {
    'transfer_funds':    1000,    # USD — require approval above this
    'delete_records':    10,      # rows
    'send_email':        50,      # recipients
    'push_notification': 1000     # users
}

def requires_approval(action: str, parameters: dict) -> bool:
    if action not in HIGH_STAKES_ACTIONS:
        return False
    threshold = HIGH_STAKES_THRESHOLDS.get(action)
    if threshold is None:
        return True   # all instances require approval
    # Check parameter against threshold
    amount = parameters.get('amount') or parameters.get('count') or 0
    return float(amount) >= threshold

if __name__ == '__main__':
    print('Small transfer:', requires_approval('transfer_funds', {'amount': 200}))
    print('Large transfer:', requires_approval('transfer_funds', {'amount': 5000}))
    print('Publish content:', requires_approval('publish_content', {}))

Onay İsteği Oluşturma

Onay gerektiğinde ajan bir onay isteği kaydı oluşturur ve yürütmeyi askıya alır. İstek, gerçekleşecek işlemin açıklamasını, parametreleri ve bir son tarihi içerir.

import uuid, time

approval_requests: dict[str, dict] = {}   # approval_id -> request

def create_approval_request(agent_id: str, user_id: str, action: str,
                             parameters: dict, timeout_minutes: int = 30) -> str:
    approval_id = str(uuid.uuid4())
    approval_requests[approval_id] = {
        'approval_id':  approval_id,
        'agent_id':     agent_id,
        'user_id':      user_id,
        'action':       action,
        'parameters':   parameters,
        'status':       'pending',     # pending / approved / rejected / timed_out
        'created_at':   time.time(),
        'expires_at':   time.time() + timeout_minutes * 60,
        'decided_by':   None,
        'decided_at':   None
    }
    return approval_id

if __name__ == '__main__':
    approval_id = create_approval_request(
        'agent-1', 'user-42', 'delete_records', {'count': 50}
    )
    print('Created approval request:', approval_id)
    print('Status:', approval_requests[approval_id]['status'])

Slack Üzerinden Bildirim Gönderme

Onay isteğini Slack üzerinden onaylayana gönderin. Ajanın ne yapmak istediğine ilişkin bir özeti, onaylama veya reddetme bağlantısını ve zaman aşımı süresinin bitiş tarihini ekleyin.

import requests

SLACK_WEBHOOK = 'https://hooks.slack.com/services/YOUR/WEBHOOK/URL'
APPROVAL_BASE_URL = 'https://your-agent-dashboard.com/approvals'

def notify_approver_slack(approval_id: str, approver_slack_id: str):
    req = approval_requests[approval_id]
    import time as t
    from datetime import datetime
    expires = datetime.fromtimestamp(req['expires_at']).strftime('%H:%M UTC')

    payload = {
        'text': f'<@{approver_slack_id}> Agent approval required',
        'attachments': [{
            'color': '#ff9900',
            'fields': [
                {'title': 'Action',      'value': req['action'],    'short': True},
                {'title': 'Requested by','value': req['user_id'],   'short': True},
                {'title': 'Parameters',  'value': str(req['parameters'])[:200]},
                {'title': 'Expires',     'value': expires,          'short': True}
            ],
            'actions': [
                {'type': 'button', 'text': 'Approve',
                 'url': f'{APPROVAL_BASE_URL}/{approval_id}/approve'},
                {'type': 'button', 'text': 'Reject',
                 'url': f'{APPROVAL_BASE_URL}/{approval_id}/reject'}
            ]
        }]
    }
    requests.post(SLACK_WEBHOOK, json=payload)

E-posta ile Bildirim Gönderme

Yedek kanal olarak veya Slack kullanmayan kuruluşlar için birincil kanal şeklinde, onaylama ve reddetme bağlantıları açıkça belirtilmiş onay isteklerini e-posta ile gönderin.

import smtplib
from email.mime.text import MIMEText

SMTP_HOST  = 'smtp.yourcompany.com'
SMTP_PORT  = 587
SMTP_USER  = 'agent-noreply@yourcompany.com'
SMTP_PASS  = 'YOUR_SMTP_PASSWORD'

def notify_approver_email(approval_id: str, approver_email: str):
    req = approval_requests[approval_id]
    body = (
        f'An AI agent is requesting approval for:\n\n'
        f'Action: {req["action"]}\n'
        f'Parameters: {req["parameters"]}\n\n'
        f'Approve: {APPROVAL_BASE_URL}/{approval_id}/approve\n'
        f'Reject:  {APPROVAL_BASE_URL}/{approval_id}/reject\n\n'
        f'This request expires in 30 minutes.'
    )
    msg = MIMEText(body)
    msg['Subject'] = f'Agent Approval Required: {req["action"]}'
    msg['From']    = SMTP_USER
    msg['To']      = approver_email

    with smtplib.SMTP(SMTP_HOST, SMTP_PORT) as server:
        server.starttls()
        server.login(SMTP_USER, SMTP_PASS)
        server.send_message(msg)

Onay Kararını Yoklayarak Bekleme

Bildirim gönderildikten sonra ajan kararı bekler. Kısa bir bekleme aralığı içeren bir yoklama döngüsü kullanın. Durum 'beklemede' durumundan değiştiğinde veya son tarih geçtiğinde yoklamayı durdurun.

import time

def wait_for_approval(approval_id: str, poll_interval: float = 5.0) -> dict:
    while True:
        req = approval_requests.get(approval_id)
        if not req:
            return {'decision': 'error', 'reason': 'Approval request not found'}

        if req['status'] == 'approved':
            return {'decision': 'approved', 'decided_by': req['decided_by']}

        if req['status'] == 'rejected':
            return {'decision': 'rejected', 'decided_by': req['decided_by']}

        if time.time() > req['expires_at']:
            req['status'] = 'timed_out'
            return {'decision': 'timed_out', 'reason': 'No decision within deadline'}

        time.sleep(poll_interval)

Onay Kararını Kaydetme

Onaylayan kişi Onayla veya Reddet düğmesine tıkladığında kararı kimin verdiğini ve ne zaman verdiğini kaydedin. Böylece eksiksiz bir onay denetim izi oluşturulur: istendi → bildirildi → karar verildi → yürütüldü (veya iptal edildi).

def record_decision(approval_id: str, decision: str,
                    decided_by: str) -> dict:
    req = approval_requests.get(approval_id)
    if not req:
        return {'error': 'Approval request not found'}

    if req['status'] != 'pending':
        return {'error': f'Request already in state: {req["status"]}'}

    if time.time() > req['expires_at']:
        req['status'] = 'timed_out'
        return {'error': 'Request has expired'}

    req['status']     = decision   # 'approved' or 'rejected'
    req['decided_by'] = decided_by
    req['decided_at'] = time.time()
    return {'ok': True, 'decision': decision}

Zaman Aşımını Yönetme: Otomatik İptal

Zaman aşımı süresi içinde hiçbir karar gelmezse ajan eylemi otomatik olarak iptal eder ve ilk istekte bulunan kişiye bildirim gönderir. Bu, yanıt vermeyen onaylayanlar nedeniyle eylemlerin kalıcı olarak engellenmesini önler.

def handle_timeout(approval_id: str, agent_session: dict) -> str:
    req = approval_requests.get(approval_id, {})
    action  = req.get('action', 'unknown')
    user_id = req.get('user_id', 'unknown')

    # Log the timeout
    import logging
    logging.warning(
        'Approval timeout: action=%s user=%s approval_id=%s',
        action, user_id, approval_id
    )

    # Tell the user
    timeout_message = (
        f'The "{action}" action was automatically cancelled because '
        f'no approver responded within the 30-minute window. '
        f'Please request again or contact your administrator.'
    )
    return timeout_message

Tam Onay Geçidi İş Akışı

Tüm adımları birleştirin: onayın gerekip gerekmediğini kontrol edin, isteği oluşturun, bildirim gönderin, bekleyin ve ardından karara göre devam edin veya iptal edin.

def execute_with_approval_gate(agent_id: str, user_id: str, action: str,
                                parameters: dict, approver_email: str,
                                execute_fn) -> dict:
    # Step 1: Check if approval needed
    if not requires_approval(action, parameters):
        result = execute_fn(action, parameters)
        return {'approved': True, 'auto': True, 'result': result}

    # Step 2: Create approval request
    approval_id = create_approval_request(agent_id, user_id, action, parameters)

    # Step 3: Notify approver
    notify_approver_email(approval_id, approver_email)
    print(f'Approval requested: {approval_id}. Waiting...')

    # Step 4: Wait for decision
    decision = wait_for_approval(approval_id)

    # Step 5: Act on decision
    if decision['decision'] == 'approved':
        result = execute_fn(action, parameters)
        return {'approved': True, 'decided_by': decision['decided_by'], 'result': result}
    elif decision['decision'] == 'rejected':
        return {'approved': False, 'reason': 'Rejected by approver'}
    else:
        msg = handle_timeout(approval_id, {})
        return {'approved': False, 'reason': msg}

Onay Denetim İzi

Her onay yaşam döngüsü olayı denetim günlüğüne kaydedilmelidir: istek oluşturuldu, bildirim gönderildi, karar verildi, eylem yürütüldü veya iptal edildi. Bu iz, SOC 2 uyumluluğu için gereklidir.

import logging, json, time

approval_logger = logging.getLogger('agent.approvals')

def audit_approval_event(event: str, approval_id: str, details: dict):
    entry = {
        'timestamp':   time.time(),
        'event':       event,
        'approval_id': approval_id,
        **details
    }
    approval_logger.info(json.dumps(entry))

# Usage flow:
# audit_approval_event('request_created', approval_id, {'action': 'delete_records', 'user': 'u123'})
# audit_approval_event('notification_sent', approval_id, {'channel': 'email', 'approver': 'admin@co.com'})
# audit_approval_event('decision_received', approval_id, {'decision': 'approved', 'by': 'admin@co.com'})
# audit_approval_event('action_executed',  approval_id, {'result': 'success'})

if __name__ == '__main__':
    import sys
    approval_logger.setLevel(logging.INFO)
    approval_logger.addHandler(logging.StreamHandler(sys.stdout))
    audit_approval_event('request_created', 'appr-1', {'action': 'delete_records', 'user': 'u123'})

Birincil Onaylayan Kullanılamadığında Üst Makama Aktarma

Birincil onaylayan kişi zaman aşımı süresinin yarısı içinde yanıt vermezse isteği ikincil onaylayana aktarın. Bu, tüm onayların tek bir kişinin iş yerinde bulunmaması nedeniyle engellenmesini önler.

def escalate_if_needed(approval_id: str, secondary_email: str,
                        escalation_at_pct: float = 0.5):
    req = approval_requests.get(approval_id)
    if not req or req['status'] != 'pending':
        return

    total_window  = req['expires_at'] - req['created_at']
    elapsed       = time.time() - req['created_at']
    escalation_at = req['created_at'] + total_window * escalation_at_pct

    if time.time() >= escalation_at and not req.get('escalated'):
        req['escalated'] = True
        notify_approver_email(approval_id, secondary_email)
        print(f'Escalated approval {approval_id} to {secondary_email}')

Zaman Aşımı Süresi Dolduğunda Bekleyen Onay İsteğine Ne Olur?

Zaman aşımını yönetme davranışı, HITL tasarımının kritik bir parçasıdır. Yanlış varsayılan seçiminin güvenlik ve kullanılabilirlik açısından farklı sonuçları olur.

İnsan Döngüde Onay Geçitleri Özeti

HITL onay geçitleri şu şekilde çalışır: yüksek riskli eylemleri sınıflandırma, askıya alınmış bir onay isteği oluşturma, onaylayanlara Slack/e-posta üzerinden bildirim gönderme, kararlar için yoklama yapma, zaman aşımında otomatik iptal ve denetim izinde her yaşam döngüsü olayını kaydetme.

İkincil onlayanlara aktarma, kullanılamama nedeniyle oluşan onay kilitlenmelerini önler.

Sıkça Sorulan Sorular

“Döngüde İnsan Onay Kapıları” dersi ücretsiz mi?

Evet — “Döngüde İnsan Onay Kapıları” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Agents kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Agents kursu toplamda 4 dersten oluşur.

“Döngüde İnsan Onay Kapıları” dersinde ne öğreneceğim?

Yüksek riskli aracı eylemleri için duraklatma-talep etme-onaylama örüntüleri. AI Agents ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

AI Agents öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te AI Agents, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Döngüde İnsan Onay Kapıları” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu AI Agents dersinde kod yazıp çalıştırabilir miyim?

Evet. Her AI Agents dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Aracılar İçin Değiştirilemez Eylem Günlüğü
  2. Aracı Eylemleri İçin İlke Uygulama
  3. Düzenleyici Uyumluluk: GDPR ve SOC2
  4. Döngüde İnsan Onay Kapıları
← AI Agents Sayfasına Dön