AI Agents · บทเรียน

การสร้างไปป์ไลน์อัตโนมัติสำหรับหลายแอป

เชื่อม Gmail → Slack → Google Sheets ผ่านการเรียกใช้เครื่องมือที่เอเจนต์จัดการ

บทเรียน 4 จาก 413 ขั้นตอน

การสร้างไปป์ไลน์อัตโนมัติสำหรับหลายแอป เป็นบทเรียน AI Agents ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Agents และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน

กระบวนการทำงานหลายแอป

กระบวนการทำงานหลายแอปเชื่อมต่อบริการหลายรายการเข้าด้วยกันเป็นกระบวนการทำงานอัตโนมัติเดียว ในบทเรียนนี้เราจะสร้าง: อีเมลใหม่ใน Gmail → เอเจนต์อ่านและดึงรายการที่ต้องดำเนินการ → สร้างการ์ด Trello → ส่งการแจ้งเตือน Slack

สถาปัตยกรรมกระบวนการทำงาน

กระบวนการทำงานมีสี่ขั้นตอน:

  • ตัวกระตุ้น: การแจ้งเตือนแบบพุชของ Gmail หรือการตรวจสอบเป็นระยะตรวจพบอีเมลใหม่
  • การดึงข้อมูล: LLM อ่านอีเมลและดึงรายการที่ต้องดำเนินการ
  • การสร้าง: Trello API สร้างการ์ดสำหรับรายการที่ต้องดำเนินการแต่ละรายการ
  • การแจ้งเตือน: Slack API โพสต์ข้อความสรุป

แต่ละขั้นตอนเป็นฟังก์ชันแยกกันที่มีข้อมูลนำเข้าและผลลัพธ์ชัดเจน

from dataclasses import dataclass, field
from typing import List

@dataclass
class Email:
    id: str
    sender: str
    subject: str
    body: str

@dataclass
class ActionItem:
    title: str
    description: str
    due_date: str = None

@dataclass
class PipelineResult:
    email_id: str
    action_items: List[ActionItem] = field(default_factory=list)
    trello_card_ids: List[str] = field(default_factory=list)
    slack_message_ts: str = None
    error: str = None

if __name__ == '__main__':
    email = Email(id='e1', sender='alice@example.com', subject='Project update', body='See attached.')
    result = PipelineResult(email_id=email.id, action_items=[ActionItem(title='Review attachment', description='Check the doc')])
    print(f'Pipeline result for {result.email_id}: {len(result.action_items)} action item(s)')
    print(' -', result.action_items[0].title)

ขั้นตอนที่ 1: การอ่านอีเมล

ใช้ Gmail API เพื่อเรียกข้อมูลอีเมลใหม่ ไลบรารี google-api-python-client จัดการการยืนยันตัวตนและการเรียกใช้ API เราจะตรวจสอบหาข้อความที่ยังไม่เคยพบ

from googleapiclient.discovery import build
from google.oauth2.credentials import Credentials
import base64

def get_gmail_service(token_path='token.json'):
    creds = Credentials.from_authorized_user_file(token_path)
    return build('gmail', 'v1', credentials=creds)

def fetch_unread_emails(service, max_results=10):
    results = service.users().messages().list(
        userId='me',
        q='is:unread',
        maxResults=max_results
    ).execute()
    messages = results.get('messages', [])
    emails = []
    for msg in messages:
        detail = service.users().messages().get(
            userId='me', id=msg['id'], format='full'
        ).execute()
        headers = {h['name']: h['value'] for h in detail['payload']['headers']}
        emails.append(Email(
            id=msg['id'],
            sender=headers.get('From', ''),
            subject=headers.get('Subject', ''),
            body=extract_body(detail)
        ))
    return emails

def extract_body(message_detail):
    payload = message_detail.get('payload', {})
    if 'data' in payload.get('body', {}):
        return base64.urlsafe_b64decode(payload['body']['data']).decode('utf-8')
    return ''

ขั้นตอนที่ 2: การดึงรายการที่ต้องดำเนินการ

ส่งเนื้อหาอีเมลไปยัง LLM และขอให้ดึงรายการที่ต้องดำเนินการในรูปแบบ JSON ที่มีโครงสร้าง ใช้ response_format เพื่อให้ได้ผลลัพธ์ JSON ที่เชื่อถือได้

import openai
import json

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

def extract_action_items(email: 'Email') -> list:
    prompt = (
        'Extract all action items from this email. '
        'Return JSON array with objects having fields: '
        'title (string), description (string), due_date (string or null).\n\n'
        f'From: {email.sender}\n'
        f'Subject: {email.subject}\n'
        f'Body:\n{email.body}'
    )
    response = client.chat.completions.create(
        model='gpt-4o-mini',
        messages=[{'role': 'user', 'content': prompt}],
        response_format={'type': 'json_object'}
    )
    result = json.loads(response.choices[0].message.content)
    items = result.get('action_items', [])
    return [
        ActionItem(
            title=item['title'],
            description=item.get('description', ''),
            due_date=item.get('due_date')
        )
        for item in items
    ]

ขั้นตอนที่ 3: การสร้างการ์ด Trello

Trello REST API สร้างการ์ดโดยใช้คำขอ POST แบบง่าย คุณต้องมีคีย์ API โทเค็น และ ID ของรายการที่จะสร้างการ์ด

import httpx

TRELLO_API_KEY = 'your-trello-api-key'
TRELLO_TOKEN = 'your-trello-token'
TRELLO_LIST_ID = 'your-list-id'

def create_trello_card(action_item: 'ActionItem') -> str:
    url = 'https://api.trello.com/1/cards'
    params = {
        'key': TRELLO_API_KEY,
        'token': TRELLO_TOKEN
    }
    data = {
        'name': action_item.title,
        'desc': action_item.description,
        'idList': TRELLO_LIST_ID,
        'due': action_item.due_date
    }
    response = httpx.post(url, params=params, json=data)
    response.raise_for_status()
    card = response.json()
    return card['id']

def create_trello_cards_for_items(action_items: list) -> list:
    card_ids = []
    for item in action_items:
        card_id = create_trello_card(item)
        print(f'Created Trello card: {item.title} (ID: {card_id})')
        card_ids.append(card_id)
    return card_ids

ขั้นตอนที่ 4: การส่งการแจ้งเตือน Slack

ใช้ Slack SDK เพื่อส่งข้อความสรุปที่จัดรูปแบบแล้วไปยังช่อง ข้อความควรสรุปอย่างชัดเจนว่าดึงและสร้างรายการที่ต้องดำเนินการใดบ้าง

from slack_sdk import WebClient

slack_client = WebClient(token='xoxb-your-slack-bot-token')

def send_slack_summary(email: 'Email', action_items: list, card_ids: list, channel: str = '#automation'):
    if not action_items:
        return None
    
    items_text = '\n'.join([
        f'  - {item.title}'
        for item in action_items
    ])
    
    message = (
        f'*New email processed from {email.sender}*\n'
        f'*Subject:* {email.subject}\n\n'
        f'*Action items extracted ({len(action_items)}):*\n'
        f'{items_text}\n\n'
        f'Trello cards created: {len(card_ids)}'
    )
    response = slack_client.chat_postMessage(
        channel=channel,
        text=message,
        mrkdwn=True
    )
    return response['ts']

การจัดการข้อผิดพลาดในแต่ละขั้นตอน

ความทนทานของกระบวนการทำงานขึ้นอยู่กับการจัดการข้อผิดพลาด แต่ละขั้นตอนอาจล้มเหลวได้อย่างอิสระ ให้ครอบการเรียกใช้แต่ละครั้ง บันทึกข้อผิดพลาด และตัดสินใจว่าจะดำเนินการต่อหรือยกเลิกกระบวนการทำงาน

import logging

logger = logging.getLogger('pipeline')

def run_pipeline_stage(stage_name, fn, *args, **kwargs):
    try:
        result = fn(*args, **kwargs)
        logger.info(f'Stage {stage_name}: success')
        return result, None
    except Exception as e:
        logger.error(f'Stage {stage_name}: FAILED - {e}')
        return None, str(e)

def process_email_pipeline(email):
    # Stage 2: Extract
    action_items, err = run_pipeline_stage('extract', extract_action_items, email)
    if err:
        return PipelineResult(email_id=email.id, error=f'Extract failed: {err}')
    if not action_items:
        logger.info(f'No action items found in email {email.id}')
        return PipelineResult(email_id=email.id, action_items=[])
    
    # Stage 3: Trello
    card_ids, err = run_pipeline_stage('trello', create_trello_cards_for_items, action_items)
    if err:
        card_ids = []  # Continue even if Trello fails
    
    # Stage 4: Slack
    ts, err = run_pipeline_stage('slack', send_slack_summary, email, action_items, card_ids or [])
    
    return PipelineResult(
        email_id=email.id,
        action_items=action_items,
        trello_card_ids=card_ids or [],
        slack_message_ts=ts
    )

การบันทึกข้อมูลแบบมีโครงสร้างสำหรับกระบวนการทำงาน

ใช้การบันทึกข้อมูลแบบมีโครงสร้างเพื่อให้ค้นหาประวัติการทำงานของกระบวนการได้ บันทึกการเริ่มกระบวนการ การเสร็จสิ้นของแต่ละขั้นตอน และผลลัพธ์สุดท้ายเป็นออบเจ็กต์ JSON

import logging
import json
from datetime import datetime

class PipelineLogger:
    def __init__(self, pipeline_name):
        self.pipeline_name = pipeline_name
        self.logger = logging.getLogger(pipeline_name)
        self.run_id = None
        self.start_time = None
    
    def start(self, email_id):
        self.run_id = f'{email_id}_{int(datetime.now().timestamp())}'
        self.start_time = datetime.now()
        self.logger.info(json.dumps({
            'event': 'pipeline_start',
            'run_id': self.run_id,
            'email_id': email_id
        }))
    
    def stage_done(self, stage, result_summary):
        self.logger.info(json.dumps({
            'event': 'stage_complete',
            'run_id': self.run_id,
            'stage': stage,
            'result': result_summary
        }))
    
    def finish(self, success, details):
        duration = (datetime.now() - self.start_time).total_seconds()
        self.logger.info(json.dumps({
            'event': 'pipeline_finish',
            'run_id': self.run_id,
            'success': success,
            'duration_seconds': duration,
            'details': details
        }))

if __name__ == '__main__':
    import sys
    logging.basicConfig(level=logging.INFO, format='%(message)s', stream=sys.stdout)
    pl = PipelineLogger('demo_pipeline')
    pl.start('email_123')
    pl.stage_done('extract', {'items_found': 3})
    pl.finish(True, {'action_items': 2})

ตัวเรียกใช้กระบวนการหลัก

ตัวเรียกใช้งานหลักเชื่อมโยงทุกอย่างเข้าด้วยกัน โดยจะตรวจสอบอีเมลใหม่ ประมวลผลอีเมลแต่ละฉบับผ่านกระบวนการทำงาน และทำเครื่องหมายว่าอ่านแล้วเพื่อป้องกันการประมวลผลซ้ำ

import time

def mark_as_read(gmail_service, email_id):
    gmail_service.users().messages().modify(
        userId='me',
        id=email_id,
        body={'removeLabelIds': ['UNREAD']}
    ).execute()

def run_email_pipeline_loop(gmail_service, poll_interval=60):
    pipeline_logger = PipelineLogger('email_pipeline')
    print(f'Pipeline running. Polling every {poll_interval}s')
    
    while True:
        try:
            emails = fetch_unread_emails(gmail_service)
            print(f'Found {len(emails)} unread emails')
            
            for email in emails:
                pipeline_logger.start(email.id)
                result = process_email_pipeline(email)
                
                if result.error:
                    pipeline_logger.finish(False, {'error': result.error})
                else:
                    mark_as_read(gmail_service, email.id)
                    pipeline_logger.finish(True, {
                        'action_items': len(result.action_items),
                        'cards_created': len(result.trello_card_ids)
                    })
        
        except Exception as e:
            print(f'Pipeline loop error: {e}')
        
        time.sleep(poll_interval)

การจัดการการตั้งค่า

เก็บข้อมูลรับรอง API และการตั้งค่ากระบวนการทำงานทั้งหมดไว้ในตัวแปรสภาพแวดล้อม ไม่ใช่ในโค้ด โหลดค่าเหล่านี้เมื่อเริ่มต้นทำงาน และตรวจสอบว่ามี keys ที่จำเป็นครบถ้วน

import os
from dotenv import load_dotenv

load_dotenv()

class PipelineConfig:
    def __init__(self):
        self.openai_api_key = os.environ.get('OPENAI_API_KEY', '')
        self.slack_bot_token = os.environ.get('SLACK_BOT_TOKEN', '')
        self.trello_api_key = os.environ.get('TRELLO_API_KEY', '')
        self.trello_token = os.environ.get('TRELLO_TOKEN', '')
        self.trello_list_id = os.environ.get('TRELLO_LIST_ID', '')
        self.slack_channel = os.environ.get('SLACK_CHANNEL', '#automation')
        self.poll_interval = int(os.environ.get('POLL_INTERVAL_SECONDS', '60'))
    
    def validate(self):
        missing = []
        required = [
            ('OPENAI_API_KEY', self.openai_api_key),
            ('SLACK_BOT_TOKEN', self.slack_bot_token),
            ('TRELLO_API_KEY', self.trello_api_key),
            ('TRELLO_TOKEN', self.trello_token),
            ('TRELLO_LIST_ID', self.trello_list_id)
        ]
        for name, value in required:
            if not value:
                missing.append(name)
        if missing:
            raise ValueError(f'Missing required config: {missing}')
        return True

config = PipelineConfig()
config.validate()
print('Config validated successfully')

การทดสอบกระบวนการทำงาน

ทดสอบแต่ละขั้นตอนของกระบวนการทำงานแยกกันด้วยข้อมูลจำลองก่อนเรียกใช้ตั้งแต่ต้นจนจบ วิธีนี้ช่วยให้คุณตรวจสอบตรรกะได้โดยไม่ต้องใช้โควตา API หรือสร้างการ์ด Trello จริง

from unittest.mock import MagicMock, patch

def test_extract_action_items_mock():
    mock_response = MagicMock()
    mock_response.choices[0].message.content = '{"action_items": [{"title": "Follow up with vendor", "description": "Call about invoice", "due_date": null}]}'
    
    with patch('openai.OpenAI') as mock_openai:
        mock_client = MagicMock()
        mock_client.chat.completions.create.return_value = mock_response
        mock_openai.return_value = mock_client
        
        test_email = Email(
            id='test123',
            sender='vendor@example.com',
            subject='Invoice Follow-up Needed',
            body='Please follow up with the vendor about the outstanding invoice.'
        )
        # Would call extract_action_items(test_email) with mocked OpenAI
        print('Test email:', test_email.subject)
        print('Mock response parsed successfully')

test_extract_action_items_mock()

ตรวจสอบความรู้: กระบวนการทำงานหลายแอป

ทดสอบความเข้าใจของคุณเกี่ยวกับการสร้างกระบวนการทำงานอัตโนมัติที่ทำงานร่วมกับหลายแอป

สรุปกระบวนการทำงาน

คุณได้สร้างกระบวนการทำงานอัตโนมัติหลายแอปอย่างครบถ้วนแล้ว ซึ่งประกอบด้วยการตรวจจับ Gmail การสกัดข้อมูลด้วย LLM การสร้างการ์ด Trello และการแจ้งเตือนผ่าน Slack หลักการออกแบบสำคัญ ได้แก่ การแยกขั้นตอนด้วย interface ที่ชัดเจน การจัดการข้อผิดพลาดอย่างรัดกุมในแต่ละขั้นตอน การบันทึกข้อมูลการทำงานอย่างเป็นโครงสร้าง และการตั้งค่าผ่านตัวแปรสภาพแวดล้อม

เริ่มต้นได้ฟรี

เรียนรู้ AI Agents ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
60
บทเรียน
239

คำถามที่พบบ่อย

บทเรียน “การสร้างไปป์ไลน์อัตโนมัติสำหรับหลายแอป” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การสร้างไปป์ไลน์อัตโนมัติสำหรับหลายแอป” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Agents ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การสร้างไปป์ไลน์อัตโนมัติสำหรับหลายแอป”

เชื่อม Gmail → Slack → Google Sheets ผ่านการเรียกใช้เครื่องมือที่เอเจนต์จัดการ คุณปฏิบัติ AI Agents ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Agents หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Agents บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การสร้างไปป์ไลน์อัตโนมัติสำหรับหลายแอป” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน AI Agents นี้ได้ไหม

ได้ บทเรียน AI Agents ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. รูปแบบตัวแทนทริกเกอร์-การดำเนินการ
  2. การเชื่อมต่อตัวแทนกับเว็บฮุก
  3. ตัวแทนตามกำหนดเวลาและ Cron
  4. การสร้างไปป์ไลน์อัตโนมัติสำหรับหลายแอป
← กลับไปที่ AI Agents