AI-agenter · Lektion

Agentmønstre for trigger og handling

Hændelsesregistrering → beslutning → handling: den centrale automationssløjfe.

Lektion 1 af 413 trin

Agentmønstre for trigger og handling er en gratis AI-agenter-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i AI-agenter, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. AI-agenter-kurset indeholder 4 lektioner i alt.

Hvad er en udløser-handlingsagent?

En udløser-handlingsagent holder øje med hændelser og reagerer med handlinger. Den tredelte løkke er: registrér hændelse → LLM beslutter handling → udfør handling.

Eksempler: e-mail modtaget → opsummér og svar; fil uploadet → validér og behandl; kl. 9 hver dag → generér daglig rapport.

Udløsertyper

Udløsere falder i tre kategorier:

  • Hændelsesbaserede: en webhook udløses, når en e-mail ankommer, eller en fil uploades
  • Tidsbaserede: en cron-plan kører agenten med faste intervaller
  • Forespørgselsbaserede: agenten kontrollerer gentagne gange et API for nye data

Valget af den rigtige udløsertype bestemmer agentens latenstid og ressourceforbrug.

Detekteringsfasen

Detektering betyder at modtage eller genkende en hændelse. Ved webhooks modtager din server en POST-forespørgsel. Ved gentagne forespørgsler sender agenten en forespørgsel til et API og sammenligner resultaterne med den senest registrerede tilstand.

import json

def detect_new_email(current_emails, last_seen_id):
    new_emails = [
        e for e in current_emails
        if e['id'] > last_seen_id
    ]
    return new_emails

# Simulate detection
current = [{'id': 3, 'subject': 'Meeting'}, {'id': 4, 'subject': 'Invoice'}]
new = detect_new_email(current, last_seen_id=2)
print('New emails:', [e['subject'] for e in new])

Beslutningsfasen

Efter at have registreret en hændelse sender agenten kontekst til en LLM og spørger, hvilken handling der skal udføres. LLM'en vælger enten et værktøj eller returnerer et direkte svar.

import openai

client = openai.OpenAI(api_key='sk-...')

def decide_action(event_description):
    response = client.chat.completions.create(
        model='gpt-4o-mini',
        messages=[
            {'role': 'system', 'content': 'You are an automation agent. Decide what action to take for the event.'},
            {'role': 'user', 'content': f'Event: {event_description}'}
        ],
        tools=[
            {'type': 'function', 'function': {'name': 'send_reply', 'description': 'Reply to email', 'parameters': {'type': 'object', 'properties': {'message': {'type': 'string'}}, 'required': ['message']}}}
        ]
    )
    return response.choices[0].message

result = decide_action('New email: Invoice for $500 from supplier')
print(result)

Udførelsesfasen

Udførelsen kører den valgte handling. Det kan være at kalde et API, skrive en fil, sende en besked eller udløse en anden arbejdsgang. Håndter altid fejl, og registrér resultaterne i en log.

import logging
import sys

logging.basicConfig(level=logging.INFO, stream=sys.stdout)
logger = logging.getLogger('agent')

def execute_action(action_name, params):
    try:
        if action_name == 'send_reply':
            # In real code, call Gmail API here
            logger.info(f'Sending reply: {params["message"]}')
            return {'status': 'success'}
        elif action_name == 'create_task':
            logger.info(f'Creating task: {params["title"]}')
            return {'status': 'success'}
        else:
            raise ValueError(f'Unknown action: {action_name}')
    except Exception as e:
        logger.error(f'Action failed: {e}')
        return {'status': 'error', 'message': str(e)}

if __name__ == '__main__':
    result = execute_action('send_reply', {'message': 'Thanks for reaching out!'})
    print('Result:', result)

Tilstandsmaskinemodel

En tilstandsmaskine er en effektiv model for automatiseringsagenter. Tilstande kan være: IDLE, DETECTING, DECIDING, EXECUTING, ERROR. Overgange sker på baggrund af hændelser eller betingelser.

Tilstandsmaskiner gør agentens adfærd forudsigelig og gør den nemmere at fejlfinde.

from enum import Enum

class AgentState(Enum):
    IDLE = 'idle'
    DETECTING = 'detecting'
    DECIDING = 'deciding'
    EXECUTING = 'executing'
    ERROR = 'error'

class AutomationAgent:
    def __init__(self):
        self.state = AgentState.IDLE
    
    def transition(self, new_state):
        print(f'State: {self.state.value} -> {new_state.value}')
        self.state = new_state
    
    def run_cycle(self, event=None):
        self.transition(AgentState.DETECTING)
        if event:
            self.transition(AgentState.DECIDING)
            self.transition(AgentState.EXECUTING)
        self.transition(AgentState.IDLE)

agent = AutomationAgent()
agent.run_cycle(event={'type': 'email', 'subject': 'Test'})

Mønster for udløser ved modtaget e-mail

Gmails pushmeddelelser bruger Pub/Sub. Når en ny e-mail ankommer, publicerer Google en meddelelse til dit Pub/Sub-emne. Din agent modtager en webhook, henter e-mailen og behandler den.

from fastapi import FastAPI, Request
import base64, json

app = FastAPI()

@app.post('/gmail-push')
async def gmail_push(request: Request):
    body = await request.json()
    # Decode Pub/Sub message
    message = body.get('message', {})
    data = base64.b64decode(message.get('data', '')).decode('utf-8')
    notification = json.loads(data)
    
    email_address = notification.get('emailAddress')
    history_id = notification.get('historyId')
    
    print(f'New email for {email_address}, historyId: {history_id}')
    # Fetch email details and run agent here
    return {'status': 'ok'}

Mønster for udløser ved filupload

S3-hændelsesmeddelelser eller overvågning af det lokale filsystem kan udløse agenter, når filer dukker op. Biblioteket watchdog overvåger mapper for nye filer.

from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import time

class UploadHandler(FileSystemEventHandler):
    def on_created(self, event):
        if event.is_directory:
            return
        print(f'New file detected: {event.src_path}')
        self.process_file(event.src_path)
    
    def process_file(self, filepath):
        # Run agent logic on new file
        print(f'Processing: {filepath}')

observer = Observer()
handler = UploadHandler()
observer.schedule(handler, path='/tmp/uploads/', recursive=False)
observer.start()

try:
    time.sleep(30)  # Watch for 30 seconds
finally:
    observer.stop()
    observer.join()

Tidsbaseret udløsermønster

Tidsbaserede udløsere starter agenter efter en tidsplan. Brug APScheduler til planlægning i processen eller en systembaseret cron-opgave til planlægning på procesniveau.

from apscheduler.schedulers.blocking import BlockingScheduler
from datetime import datetime

scheduler = BlockingScheduler()

def daily_report_agent():
    print(f'Daily report running at {datetime.now()}')
    # Fetch data, call LLM, send report
    pass

def hourly_check_agent():
    print(f'Hourly check at {datetime.now()}')
    pass

# Run at 8am every day
scheduler.add_job(daily_report_agent, 'cron', hour=8, minute=0)

# Run every 30 minutes
scheduler.add_job(hourly_check_agent, 'interval', minutes=30)

print('Scheduler started')
scheduler.start()

Idempotent udførelse af handlinger

Automatiseringsagenter skal være idempotente: Hvis den samme handling køres to gange, må det ikke medføre duplikerede virkninger. Brug idempotensnøgler og mønstre med kontrol før handling.

import hashlib

processed_events = set()  # In production, use Redis or DB

def compute_event_id(event):
    content = f"{event['type']}:{event['source_id']}:{event['timestamp']}"
    return hashlib.sha256(content.encode()).hexdigest()[:16]

def handle_event_idempotent(event):
    event_id = compute_event_id(event)
    
    if event_id in processed_events:
        print(f'Skipping duplicate event: {event_id}')
        return {'status': 'duplicate', 'event_id': event_id}
    
    # Process event
    print(f'Processing event: {event_id}')
    processed_events.add(event_id)
    return {'status': 'processed', 'event_id': event_id}

# Simulate duplicate event
event = {'type': 'email', 'source_id': 'abc123', 'timestamp': '2024-01-01T09:00:00'}
print(handle_event_idempotent(event))
print(handle_event_idempotent(event))  # Duplicate - skipped

Fejltilstande og genoprettelse

Robuste agenter håndterer fejl på en hensigtsmæssig måde. Når udførelsen mislykkes, kan agenten prøve igen med eksponentiel ventetid, underrette en person eller flytte opgaven til en kø med fejlslagne meddelelser til manuel gennemgang.

import time

def execute_with_retry(action_fn, max_retries=3):
    for attempt in range(max_retries):
        try:
            result = action_fn()
            print(f'Success on attempt {attempt + 1}')
            return result
        except Exception as e:
            wait = 2 ** attempt  # Exponential backoff: 1s, 2s, 4s
            print(f'Attempt {attempt + 1} failed: {e}. Retrying in {wait}s')
            if attempt < max_retries - 1:
                time.sleep(wait)
            else:
                print('All retries exhausted. Moving to dead-letter queue.')
                raise

# Example usage
call_count = [0]

def flaky_action():
    call_count[0] += 1
    if call_count[0] < 3:
        raise ConnectionError('Service unavailable')
    return 'Done'

execute_with_retry(flaky_action)

Videnstjek: Udløser-handlingsmønstre

Tjek din forståelse af mønstre for udløser-handlingsagenter.

Sådan hænger det sammen

En komplet udløser-handlingsagent kombinerer alle delene: en udløserkilde (e-mail, fil, timer), et detekteringslag, beslutningstagning baseret på LLM, idempotent udførelse, logik til gentagelser og sporing af tilstand.

Start enkelt: én udløsertype, én handling. Tilføj kompleksitet trin for trin, efterhånden som du får større tillid til agentens adfærd.

Gratis at komme i gang

Lær AI-agenter med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
60
Lektioner
239

Ofte stillede spørgsmål

Er lektionen “Agentmønstre for trigger og handling” gratis?

Ja — hele teksten til “Agentmønstre for trigger og handling” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af AI-agenter-kurset, skal du opgradere til CoddyKit PRO. AI-agenter-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Agentmønstre for trigger og handling”?

Hændelsesregistrering → beslutning → handling: den centrale automationssløjfe. Du øver dig i AI-agenter med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på AI-agenter?

Der kræves ingen tidligere erfaring. AI-agenter på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “Agentmønstre for trigger og handling”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne AI-agenter-lektion?

Ja. Alle AI-agenter-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Agentmønstre for trigger og handling
  2. Forbindelse af agenter til webhooks
  3. Planlægning og cron-baserede agenter
  4. Opbygning af en automatiseringspipeline på tværs af flere apps
← Tilbage til AI-agenter