n8n ile Yapay Zeka API Entegrasyonu: ChatGPT ve Diğer AI Servislerini İş Akışlarına Bağlama
Geçen ay bir müşteri beni aradı, “Elimizde yüzlerce müşteri destek e-postası birikiyor, bunları kategorize etmek için insan gücü harcıyoruz, bir şey yapabilir misin?” dedi. İki gün içinde n8n üzerine kurulu, GPT-4 destekli bir sınıflandırma pipeline’ı devreye aldık. Şimdi o ekip, e-postaları okumak yerine sadece edge case’lere bakıyor. İşte bu yazı, tam olarak böyle senaryolar için.
n8n Neden AI Entegrasyonu İçin İdeal?
n8n’i diğer otomasyon araçlarından ayıran birkaç kritik özellik var. Önce açık kaynak ve self-hosted olması: API anahtarlarınız, verileriniz, iş akışlarınız tamamen sizin kontrolünüzde kalıyor. Zapier veya Make kullanırken verilerinizin üçüncü parti sunuculara gittiğini unutmayın, özellikle kurumsal ve sağlık sektöründe bu ciddi bir sorun.
İkincisi, n8n’in HTTP Request node’u neredeyse her REST API ile çalışıyor. OpenAI, Anthropic, Google Gemini, Cohere, ya da kendi deploy ettiğiniz Ollama instance’ı fark etmez. Üçüncüsü ise JavaScript ile code node yazabilmeniz, bu da sizi “no-code sınırlılıklarından” kurtarıyor.
Kurulum için hızlıca geçelim:
# Docker ile n8n kurulumu
docker run -it --rm
--name n8n
-p 5678:5678
-v ~/.n8n:/home/node/.n8n
-e N8N_BASIC_AUTH_ACTIVE=true
-e N8N_BASIC_AUTH_USER=admin
-e N8N_BASIC_AUTH_PASSWORD=guclu_sifre
-e WEBHOOK_URL=https://n8n.sirketiniz.com
n8nio/n8n
Production için docker-compose kullanın ve PostgreSQL ile bağlayın, SQLite production’da sorun çıkarır.
OpenAI API ile Temel Bağlantı
n8n’de AI entegrasyonunun iki yolu var: hazır OpenAI node’u veya HTTP Request node. Ben genellikle HTTP Request node’unu tercih ediyorum çünkü daha fazla kontrol sağlıyor ve model güncellendiğinde node’un güncellenmesini beklemeniz gerekmiyor.
Credentials ayarı: n8n arayüzünde Settings > Credentials > New Credential > Header Auth oluşturun. Name: Authorization, Value: Bearer sk-xxxxx şeklinde kaydedin.
İlk API çağrısı için basit bir HTTP Request node konfigürasyonu:
# n8n HTTP Request node için örnek cURL karşılığı
curl -X POST https://api.openai.com/v1/chat/completions
-H "Content-Type: application/json"
-H "Authorization: Bearer $OPENAI_API_KEY"
-d '{
"model": "gpt-4-turbo-preview",
"messages": [
{
"role": "system",
"content": "Sen deneyimli bir müşteri hizmetleri uzmanısın."
},
{
"role": "user",
"content": "{{ $json.email_body }}"
}
],
"temperature": 0.3,
"max_tokens": 500
}'
temperature: 0.3 değerine dikkat edin. Sınıflandırma ve analiz görevlerinde düşük temperature kullanmak, tutarlı sonuçlar almanızı sağlar. Yaratıcı içerik üretiminde 0.7-0.9 arasına çıkabilirsiniz.
Gerçek Dünya Senaryosu 1: E-posta Sınıflandırma Pipeline’ı
Yukarıda bahsettiğim müşteri destek senaryosunu adım adım kuralım. Workflow şu şekilde çalışıyor: E-posta gelir > İçerik analiz edilir > Kategori belirlenir > İlgili ticket sistemine yönlendirilir > Ekip bilgilendirilir.
Workflow node’ları:
- IMAP Email Trigger: Her 5 dakikada yeni e-postaları çeker
- Code Node: E-posta metnini temizler ve formatlar
- HTTP Request: OpenAI API’ye gönderir
- Switch Node: Kategoriye göre yönlendirir
- Slack/Teams Node: İlgili kanala bildirim gönderir
Code node’da e-posta temizleme işlemi şöyle görünür:
# JavaScript - n8n Code Node içeriği
# HTML taglarını temizle ve uzun metinleri kısalt
const emailBody = $input.item.json.text || $input.item.json.html;
const cleanText = emailBody
.replace(/<[^>]*>/g, ' ')
.replace(/s+/g, ' ')
.trim()
.substring(0, 2000); // Token limitini aşmamak için
const subject = $input.item.json.subject || '';
return {
cleaned_body: cleanText,
subject: subject,
from: $input.item.json.from,
timestamp: new Date().toISOString(),
prompt: `E-posta konusu: ${subject}nnE-posta içeriği: ${cleanText}`
};
OpenAI’ye gönderilen sistem prompt’u kritik öneme sahip. Muğlak prompt’lar muğlak sonuçlar doğurur:
# System prompt - her zaman JSON formatı isteyin
Sen bir müşteri hizmetleri kategorilendirme asistanısın.
Gelen e-postayı analiz et ve SADECE şu JSON formatında yanıt ver:
{
"kategori": "teknik_destek|fatura|iptal|genel_bilgi|sikayet",
"oncelik": "dusuk|orta|yuksek|kritik",
"ozet": "maksimum 50 kelimelik özet",
"duygu": "pozitif|notr|negatif"
}
Başka hiçbir açıklama ekleme.
JSON formatı zorunlu tutmanın bir sebebi var: n8n’de yanıtı parse etmek çok daha kolay oluyor ve downstream node’lar için güvenilir bir veri yapısı elde ediyorsunuz.
Gerçek Dünya Senaryosu 2: Doküman Özetleme ve Embedding
Büyük PDF dosyalarını özetlemek veya semantic search için vektör veritabanına atmak istediğinizde işler biraz karmaşıklaşıyor. Token limitleri gerçek bir sorun. GPT-4’ün 128k context window’u var ama her şeyi tek seferde atmak hem pahalı hem de yavaş.
Chunk-based yaklaşım için workflow:
# Python benzeri pseudo-code - n8n Code Node'da JavaScript olarak çalışır
# Büyük metni paragraflara böl
const fullText = $input.item.json.document_text;
const maxChunkSize = 3000; // karakter bazında
const chunks = [];
let currentChunk = '';
const paragraphs = fullText.split('nn');
for (const paragraph of paragraphs) {
if ((currentChunk + paragraph).length > maxChunkSize) {
if (currentChunk) chunks.push(currentChunk.trim());
currentChunk = paragraph;
} else {
currentChunk += 'nn' + paragraph;
}
}
if (currentChunk) chunks.push(currentChunk.trim());
// Her chunk için ayrı item oluştur
return chunks.map((chunk, index) => ({
chunk_text: chunk,
chunk_index: index,
total_chunks: chunks.length,
document_id: $input.item.json.document_id
}));
Bu code node birden fazla item döndürdüğünde n8n bunu otomatik olarak split eder ve sonraki node her chunk için ayrı ayrı çalışır. Bunu n8n’nin en güçlü özelliklerinden biri olarak görüyorum.
Embedding için OpenAI text-embedding-3-small modeli kullanıyorum, ucuz ve yeterince güçlü:
# Embedding API çağrısı
curl -X POST https://api.openai.com/v1/embeddings
-H "Authorization: Bearer $OPENAI_API_KEY"
-H "Content-Type: application/json"
-d '{
"input": "{{ $json.chunk_text }}",
"model": "text-embedding-3-small",
"encoding_format": "float"
}'
Gerçek Dünya Senaryosu 3: Ollama ile Lokal LLM Entegrasyonu
Bazı veri gizliliği gereksinimleri olan ortamlarda OpenAI’ye veri gönderemezsiniz. Bu durumda Ollama ile lokal model çalıştırmak hem yasal açıdan temiz hem de uzun vadede daha ucuz.
# Ollama kurulumu ve model indirme
curl -fsSL https://ollama.ai/install.sh | sh
# Mistral 7B modelini indir
ollama pull mistral
# Llama3 için
ollama pull llama3
# Ollama API'yi test et
curl -X POST http://localhost:11434/api/chat
-H "Content-Type: application/json"
-d '{
"model": "mistral",
"messages": [
{"role": "user", "content": "Merhaba, nasılsın?"}
],
"stream": false
}'
n8n ve Ollama aynı Docker network’ünde çalışıyorsa http://ollama:11434 şeklinde erişebilirsiniz. Farklı makinelerdeyse IP adresi veya hostname kullanın.
Docker compose ile birlikte çalıştırmak için:
# docker-compose.yml
version: '3.8'
services:
n8n:
image: n8nio/n8n
ports:
- "5678:5678"
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=admin
- N8N_BASIC_AUTH_PASSWORD=sifreniz
volumes:
- n8n_data:/home/node/.n8n
networks:
- ai_network
ollama:
image: ollama/ollama
ports:
- "11434:11434"
volumes:
- ollama_data:/root/.ollama
networks:
- ai_network
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
networks:
ai_network:
driver: bridge
volumes:
n8n_data:
ollama_data:
GPU yoksa deploy.resources bloğunu kaldırın. CPU ile de çalışır, sadece daha yavaş.
Hata Yönetimi ve Rate Limiting
Production ortamında en çok canımı sıkan şey rate limit hataları. OpenAI’nin API’si, özellikle yeni hesaplarda çok kısıtlayıcı. n8n’de bunu yönetmenin birkaç yolu var.
Retry mekanizması: HTTP Request node’unda “Retry on Fail” seçeneğini aktif edin. Max Tries: 3, Wait Between Tries: 2000ms ile başlayın.
Rate limit için exponential backoff: Code node ile özel bir bekleme mantığı yazabilirsiniz:
# n8n Code Node - Rate limit handler
const response = $input.item.json;
// OpenAI 429 hatası kontrolü
if (response.error && response.error.type === 'requests') {
const retryAfter = response.error.message.match(/(d+)/)?.[1] || 60;
// n8n'de bekleme için $execution.resumeUrl kullanın
// veya basit bir timestamp ekleyip queue'a bırakın
return {
should_retry: true,
retry_after_seconds: parseInt(retryAfter),
original_input: $input.item.json.original_input,
error_message: response.error.message
};
}
return {
should_retry: false,
result: response.choices[0].message.content
};
Paralel işlem limitlemesi: Split In Batches node’unu kullanarak aynı anda kaç istek gönderileceğini kontrol edin. Batch Size: 5 ile başlayıp sisteme göre artırın.
Webhook ile Gerçek Zamanlı AI Pipeline
Bir web uygulaması veya başka bir servis n8n’e veri gönderecekse Webhook trigger kullanın. Bu yaklaşım özellikle form submission, Slack slash command veya GitHub webhook entegrasyonlarında işe yarıyor.
# n8n webhook endpoint'ini test etmek için
curl -X POST https://n8n.sirketiniz.com/webhook/ai-analyze
-H "Content-Type: application/json"
-H "X-Webhook-Secret: gizli_token"
-d '{
"text": "Ürününüz çok kalitesiz, param iadesi istiyorum!",
"user_id": "usr_12345",
"source": "web_chat"
}'
Webhook güvenliği için Header Auth kullanın. n8n’de “Header Auth” credential oluşturup webhook node’una bağlayın. Herkes webhook URL’nize istek atamasın.
Webhook yanıtını senkron olarak dönmek istiyorsanız “Respond to Webhook” node’unu kullanın ve workflow’un sonuna ekleyin. Bu sayede uygulamanız AI analiz sonucunu bekleyebilir.
# Respond to Webhook node örnek çıktısı
{
"status": "success",
"analysis": {
"kategori": "sikayet",
"oncelik": "yuksek",
"duygu": "negatif",
"ozet": "Ürün kalitesinden memnun olmayan müşteri para iadesi talep ediyor"
},
"processing_time_ms": 1243,
"model_used": "gpt-4-turbo-preview"
}
n8n’in Yerleşik AI Node’larını Kullanmak
n8n 0.220+ sürümüyle birlikte LangChain entegrasyonu geldi. Bu özellik hala beta’da ama bazı kullanım senaryoları için çok işe yarıyor. AI Agent node’u, OpenAI Functions/Tools API ile uyumlu çalışıyor ve LLM’e araçlar tanımlayabiliyorsunuz.
Örneğin bir AI Agent’a şu araçları verebilirsiniz:
- HTTP Request Tool: Harici API’lere çağrı yapma
- Code Tool: JavaScript kodu çalıştırma
- Wikipedia Tool: Bilgi arama
- Calculator Tool: Matematiksel işlemler
Bu yaklaşım “agentic workflow” olarak adlandırılıyor. LLM, görevi tamamlamak için hangi araçları kaç kez kullanacağına kendisi karar veriyor. Çok katmanlı kararlar gerektiren senaryolarda güçlü, ancak determinizm istediğiniz durumlarda klasik node zinciri daha güvenilir.
Maliyet Kontrolü ve Monitoring
OpenAI maliyetleri beklenmedik şekilde artabilir. Bunu önlemek için birkaç önlem alın.
İlk olarak, her API çağrısından önce token sayısını tahmin eden bir code node ekleyin:
# Basit token tahmini (gerçek tokenizer değil, yaklaşık)
const text = $input.item.json.prompt;
const estimatedTokens = Math.ceil(text.length / 4);
const maxAllowed = 2000;
if (estimatedTokens > maxAllowed) {
throw new Error(`Token limit aşıldı: ~${estimatedTokens} token`);
}
return {
text: text,
estimated_tokens: estimatedTokens,
proceed: true
};
İkinci olarak, n8n’in execution log’larını kullanarak günlük API çağrı sayısını takip edin. Bunu PostgreSQL’e yazan basit bir log workflow’u kurabilirsiniz.
Üçüncüsü, OpenAI dashboard’unda hard limit tanımlayın. Ayda X dolar limitini geçince API tamamen dursun. Bu bazen can sıkıcı olsa da sürpriz faturalar daha can sıkıcı.
Model seçiminde de dikkatli olun. Her görev için GPT-4 kullanmak zorunda değilsiniz. Basit sınıflandırma için gpt-3.5-turbo veya Ollama’daki mistral modeli çoğu zaman yeterli ve çok daha ucuz.
Production Deployment Kontrol Listesi
Workflow’u production’a almadan önce şunları kontrol edin:
- Credentials: Tüm API anahtarları n8n credential store’da, workflow JSON’ında değil
- Error handling: Her kritik node’da “Continue on Fail” veya dedicated error workflow tanımlı
- Logging: Başarılı ve başarısız çalışmalar bir yere yazılıyor
- Alerting: Kritik hatalar için Slack/e-posta bildirimi var
- Rate limiting: Batch node’u veya wait node’u ile API limitleri korunuyor
- Input validation: Kullanıcıdan gelen veri temizleniyor ve validate ediliyor
- Timeout ayarları: Uzun süren AI çağrıları için HTTP node’unda timeout tanımlı, 60 saniye genellikle makul
- Backup: n8n workflow’larınız Git’te versiyonlanıyor
# n8n workflow export ve backup script
#!/bin/bash
N8N_URL="http://localhost:5678"
BACKUP_DIR="/opt/n8n-backups/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR
# Tüm workflow'ları export et
curl -s -u admin:$N8N_PASSWORD
"$N8N_URL/api/v1/workflows"
-o "$BACKUP_DIR/workflows.json"
# Git'e commit et
cd /opt/n8n-backups
git add .
git commit -m "n8n backup $(date +%Y-%m-%d)"
git push origin main
echo "Backup tamamlandı: $BACKUP_DIR"
Bu script’i cron’a ekleyin ve gönül rahatlığıyla uyuyun.
Sonuç
n8n ile AI entegrasyonu, doğru yapıldığında gerçekten güçlü sonuçlar doğuruyor. Ama “doğru yapıldığında” kısmı önemli. Gördüğüm en yaygın hatalar şunlar: prompt mühendisliğine yeterli zaman ayırmamak, hata yönetimini ihmal etmek, ve her şey için en pahalı modeli kullanmak.
Başlangıç için şu yolu öneriyorum: önce küçük ve iyi tanımlanmış bir problem seçin, hızlı bir prototype kurun, production’da ne kadar güvenilir çalıştığını gözlemleyin, sonra ölçeklendirin. Müşteri e-posta sınıflandırması, log anomali tespiti, doküman özetleme veya kod review otomasyonu, bunların hepsi n8n ile makul sürede kurulabilir.
Self-hosted n8n, OpenAI veya Ollama kombinasyonu bugün itibarıyla bir sysadmin’in araç kutusunda bulunması gereken bir beceri haline geldi. Ekibinizin tekrarlayan ve yorucu işlerini otomatize etmek için hem teknik altyapı hem de araçlar mevcut. Geri kalan kısım sadece başlamak.
