Birden Fazla Uygulama İçin Otomasyon Hattı Oluşturma
Aracılar tarafından yönetilen araç çağrılarıyla Gmail → Slack → Google Sheets zinciri oluşturma.
Birden Fazla Uygulama İçin Otomasyon Hattı Oluşturma, 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.
Çok Uygulamalı İşlem Hattı
Çok uygulamalı bir işlem hattı, çeşitli hizmetleri tek bir otomatik iş akışında birleştirir. Bu derste şu yapıyı oluşturuyoruz: Gmail yeni e-posta → ajan okur ve eylem maddelerini çıkarır → Trello kartı oluşturur → Slack bildirimi gönderir.
İşlem Hattı Mimarisi
İşlem hattı dört aşamadan oluşur:
- Tetikleme: Gmail anlık bildirimi veya düzenli sorgulama yeni e-postayı algılar
- Çıkarma: LLM e-postayı okur ve eylem maddelerini çıkarır
- Oluşturma: Trello API, her eylem maddesi için bir kart oluşturur
- Bildirim: Slack API, özet mesajı gönderir
Her aşama, girdileri ve çıktıları açıkça tanımlanmış ayrı bir işlevdir.
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. Aşama: E-postaları Okuma
Yeni e-postaları almak için Gmail API'yi kullanın. google-api-python-client kitaplığı, kimlik doğrulamayı ve API çağrılarını yönetir. Henüz görülmemiş iletiler için düzenli sorgulama yaparız.
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. Aşama: Eylem Maddelerini Çıkarma
E-posta içeriğini bir LLM'ye gönderin ve eylem maddelerini yapılandırılmış JSON biçiminde çıkarmasını isteyin. Güvenilir JSON çıktısı almak için response_format kullanın.
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. Aşama: Trello Kartları Oluşturma
Trello REST API, basit bir POST isteği kullanarak kartlar oluşturur. API anahtarınıza, belirtecinize ve kartların oluşturulacağı listenin ID'sine ihtiyacınız vardır.
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_ids4. Aşama: Slack Bildirimi Gönderme
Biçimlendirilmiş bir özet mesajını bir kanala göndermek için Slack SDK'sını kullanın. Mesaj, hangi eylem maddelerinin çıkarılıp oluşturulduğunu açıkça özetlemelidir.
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']Her Aşamada Hata Ele Alma
Bir işlem hattı, yalnızca hata ele alma mekanizması kadar dayanıklıdır. Her aşama bağımsız olarak başarısız olabilir. Her çağrıyı sarın, hatayı günlüğe kaydedin ve işlem hattına devam edip etmeyeceğinize veya onu durdurup durdurmayacağınıza karar verin.
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
)İşlem Hatları için Yapılandırılmış Günlük Kaydı
İşlem hattı yürütme geçmişini sorgulayabilmek için yapılandırılmış günlük kaydı kullanın. İşlem hattının başlangıcını, her aşamanın tamamlanmasını ve nihai sonucu JSON nesneleri olarak günlüğe kaydedin.
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})
Ana İşlem Hattı Çalıştırıcısı
Ana yürütücü her şeyi bir araya getirir. Yeni e-postaları yoklar, her birini işlem hattından geçirir ve yeniden işlenmelerini önlemek için okundu olarak işaretler.
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)Yapılandırma Yönetimi
Tüm API kimlik bilgilerini ve işlem hattı ayarlarını kodda değil, ortam değişkenlerinde tutun. Bunları başlangıçta yükleyin ve gerekli anahtarların bulunduğunu doğrulayın.
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')İşlem Hattını Sınama
Uçtan uca çalıştırmadan önce her işlem hattı aşamasını taklit verilerle bağımsız olarak sınayın. Böylece API kredilerini tüketmeden veya gerçek Trello kartları oluşturmadan mantığı doğrulayabilirsiniz.
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()Bilginizi Sınayın: Birden Çok Uygulamalı İşlem Hattı
Birden çok uygulamayı içeren otomasyon işlem hatları oluşturma konusundaki anlayışınızı sınayın.
İşlem Hattının Özeti
Eksiksiz birden çok uygulamalı otomasyon işlem hattı oluşturdunuz: Gmail algılama, LLM tabanlı çıkarım, Trello kartı oluşturma ve Slack bildirimi. Temel tasarım ilkeleri şunlardır: net arayüzlere sahip ayrı aşamalar, her adımda sağlam hata işleme, yapılandırılmış günlük kaydı ve ortam değişkenleriyle yapılandırma.
Sıkça Sorulan Sorular
“Birden Fazla Uygulama İçin Otomasyon Hattı Oluşturma” dersi ücretsiz mi?
Evet — “Birden Fazla Uygulama İçin Otomasyon Hattı Oluşturma” 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.
“Birden Fazla Uygulama İçin Otomasyon Hattı Oluşturma” dersinde ne öğreneceğim?
Aracılar tarafından yönetilen araç çağrılarıyla Gmail → Slack → Google Sheets zinciri oluşturma. 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.
“Birden Fazla Uygulama İçin Otomasyon Hattı Oluşturma” 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
- Tetikleyici-Eylem Aracı Kalıpları
- Aracıları Web Kancalarına Bağlama
- Zamanlama ve Cron Tabanlı Aracılar
- Birden Fazla Uygulama İçin Otomasyon Hattı Oluşturma