การสร้างไปป์ไลน์อัตโนมัติสำหรับหลายแอป
เชื่อม Gmail → Slack → Google Sheets ผ่านการเรียกใช้เครื่องมือที่เอเจนต์จัดการ
การสร้างไปป์ไลน์อัตโนมัติสำหรับหลายแอป เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- รูปแบบตัวแทนทริกเกอร์-การดำเนินการ
- การเชื่อมต่อตัวแทนกับเว็บฮุก
- ตัวแทนตามกำหนดเวลาและ Cron
- การสร้างไปป์ไลน์อัตโนมัติสำหรับหลายแอป