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.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir