[{"data":1,"prerenderedAt":1852},["ShallowReactive",2],{"article-alternates":3,"article-\u002Ftr\u002Fai\u002Fn8n-claude-api-pazarlama-operasyonunda-otonomi":13},{"i18nKey":4,"paths":5},"ai-005-2026-05",{"de":6,"en":7,"es":8,"fr":9,"it":10,"ru":11,"tr":12},"\u002Fde\u002Fai\u002Fn8n-claude-api-pazarlama-operasyonunda-otonomi","\u002Fen\u002Fai\u002Fn8n-claude-api-autonomous-marketing-workflows","\u002Fes\u002Fai\u002Fn8n-claude-api-pazarlama-otomasyonu","\u002Ffr\u002Fai\u002Fn8n-claude-api-pazarlama-otonomi","\u002Fit\u002Fai\u002Fn8n-claude-api-automazione-operativa-marketing","\u002Fru\u002Fai\u002Fn8n-claude-api-pazarlama-operasyonunda-otonomi","\u002Ftr\u002Fai\u002Fn8n-claude-api-pazarlama-operasyonunda-otonomi",{"_path":12,"_dir":14,"_draft":15,"_partial":15,"_locale":16,"title":17,"description":18,"publishedAt":19,"modifiedAt":19,"category":14,"i18nKey":4,"tags":20,"readingTime":26,"author":27,"body":28,"_type":1846,"_id":1847,"_source":1848,"_file":1849,"_stem":1850,"_extension":1851},"ai",false,"","n8n + Claude API: Pazarlama Operasyonunda Otonomi","Otonom workflow tasarımı, idempotency garantileri ve hata yönetimi stratejileriyle pazarlama operasyonlarını AI'ya güvenle devretmek.","2026-05-16",[21,22,23,24,25],"n8n","claude-api","workflow-automation","idempotency","ai-operations",8,"Roibase",{"type":29,"children":30,"toc":1835},"root",[31,47,54,59,64,80,86,91,340,377,422,427,434,455,741,754,759,765,778,1077,1090,1170,1175,1521,1526,1532,1537,1660,1682,1687,1693,1698,1709,1719,1729,1741,1747,1752,1773,1786,1806,1812,1817,1829],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36,39,45],{"type":37,"value":38},"text","Pazarlama operasyonlarında tek darboğaz insan kapasitesi değil — karar sürecinin sürekli müdahale gerektirmesi. İçerik üretimi, veri normalizasyonu, raporlama gibi tekrarlayan işleri otomatikleştirince karşınıza yeni bir sorun çıkıyor: otomasyon güvenilir değilse sürekli izlemeniz gerekiyor. n8n gibi workflow araçlarını Claude API ile birleştirdiğinizde asıl kazanç, işi otomatikleştirmek değil — işi ",{"type":32,"tag":40,"props":41,"children":42},"em",{},[43],{"type":37,"value":44},"gözetimsiz",{"type":37,"value":46}," çalıştırmak. Bunun için üç katman gerekiyor: idempotency garantisi, hata kurtarma mekanizmaları ve gözlemlenebilir state yönetimi.",{"type":32,"tag":48,"props":49,"children":51},"h2",{"id":50},"otonom-workflowun-gerçek-tanımı",[52],{"type":37,"value":53},"Otonom Workflow'un Gerçek Tanımı",{"type":32,"tag":33,"props":55,"children":56},{},[57],{"type":37,"value":58},"Otonom workflow, sadece \"A olduğunda B'yi tetikle\" automasyonu değil. Sistem şunu garanti eder: workflow yarıda kesintiye uğrasa bile aynı girdiye her zaman aynı sonucu üretir ve corrupt state bırakmaz. Pazarlama operasyonunda bu kritik — örneğin GSC'den gelen 500 keyword'ü Claude'a blog başlığı ürettiriyorsanız, 247. keyword'de API timeout'u olduğunda ne yapacaksınız önemli. Baştan mı başlayacak (ilk 246'yı duplicate eder), kaldığı yerden mi devam edecek (247-500 arası orphan kalır), yoksa işlemi idempotent şekilde retry edip aynı sonucu mu üretecek?",{"type":32,"tag":33,"props":60,"children":61},{},[62],{"type":37,"value":63},"Claude gibi LLM'lerde deterministik output garantisi yok — aynı prompt'a farklı cevap verebilir. Bu yüzden idempotency'yi API seviyesinde değil, workflow seviyesinde kurmalısınız. n8n'de her node'un output'unu hash'leyip cache'leyin. Eğer aynı input gelirse (örneğin aynı keyword + kategori kombinasyonu) Claude'u çağırmadan cached sonucu dönün. Bu hem maliyet düşürür (247. keyword'de crash olunca ilk 246'yı tekrar işlemezsiniz) hem de state'i tutarlı tutar.",{"type":32,"tag":33,"props":65,"children":66},{},[67,69,78],{"type":37,"value":68},"Gözlemlenebilirlik için her workflow run'ını structured log'layın: input hash, timestamp, Claude response metadata (model, prompt tokens, completion tokens), output hash, retry sayısı. BigQuery'e yazın. Bu veri hem debugging'de (hangi prompt'ta output değişti?) hem de cost attribution'da (hangi kategori ne kadar token tüketiyor?) kullanılır. ",{"type":32,"tag":70,"props":71,"children":75},"a",{"href":72,"rel":73},"https:\u002F\u002Fwww.roibase.com.tr\u002Ftr\u002Fverianalizi",[74],"nofollow",[76],{"type":37,"value":77},"Veri Analizi & İçgörü Mühendisliği",{"type":37,"value":79}," yapısı burada workflow telemetrisi ile entegre çalışır — sadece iş sonuçlarını değil, üretim sürecinin maliyetini de ölçersiniz.",{"type":32,"tag":48,"props":81,"children":83},{"id":82},"n8nde-idempotency-garantisi-kurmak",[84],{"type":37,"value":85},"n8n'de Idempotency Garantisi Kurmak",{"type":32,"tag":33,"props":87,"children":88},{},[89],{"type":37,"value":90},"n8n webhook veya schedule ile tetiklenen bir workflow'da idempotency şu mekanizmalarla kurulur: input deduplication, checkpoint state, conditional retry. Örnek senaryo: her sabah GSC'den top 100 impression keyword'ü çekip Claude ile blog outline üretiyorsunuz.",{"type":32,"tag":92,"props":93,"children":97},"pre",{"className":94,"code":95,"language":96,"meta":16,"style":16},"language-javascript shiki shiki-themes github-dark","\u002F\u002F n8n Function node — input hash\nconst inputData = {\n  keyword: $json.keyword,\n  category: $json.category,\n  date: $json.date\n};\nconst inputHash = require('crypto')\n  .createHash('sha256')\n  .update(JSON.stringify(inputData))\n  .digest('hex');\n\nreturn { ...inputData, inputHash };\n","javascript",[98],{"type":32,"tag":99,"props":100,"children":101},"code",{"__ignoreMap":16},[102,114,141,150,159,168,177,216,242,279,306,316],{"type":32,"tag":103,"props":104,"children":107},"span",{"class":105,"line":106},"line",1,[108],{"type":32,"tag":103,"props":109,"children":111},{"style":110},"--shiki-default:#6A737D",[112],{"type":37,"value":113},"\u002F\u002F n8n Function node — input hash\n",{"type":32,"tag":103,"props":115,"children":117},{"class":105,"line":116},2,[118,124,130,135],{"type":32,"tag":103,"props":119,"children":121},{"style":120},"--shiki-default:#F97583",[122],{"type":37,"value":123},"const",{"type":32,"tag":103,"props":125,"children":127},{"style":126},"--shiki-default:#79B8FF",[128],{"type":37,"value":129}," inputData",{"type":32,"tag":103,"props":131,"children":132},{"style":120},[133],{"type":37,"value":134}," =",{"type":32,"tag":103,"props":136,"children":138},{"style":137},"--shiki-default:#E1E4E8",[139],{"type":37,"value":140}," {\n",{"type":32,"tag":103,"props":142,"children":144},{"class":105,"line":143},3,[145],{"type":32,"tag":103,"props":146,"children":147},{"style":137},[148],{"type":37,"value":149},"  keyword: $json.keyword,\n",{"type":32,"tag":103,"props":151,"children":153},{"class":105,"line":152},4,[154],{"type":32,"tag":103,"props":155,"children":156},{"style":137},[157],{"type":37,"value":158},"  category: $json.category,\n",{"type":32,"tag":103,"props":160,"children":162},{"class":105,"line":161},5,[163],{"type":32,"tag":103,"props":164,"children":165},{"style":137},[166],{"type":37,"value":167},"  date: $json.date\n",{"type":32,"tag":103,"props":169,"children":171},{"class":105,"line":170},6,[172],{"type":32,"tag":103,"props":173,"children":174},{"style":137},[175],{"type":37,"value":176},"};\n",{"type":32,"tag":103,"props":178,"children":180},{"class":105,"line":179},7,[181,185,190,194,200,205,211],{"type":32,"tag":103,"props":182,"children":183},{"style":120},[184],{"type":37,"value":123},{"type":32,"tag":103,"props":186,"children":187},{"style":126},[188],{"type":37,"value":189}," inputHash",{"type":32,"tag":103,"props":191,"children":192},{"style":120},[193],{"type":37,"value":134},{"type":32,"tag":103,"props":195,"children":197},{"style":196},"--shiki-default:#B392F0",[198],{"type":37,"value":199}," require",{"type":32,"tag":103,"props":201,"children":202},{"style":137},[203],{"type":37,"value":204},"(",{"type":32,"tag":103,"props":206,"children":208},{"style":207},"--shiki-default:#9ECBFF",[209],{"type":37,"value":210},"'crypto'",{"type":32,"tag":103,"props":212,"children":213},{"style":137},[214],{"type":37,"value":215},")\n",{"type":32,"tag":103,"props":217,"children":218},{"class":105,"line":26},[219,224,229,233,238],{"type":32,"tag":103,"props":220,"children":221},{"style":137},[222],{"type":37,"value":223},"  .",{"type":32,"tag":103,"props":225,"children":226},{"style":196},[227],{"type":37,"value":228},"createHash",{"type":32,"tag":103,"props":230,"children":231},{"style":137},[232],{"type":37,"value":204},{"type":32,"tag":103,"props":234,"children":235},{"style":207},[236],{"type":37,"value":237},"'sha256'",{"type":32,"tag":103,"props":239,"children":240},{"style":137},[241],{"type":37,"value":215},{"type":32,"tag":103,"props":243,"children":245},{"class":105,"line":244},9,[246,250,255,259,264,269,274],{"type":32,"tag":103,"props":247,"children":248},{"style":137},[249],{"type":37,"value":223},{"type":32,"tag":103,"props":251,"children":252},{"style":196},[253],{"type":37,"value":254},"update",{"type":32,"tag":103,"props":256,"children":257},{"style":137},[258],{"type":37,"value":204},{"type":32,"tag":103,"props":260,"children":261},{"style":126},[262],{"type":37,"value":263},"JSON",{"type":32,"tag":103,"props":265,"children":266},{"style":137},[267],{"type":37,"value":268},".",{"type":32,"tag":103,"props":270,"children":271},{"style":196},[272],{"type":37,"value":273},"stringify",{"type":32,"tag":103,"props":275,"children":276},{"style":137},[277],{"type":37,"value":278},"(inputData))\n",{"type":32,"tag":103,"props":280,"children":282},{"class":105,"line":281},10,[283,287,292,296,301],{"type":32,"tag":103,"props":284,"children":285},{"style":137},[286],{"type":37,"value":223},{"type":32,"tag":103,"props":288,"children":289},{"style":196},[290],{"type":37,"value":291},"digest",{"type":32,"tag":103,"props":293,"children":294},{"style":137},[295],{"type":37,"value":204},{"type":32,"tag":103,"props":297,"children":298},{"style":207},[299],{"type":37,"value":300},"'hex'",{"type":32,"tag":103,"props":302,"children":303},{"style":137},[304],{"type":37,"value":305},");\n",{"type":32,"tag":103,"props":307,"children":309},{"class":105,"line":308},11,[310],{"type":32,"tag":103,"props":311,"children":313},{"emptyLinePlaceholder":312},true,[314],{"type":37,"value":315},"\n",{"type":32,"tag":103,"props":317,"children":319},{"class":105,"line":318},12,[320,325,330,335],{"type":32,"tag":103,"props":321,"children":322},{"style":120},[323],{"type":37,"value":324},"return",{"type":32,"tag":103,"props":326,"children":327},{"style":137},[328],{"type":37,"value":329}," { ",{"type":32,"tag":103,"props":331,"children":332},{"style":120},[333],{"type":37,"value":334},"...",{"type":32,"tag":103,"props":336,"children":337},{"style":137},[338],{"type":37,"value":339},"inputData, inputHash };\n",{"type":32,"tag":33,"props":341,"children":342},{},[343,345,351,353,359,361,367,369,375],{"type":37,"value":344},"Bu hash'i PostgreSQL'de ",{"type":32,"tag":99,"props":346,"children":348},{"className":347},[],[349],{"type":37,"value":350},"workflow_state",{"type":37,"value":352}," tablosuna yazın: ",{"type":32,"tag":99,"props":354,"children":356},{"className":355},[],[357],{"type":37,"value":358},"(inputHash, status, output, createdAt)",{"type":37,"value":360},". Workflow başlangıcında hash'i kontrol edin — ",{"type":32,"tag":99,"props":362,"children":364},{"className":363},[],[365],{"type":37,"value":366},"status=completed",{"type":37,"value":368}," ise Claude node'unu skip edin, cached output'u dönün. ",{"type":32,"tag":99,"props":370,"children":372},{"className":371},[],[373],{"type":37,"value":374},"status=failed",{"type":37,"value":376}," ise retry sayısını increment edin (3'ten fazla retry'da alert gönderin).",{"type":32,"tag":33,"props":378,"children":379},{},[380,382,388,390,396,398,404,406,412,414,420],{"type":37,"value":381},"Claude node'undan sonra output'u yine hash'leyin ve aynı satırı ",{"type":32,"tag":99,"props":383,"children":385},{"className":384},[],[386],{"type":37,"value":387},"UPDATE",{"type":37,"value":389}," edin: ",{"type":32,"tag":99,"props":391,"children":393},{"className":392},[],[394],{"type":37,"value":395},"status=completed, output={hash}, completedAt=NOW()",{"type":37,"value":397},". Crash olursa satır ",{"type":32,"tag":99,"props":399,"children":401},{"className":400},[],[402],{"type":37,"value":403},"status=in_progress",{"type":37,"value":405}," kalır — cron job her 5 dakikada ",{"type":32,"tag":99,"props":407,"children":409},{"className":408},[],[410],{"type":37,"value":411},"in_progress AND createdAt \u003C NOW() - INTERVAL '10 minutes'",{"type":37,"value":413}," satırları ",{"type":32,"tag":99,"props":415,"children":417},{"className":416},[],[418],{"type":37,"value":419},"failed",{"type":37,"value":421}," yapar ve Slack'e haber verir.",{"type":32,"tag":33,"props":423,"children":424},{},[425],{"type":37,"value":426},"Bu yapı şu garantiyi verir: aynı keyword + kategori + tarih kombinasyonu için workflow kaç kez tetiklense de, Claude'a 1 kez sorulur. 247. keyword'de crash olunca 248-500 arası işlenir, ilk 246 dokunulmaz. Cost kontrol altındadır (Claude'un output pricing'i prompt'tan pahalıdır — duplicate call pahalıya mal olur).",{"type":32,"tag":428,"props":429,"children":431},"h3",{"id":430},"checkpoint-state-ile-kısmi-kurtarma",[432],{"type":37,"value":433},"Checkpoint State ile Kısmi Kurtarma",{"type":32,"tag":33,"props":435,"children":436},{},[437,439,445,447,453],{"type":37,"value":438},"500 keyword'lü batch işlemde idempotency tek başına yetmez — tüm batch'i atomik yapamazsınız (Claude rate limit'e takılırsınız). Çözüm: batch'i 50'lik chunk'lara bölün, her chunk'tan sonra checkpoint yazın. n8n'de ",{"type":32,"tag":99,"props":440,"children":442},{"className":441},[],[443],{"type":37,"value":444},"Loop Over Items",{"type":37,"value":446}," node'u kullanıyorsanız, her 50 item'da bir ",{"type":32,"tag":99,"props":448,"children":450},{"className":449},[],[451],{"type":37,"value":452},"Write Checkpoint",{"type":37,"value":454}," node'u ekleyin:",{"type":32,"tag":92,"props":456,"children":458},{"className":94,"code":457,"language":96,"meta":16,"style":16},"\u002F\u002F Function node — checkpoint yazma\nconst processedCount = $json.processedCount || 0;\nconst newCheckpoint = processedCount + $json.items.length;\n\n\u002F\u002F Supabase veya Redis'e yaz\nawait fetch('https:\u002F\u002Fapi.supabase.io\u002Frest\u002Fv1\u002Fcheckpoints', {\n  method: 'POST',\n  headers: { 'apikey': 'XXX', 'Content-Type': 'application\u002Fjson' },\n  body: JSON.stringify({\n    workflowId: $workflow.id,\n    runId: $execution.id,\n    processedCount: newCheckpoint\n  })\n});\n\nreturn { processedCount: newCheckpoint };\n",[459],{"type":32,"tag":99,"props":460,"children":461},{"__ignoreMap":16},[462,470,506,546,553,561,588,606,653,678,686,694,702,711,720,728],{"type":32,"tag":103,"props":463,"children":464},{"class":105,"line":106},[465],{"type":32,"tag":103,"props":466,"children":467},{"style":110},[468],{"type":37,"value":469},"\u002F\u002F Function node — checkpoint yazma\n",{"type":32,"tag":103,"props":471,"children":472},{"class":105,"line":116},[473,477,482,486,491,496,501],{"type":32,"tag":103,"props":474,"children":475},{"style":120},[476],{"type":37,"value":123},{"type":32,"tag":103,"props":478,"children":479},{"style":126},[480],{"type":37,"value":481}," processedCount",{"type":32,"tag":103,"props":483,"children":484},{"style":120},[485],{"type":37,"value":134},{"type":32,"tag":103,"props":487,"children":488},{"style":137},[489],{"type":37,"value":490}," $json.processedCount ",{"type":32,"tag":103,"props":492,"children":493},{"style":120},[494],{"type":37,"value":495},"||",{"type":32,"tag":103,"props":497,"children":498},{"style":126},[499],{"type":37,"value":500}," 0",{"type":32,"tag":103,"props":502,"children":503},{"style":137},[504],{"type":37,"value":505},";\n",{"type":32,"tag":103,"props":507,"children":508},{"class":105,"line":143},[509,513,518,522,527,532,537,542],{"type":32,"tag":103,"props":510,"children":511},{"style":120},[512],{"type":37,"value":123},{"type":32,"tag":103,"props":514,"children":515},{"style":126},[516],{"type":37,"value":517}," newCheckpoint",{"type":32,"tag":103,"props":519,"children":520},{"style":120},[521],{"type":37,"value":134},{"type":32,"tag":103,"props":523,"children":524},{"style":137},[525],{"type":37,"value":526}," processedCount ",{"type":32,"tag":103,"props":528,"children":529},{"style":120},[530],{"type":37,"value":531},"+",{"type":32,"tag":103,"props":533,"children":534},{"style":137},[535],{"type":37,"value":536}," $json.items.",{"type":32,"tag":103,"props":538,"children":539},{"style":126},[540],{"type":37,"value":541},"length",{"type":32,"tag":103,"props":543,"children":544},{"style":137},[545],{"type":37,"value":505},{"type":32,"tag":103,"props":547,"children":548},{"class":105,"line":152},[549],{"type":32,"tag":103,"props":550,"children":551},{"emptyLinePlaceholder":312},[552],{"type":37,"value":315},{"type":32,"tag":103,"props":554,"children":555},{"class":105,"line":161},[556],{"type":32,"tag":103,"props":557,"children":558},{"style":110},[559],{"type":37,"value":560},"\u002F\u002F Supabase veya Redis'e yaz\n",{"type":32,"tag":103,"props":562,"children":563},{"class":105,"line":170},[564,569,574,578,583],{"type":32,"tag":103,"props":565,"children":566},{"style":120},[567],{"type":37,"value":568},"await",{"type":32,"tag":103,"props":570,"children":571},{"style":196},[572],{"type":37,"value":573}," fetch",{"type":32,"tag":103,"props":575,"children":576},{"style":137},[577],{"type":37,"value":204},{"type":32,"tag":103,"props":579,"children":580},{"style":207},[581],{"type":37,"value":582},"'https:\u002F\u002Fapi.supabase.io\u002Frest\u002Fv1\u002Fcheckpoints'",{"type":32,"tag":103,"props":584,"children":585},{"style":137},[586],{"type":37,"value":587},", {\n",{"type":32,"tag":103,"props":589,"children":590},{"class":105,"line":179},[591,596,601],{"type":32,"tag":103,"props":592,"children":593},{"style":137},[594],{"type":37,"value":595},"  method: ",{"type":32,"tag":103,"props":597,"children":598},{"style":207},[599],{"type":37,"value":600},"'POST'",{"type":32,"tag":103,"props":602,"children":603},{"style":137},[604],{"type":37,"value":605},",\n",{"type":32,"tag":103,"props":607,"children":608},{"class":105,"line":26},[609,614,619,624,629,634,639,643,648],{"type":32,"tag":103,"props":610,"children":611},{"style":137},[612],{"type":37,"value":613},"  headers: { ",{"type":32,"tag":103,"props":615,"children":616},{"style":207},[617],{"type":37,"value":618},"'apikey'",{"type":32,"tag":103,"props":620,"children":621},{"style":137},[622],{"type":37,"value":623},": ",{"type":32,"tag":103,"props":625,"children":626},{"style":207},[627],{"type":37,"value":628},"'XXX'",{"type":32,"tag":103,"props":630,"children":631},{"style":137},[632],{"type":37,"value":633},", ",{"type":32,"tag":103,"props":635,"children":636},{"style":207},[637],{"type":37,"value":638},"'Content-Type'",{"type":32,"tag":103,"props":640,"children":641},{"style":137},[642],{"type":37,"value":623},{"type":32,"tag":103,"props":644,"children":645},{"style":207},[646],{"type":37,"value":647},"'application\u002Fjson'",{"type":32,"tag":103,"props":649,"children":650},{"style":137},[651],{"type":37,"value":652}," },\n",{"type":32,"tag":103,"props":654,"children":655},{"class":105,"line":244},[656,661,665,669,673],{"type":32,"tag":103,"props":657,"children":658},{"style":137},[659],{"type":37,"value":660},"  body: ",{"type":32,"tag":103,"props":662,"children":663},{"style":126},[664],{"type":37,"value":263},{"type":32,"tag":103,"props":666,"children":667},{"style":137},[668],{"type":37,"value":268},{"type":32,"tag":103,"props":670,"children":671},{"style":196},[672],{"type":37,"value":273},{"type":32,"tag":103,"props":674,"children":675},{"style":137},[676],{"type":37,"value":677},"({\n",{"type":32,"tag":103,"props":679,"children":680},{"class":105,"line":281},[681],{"type":32,"tag":103,"props":682,"children":683},{"style":137},[684],{"type":37,"value":685},"    workflowId: $workflow.id,\n",{"type":32,"tag":103,"props":687,"children":688},{"class":105,"line":308},[689],{"type":32,"tag":103,"props":690,"children":691},{"style":137},[692],{"type":37,"value":693},"    runId: $execution.id,\n",{"type":32,"tag":103,"props":695,"children":696},{"class":105,"line":318},[697],{"type":32,"tag":103,"props":698,"children":699},{"style":137},[700],{"type":37,"value":701},"    processedCount: newCheckpoint\n",{"type":32,"tag":103,"props":703,"children":705},{"class":105,"line":704},13,[706],{"type":32,"tag":103,"props":707,"children":708},{"style":137},[709],{"type":37,"value":710},"  })\n",{"type":32,"tag":103,"props":712,"children":714},{"class":105,"line":713},14,[715],{"type":32,"tag":103,"props":716,"children":717},{"style":137},[718],{"type":37,"value":719},"});\n",{"type":32,"tag":103,"props":721,"children":723},{"class":105,"line":722},15,[724],{"type":32,"tag":103,"props":725,"children":726},{"emptyLinePlaceholder":312},[727],{"type":37,"value":315},{"type":32,"tag":103,"props":729,"children":731},{"class":105,"line":730},16,[732,736],{"type":32,"tag":103,"props":733,"children":734},{"style":120},[735],{"type":37,"value":324},{"type":32,"tag":103,"props":737,"children":738},{"style":137},[739],{"type":37,"value":740}," { processedCount: newCheckpoint };\n",{"type":32,"tag":33,"props":742,"children":743},{},[744,746,752],{"type":37,"value":745},"Workflow başlangıcında checkpoint'i oku — eğer ",{"type":32,"tag":99,"props":747,"children":749},{"className":748},[],[750],{"type":37,"value":751},"processedCount > 0",{"type":37,"value":753}," ise input array'inden ilk N elemanı skip et. Böylece 247'de crash olunca 0-246 tekrar işlenmez, 247'den devam edilir.",{"type":32,"tag":33,"props":755,"children":756},{},[757],{"type":37,"value":758},"Alternatif: her chunk'tan sonra output'u incremental olarak dosyaya yaz (S3'e append). Crash olunca partial file'ı oku, son satırdan devam et. Bu yaklaşım idempotency ile uyumlu değil (aynı run'da farklı satır sayısı üretir) ama cost-sensitive batch işlemlerde kabul edilebilir. Tradeoff: determinizm vs. hız.",{"type":32,"tag":48,"props":760,"children":762},{"id":761},"hata-yönetimi-stratejileri",[763],{"type":37,"value":764},"Hata Yönetimi Stratejileri",{"type":32,"tag":33,"props":766,"children":767},{},[768,770,776],{"type":37,"value":769},"Claude API'nin iki hata sınıfı var: transient (rate limit, timeout) ve persistent (invalid prompt, safety filter). Transient hataları exponential backoff ile retry edin — n8n'de ",{"type":32,"tag":99,"props":771,"children":773},{"className":772},[],[774],{"type":37,"value":775},"Retry On Fail",{"type":37,"value":777}," ayarı var ama o naive retry (hemen tekrar dener, rate limit'i kötüleştirir). Custom retry logic yazın:",{"type":32,"tag":92,"props":779,"children":781},{"className":94,"code":780,"language":96,"meta":16,"style":16},"\u002F\u002F Function node — exponential backoff\nconst maxRetries = 5;\nconst retryCount = $json.retryCount || 0;\n\nif (retryCount >= maxRetries) {\n  throw new Error('Max retries exceeded');\n}\n\nconst delay = Math.pow(2, retryCount) * 1000; \u002F\u002F 1s, 2s, 4s, 8s, 16s\nawait new Promise(resolve => setTimeout(resolve, delay));\n\n\u002F\u002F Claude node'unu tetikle\nreturn { ...input, retryCount: retryCount + 1 };\n",[782],{"type":32,"tag":99,"props":783,"children":784},{"__ignoreMap":16},[785,793,818,851,858,881,912,920,927,987,1028,1035,1043],{"type":32,"tag":103,"props":786,"children":787},{"class":105,"line":106},[788],{"type":32,"tag":103,"props":789,"children":790},{"style":110},[791],{"type":37,"value":792},"\u002F\u002F Function node — exponential backoff\n",{"type":32,"tag":103,"props":794,"children":795},{"class":105,"line":116},[796,800,805,809,814],{"type":32,"tag":103,"props":797,"children":798},{"style":120},[799],{"type":37,"value":123},{"type":32,"tag":103,"props":801,"children":802},{"style":126},[803],{"type":37,"value":804}," maxRetries",{"type":32,"tag":103,"props":806,"children":807},{"style":120},[808],{"type":37,"value":134},{"type":32,"tag":103,"props":810,"children":811},{"style":126},[812],{"type":37,"value":813}," 5",{"type":32,"tag":103,"props":815,"children":816},{"style":137},[817],{"type":37,"value":505},{"type":32,"tag":103,"props":819,"children":820},{"class":105,"line":143},[821,825,830,834,839,843,847],{"type":32,"tag":103,"props":822,"children":823},{"style":120},[824],{"type":37,"value":123},{"type":32,"tag":103,"props":826,"children":827},{"style":126},[828],{"type":37,"value":829}," retryCount",{"type":32,"tag":103,"props":831,"children":832},{"style":120},[833],{"type":37,"value":134},{"type":32,"tag":103,"props":835,"children":836},{"style":137},[837],{"type":37,"value":838}," $json.retryCount ",{"type":32,"tag":103,"props":840,"children":841},{"style":120},[842],{"type":37,"value":495},{"type":32,"tag":103,"props":844,"children":845},{"style":126},[846],{"type":37,"value":500},{"type":32,"tag":103,"props":848,"children":849},{"style":137},[850],{"type":37,"value":505},{"type":32,"tag":103,"props":852,"children":853},{"class":105,"line":152},[854],{"type":32,"tag":103,"props":855,"children":856},{"emptyLinePlaceholder":312},[857],{"type":37,"value":315},{"type":32,"tag":103,"props":859,"children":860},{"class":105,"line":161},[861,866,871,876],{"type":32,"tag":103,"props":862,"children":863},{"style":120},[864],{"type":37,"value":865},"if",{"type":32,"tag":103,"props":867,"children":868},{"style":137},[869],{"type":37,"value":870}," (retryCount ",{"type":32,"tag":103,"props":872,"children":873},{"style":120},[874],{"type":37,"value":875},">=",{"type":32,"tag":103,"props":877,"children":878},{"style":137},[879],{"type":37,"value":880}," maxRetries) {\n",{"type":32,"tag":103,"props":882,"children":883},{"class":105,"line":170},[884,889,894,899,903,908],{"type":32,"tag":103,"props":885,"children":886},{"style":120},[887],{"type":37,"value":888},"  throw",{"type":32,"tag":103,"props":890,"children":891},{"style":120},[892],{"type":37,"value":893}," new",{"type":32,"tag":103,"props":895,"children":896},{"style":196},[897],{"type":37,"value":898}," Error",{"type":32,"tag":103,"props":900,"children":901},{"style":137},[902],{"type":37,"value":204},{"type":32,"tag":103,"props":904,"children":905},{"style":207},[906],{"type":37,"value":907},"'Max retries exceeded'",{"type":32,"tag":103,"props":909,"children":910},{"style":137},[911],{"type":37,"value":305},{"type":32,"tag":103,"props":913,"children":914},{"class":105,"line":179},[915],{"type":32,"tag":103,"props":916,"children":917},{"style":137},[918],{"type":37,"value":919},"}\n",{"type":32,"tag":103,"props":921,"children":922},{"class":105,"line":26},[923],{"type":32,"tag":103,"props":924,"children":925},{"emptyLinePlaceholder":312},[926],{"type":37,"value":315},{"type":32,"tag":103,"props":928,"children":929},{"class":105,"line":244},[930,934,939,943,948,953,957,962,967,972,977,982],{"type":32,"tag":103,"props":931,"children":932},{"style":120},[933],{"type":37,"value":123},{"type":32,"tag":103,"props":935,"children":936},{"style":126},[937],{"type":37,"value":938}," delay",{"type":32,"tag":103,"props":940,"children":941},{"style":120},[942],{"type":37,"value":134},{"type":32,"tag":103,"props":944,"children":945},{"style":137},[946],{"type":37,"value":947}," Math.",{"type":32,"tag":103,"props":949,"children":950},{"style":196},[951],{"type":37,"value":952},"pow",{"type":32,"tag":103,"props":954,"children":955},{"style":137},[956],{"type":37,"value":204},{"type":32,"tag":103,"props":958,"children":959},{"style":126},[960],{"type":37,"value":961},"2",{"type":32,"tag":103,"props":963,"children":964},{"style":137},[965],{"type":37,"value":966},", retryCount) ",{"type":32,"tag":103,"props":968,"children":969},{"style":120},[970],{"type":37,"value":971},"*",{"type":32,"tag":103,"props":973,"children":974},{"style":126},[975],{"type":37,"value":976}," 1000",{"type":32,"tag":103,"props":978,"children":979},{"style":137},[980],{"type":37,"value":981},"; ",{"type":32,"tag":103,"props":983,"children":984},{"style":110},[985],{"type":37,"value":986},"\u002F\u002F 1s, 2s, 4s, 8s, 16s\n",{"type":32,"tag":103,"props":988,"children":989},{"class":105,"line":281},[990,994,998,1003,1007,1013,1018,1023],{"type":32,"tag":103,"props":991,"children":992},{"style":120},[993],{"type":37,"value":568},{"type":32,"tag":103,"props":995,"children":996},{"style":120},[997],{"type":37,"value":893},{"type":32,"tag":103,"props":999,"children":1000},{"style":126},[1001],{"type":37,"value":1002}," Promise",{"type":32,"tag":103,"props":1004,"children":1005},{"style":137},[1006],{"type":37,"value":204},{"type":32,"tag":103,"props":1008,"children":1010},{"style":1009},"--shiki-default:#FFAB70",[1011],{"type":37,"value":1012},"resolve",{"type":32,"tag":103,"props":1014,"children":1015},{"style":120},[1016],{"type":37,"value":1017}," =>",{"type":32,"tag":103,"props":1019,"children":1020},{"style":196},[1021],{"type":37,"value":1022}," setTimeout",{"type":32,"tag":103,"props":1024,"children":1025},{"style":137},[1026],{"type":37,"value":1027},"(resolve, delay));\n",{"type":32,"tag":103,"props":1029,"children":1030},{"class":105,"line":308},[1031],{"type":32,"tag":103,"props":1032,"children":1033},{"emptyLinePlaceholder":312},[1034],{"type":37,"value":315},{"type":32,"tag":103,"props":1036,"children":1037},{"class":105,"line":318},[1038],{"type":32,"tag":103,"props":1039,"children":1040},{"style":110},[1041],{"type":37,"value":1042},"\u002F\u002F Claude node'unu tetikle\n",{"type":32,"tag":103,"props":1044,"children":1045},{"class":105,"line":704},[1046,1050,1054,1058,1063,1067,1072],{"type":32,"tag":103,"props":1047,"children":1048},{"style":120},[1049],{"type":37,"value":324},{"type":32,"tag":103,"props":1051,"children":1052},{"style":137},[1053],{"type":37,"value":329},{"type":32,"tag":103,"props":1055,"children":1056},{"style":120},[1057],{"type":37,"value":334},{"type":32,"tag":103,"props":1059,"children":1060},{"style":137},[1061],{"type":37,"value":1062},"input, retryCount: retryCount ",{"type":32,"tag":103,"props":1064,"children":1065},{"style":120},[1066],{"type":37,"value":531},{"type":32,"tag":103,"props":1068,"children":1069},{"style":126},[1070],{"type":37,"value":1071}," 1",{"type":32,"tag":103,"props":1073,"children":1074},{"style":137},[1075],{"type":37,"value":1076}," };\n",{"type":32,"tag":33,"props":1078,"children":1079},{},[1080,1082,1088],{"type":37,"value":1081},"Persistent hatalarda retry mantıksız — prompt'ta sorun var. Bu durumda error'u log'layıp skip edin. n8n'de ",{"type":32,"tag":99,"props":1083,"children":1085},{"className":1084},[],[1086],{"type":37,"value":1087},"Continue On Fail",{"type":37,"value":1089}," açın, sonraki node'da error check yapın:",{"type":32,"tag":92,"props":1091,"children":1093},{"className":94,"code":1092,"language":96,"meta":16,"style":16},"\u002F\u002F IF node — error check\nif ($json.error && $json.error.type === 'invalid_request_error') {\n  \u002F\u002F Slack'e haber ver, DB'ye `status=skipped` yaz\n  return { skipReason: $json.error.message };\n}\n",[1094],{"type":32,"tag":99,"props":1095,"children":1096},{"__ignoreMap":16},[1097,1105,1142,1150,1163],{"type":32,"tag":103,"props":1098,"children":1099},{"class":105,"line":106},[1100],{"type":32,"tag":103,"props":1101,"children":1102},{"style":110},[1103],{"type":37,"value":1104},"\u002F\u002F IF node — error check\n",{"type":32,"tag":103,"props":1106,"children":1107},{"class":105,"line":116},[1108,1112,1117,1122,1127,1132,1137],{"type":32,"tag":103,"props":1109,"children":1110},{"style":120},[1111],{"type":37,"value":865},{"type":32,"tag":103,"props":1113,"children":1114},{"style":137},[1115],{"type":37,"value":1116}," ($json.error ",{"type":32,"tag":103,"props":1118,"children":1119},{"style":120},[1120],{"type":37,"value":1121},"&&",{"type":32,"tag":103,"props":1123,"children":1124},{"style":137},[1125],{"type":37,"value":1126}," $json.error.type ",{"type":32,"tag":103,"props":1128,"children":1129},{"style":120},[1130],{"type":37,"value":1131},"===",{"type":32,"tag":103,"props":1133,"children":1134},{"style":207},[1135],{"type":37,"value":1136}," 'invalid_request_error'",{"type":32,"tag":103,"props":1138,"children":1139},{"style":137},[1140],{"type":37,"value":1141},") {\n",{"type":32,"tag":103,"props":1143,"children":1144},{"class":105,"line":143},[1145],{"type":32,"tag":103,"props":1146,"children":1147},{"style":110},[1148],{"type":37,"value":1149},"  \u002F\u002F Slack'e haber ver, DB'ye `status=skipped` yaz\n",{"type":32,"tag":103,"props":1151,"children":1152},{"class":105,"line":152},[1153,1158],{"type":32,"tag":103,"props":1154,"children":1155},{"style":120},[1156],{"type":37,"value":1157},"  return",{"type":32,"tag":103,"props":1159,"children":1160},{"style":137},[1161],{"type":37,"value":1162}," { skipReason: $json.error.message };\n",{"type":32,"tag":103,"props":1164,"children":1165},{"class":105,"line":161},[1166],{"type":32,"tag":103,"props":1167,"children":1168},{"style":137},[1169],{"type":37,"value":919},{"type":32,"tag":33,"props":1171,"children":1172},{},[1173],{"type":37,"value":1174},"Claude'un output'u bazen prompt'a uymuyor — örneğin frontmatter eksik, markdown bozuk. Bu durumda validation node ekleyin: regex ile frontmatter kontrolü, title\u002Fdescription length kontrolü. Validation fail ederse Claude'u yeniden çağırın ama bu sefer prompt'a \"PREVIOUS OUTPUT WAS INVALID\" context'i ekleyin (Claude kendi hatasını düzeltir, genelde 2. denemede doğru üretir).",{"type":32,"tag":92,"props":1176,"children":1178},{"className":94,"code":1177,"language":96,"meta":16,"style":16},"\u002F\u002F Validation node\nconst output = $json.claudeOutput;\nconst hasFrontmatter = \u002F^---\\ntitle:\u002F.test(output);\nconst titleLength = output.match(\u002Ftitle: \"(.+?)\"\u002F)?.[1]?.length || 0;\n\nif (!hasFrontmatter || titleLength > 60) {\n  return { \n    validationFailed: true, \n    reason: !hasFrontmatter ? 'missing_frontmatter' : 'title_too_long'\n  };\n}\n\nreturn { valid: true };\n",[1179],{"type":32,"tag":99,"props":1180,"children":1181},{"__ignoreMap":16},[1182,1190,1211,1272,1361,1368,1413,1425,1443,1479,1487,1494,1501],{"type":32,"tag":103,"props":1183,"children":1184},{"class":105,"line":106},[1185],{"type":32,"tag":103,"props":1186,"children":1187},{"style":110},[1188],{"type":37,"value":1189},"\u002F\u002F Validation node\n",{"type":32,"tag":103,"props":1191,"children":1192},{"class":105,"line":116},[1193,1197,1202,1206],{"type":32,"tag":103,"props":1194,"children":1195},{"style":120},[1196],{"type":37,"value":123},{"type":32,"tag":103,"props":1198,"children":1199},{"style":126},[1200],{"type":37,"value":1201}," output",{"type":32,"tag":103,"props":1203,"children":1204},{"style":120},[1205],{"type":37,"value":134},{"type":32,"tag":103,"props":1207,"children":1208},{"style":137},[1209],{"type":37,"value":1210}," $json.claudeOutput;\n",{"type":32,"tag":103,"props":1212,"children":1213},{"class":105,"line":143},[1214,1218,1223,1227,1232,1237,1243,1248,1253,1258,1262,1267],{"type":32,"tag":103,"props":1215,"children":1216},{"style":120},[1217],{"type":37,"value":123},{"type":32,"tag":103,"props":1219,"children":1220},{"style":126},[1221],{"type":37,"value":1222}," hasFrontmatter",{"type":32,"tag":103,"props":1224,"children":1225},{"style":120},[1226],{"type":37,"value":134},{"type":32,"tag":103,"props":1228,"children":1229},{"style":207},[1230],{"type":37,"value":1231}," \u002F",{"type":32,"tag":103,"props":1233,"children":1234},{"style":120},[1235],{"type":37,"value":1236},"^",{"type":32,"tag":103,"props":1238,"children":1240},{"style":1239},"--shiki-default:#DBEDFF",[1241],{"type":37,"value":1242},"---",{"type":32,"tag":103,"props":1244,"children":1245},{"style":126},[1246],{"type":37,"value":1247},"\\n",{"type":32,"tag":103,"props":1249,"children":1250},{"style":1239},[1251],{"type":37,"value":1252},"title:",{"type":32,"tag":103,"props":1254,"children":1255},{"style":207},[1256],{"type":37,"value":1257},"\u002F",{"type":32,"tag":103,"props":1259,"children":1260},{"style":137},[1261],{"type":37,"value":268},{"type":32,"tag":103,"props":1263,"children":1264},{"style":196},[1265],{"type":37,"value":1266},"test",{"type":32,"tag":103,"props":1268,"children":1269},{"style":137},[1270],{"type":37,"value":1271},"(output);\n",{"type":32,"tag":103,"props":1273,"children":1274},{"class":105,"line":152},[1275,1279,1284,1288,1293,1298,1302,1306,1311,1315,1320,1325,1329,1334,1339,1344,1348,1353,1357],{"type":32,"tag":103,"props":1276,"children":1277},{"style":120},[1278],{"type":37,"value":123},{"type":32,"tag":103,"props":1280,"children":1281},{"style":126},[1282],{"type":37,"value":1283}," titleLength",{"type":32,"tag":103,"props":1285,"children":1286},{"style":120},[1287],{"type":37,"value":134},{"type":32,"tag":103,"props":1289,"children":1290},{"style":137},[1291],{"type":37,"value":1292}," output.",{"type":32,"tag":103,"props":1294,"children":1295},{"style":196},[1296],{"type":37,"value":1297},"match",{"type":32,"tag":103,"props":1299,"children":1300},{"style":137},[1301],{"type":37,"value":204},{"type":32,"tag":103,"props":1303,"children":1304},{"style":207},[1305],{"type":37,"value":1257},{"type":32,"tag":103,"props":1307,"children":1308},{"style":1239},[1309],{"type":37,"value":1310},"title: \"(",{"type":32,"tag":103,"props":1312,"children":1313},{"style":126},[1314],{"type":37,"value":268},{"type":32,"tag":103,"props":1316,"children":1317},{"style":120},[1318],{"type":37,"value":1319},"+?",{"type":32,"tag":103,"props":1321,"children":1322},{"style":1239},[1323],{"type":37,"value":1324},")\"",{"type":32,"tag":103,"props":1326,"children":1327},{"style":207},[1328],{"type":37,"value":1257},{"type":32,"tag":103,"props":1330,"children":1331},{"style":137},[1332],{"type":37,"value":1333},")?.[",{"type":32,"tag":103,"props":1335,"children":1336},{"style":126},[1337],{"type":37,"value":1338},"1",{"type":32,"tag":103,"props":1340,"children":1341},{"style":137},[1342],{"type":37,"value":1343},"]?.",{"type":32,"tag":103,"props":1345,"children":1346},{"style":126},[1347],{"type":37,"value":541},{"type":32,"tag":103,"props":1349,"children":1350},{"style":120},[1351],{"type":37,"value":1352}," ||",{"type":32,"tag":103,"props":1354,"children":1355},{"style":126},[1356],{"type":37,"value":500},{"type":32,"tag":103,"props":1358,"children":1359},{"style":137},[1360],{"type":37,"value":505},{"type":32,"tag":103,"props":1362,"children":1363},{"class":105,"line":161},[1364],{"type":32,"tag":103,"props":1365,"children":1366},{"emptyLinePlaceholder":312},[1367],{"type":37,"value":315},{"type":32,"tag":103,"props":1369,"children":1370},{"class":105,"line":170},[1371,1375,1380,1385,1390,1394,1399,1404,1409],{"type":32,"tag":103,"props":1372,"children":1373},{"style":120},[1374],{"type":37,"value":865},{"type":32,"tag":103,"props":1376,"children":1377},{"style":137},[1378],{"type":37,"value":1379}," (",{"type":32,"tag":103,"props":1381,"children":1382},{"style":120},[1383],{"type":37,"value":1384},"!",{"type":32,"tag":103,"props":1386,"children":1387},{"style":137},[1388],{"type":37,"value":1389},"hasFrontmatter ",{"type":32,"tag":103,"props":1391,"children":1392},{"style":120},[1393],{"type":37,"value":495},{"type":32,"tag":103,"props":1395,"children":1396},{"style":137},[1397],{"type":37,"value":1398}," titleLength ",{"type":32,"tag":103,"props":1400,"children":1401},{"style":120},[1402],{"type":37,"value":1403},">",{"type":32,"tag":103,"props":1405,"children":1406},{"style":126},[1407],{"type":37,"value":1408}," 60",{"type":32,"tag":103,"props":1410,"children":1411},{"style":137},[1412],{"type":37,"value":1141},{"type":32,"tag":103,"props":1414,"children":1415},{"class":105,"line":179},[1416,1420],{"type":32,"tag":103,"props":1417,"children":1418},{"style":120},[1419],{"type":37,"value":1157},{"type":32,"tag":103,"props":1421,"children":1422},{"style":137},[1423],{"type":37,"value":1424}," { \n",{"type":32,"tag":103,"props":1426,"children":1427},{"class":105,"line":26},[1428,1433,1438],{"type":32,"tag":103,"props":1429,"children":1430},{"style":137},[1431],{"type":37,"value":1432},"    validationFailed: ",{"type":32,"tag":103,"props":1434,"children":1435},{"style":126},[1436],{"type":37,"value":1437},"true",{"type":32,"tag":103,"props":1439,"children":1440},{"style":137},[1441],{"type":37,"value":1442},", \n",{"type":32,"tag":103,"props":1444,"children":1445},{"class":105,"line":244},[1446,1451,1455,1459,1464,1469,1474],{"type":32,"tag":103,"props":1447,"children":1448},{"style":137},[1449],{"type":37,"value":1450},"    reason: ",{"type":32,"tag":103,"props":1452,"children":1453},{"style":120},[1454],{"type":37,"value":1384},{"type":32,"tag":103,"props":1456,"children":1457},{"style":137},[1458],{"type":37,"value":1389},{"type":32,"tag":103,"props":1460,"children":1461},{"style":120},[1462],{"type":37,"value":1463},"?",{"type":32,"tag":103,"props":1465,"children":1466},{"style":207},[1467],{"type":37,"value":1468}," 'missing_frontmatter'",{"type":32,"tag":103,"props":1470,"children":1471},{"style":120},[1472],{"type":37,"value":1473}," :",{"type":32,"tag":103,"props":1475,"children":1476},{"style":207},[1477],{"type":37,"value":1478}," 'title_too_long'\n",{"type":32,"tag":103,"props":1480,"children":1481},{"class":105,"line":281},[1482],{"type":32,"tag":103,"props":1483,"children":1484},{"style":137},[1485],{"type":37,"value":1486},"  };\n",{"type":32,"tag":103,"props":1488,"children":1489},{"class":105,"line":308},[1490],{"type":32,"tag":103,"props":1491,"children":1492},{"style":137},[1493],{"type":37,"value":919},{"type":32,"tag":103,"props":1495,"children":1496},{"class":105,"line":318},[1497],{"type":32,"tag":103,"props":1498,"children":1499},{"emptyLinePlaceholder":312},[1500],{"type":37,"value":315},{"type":32,"tag":103,"props":1502,"children":1503},{"class":105,"line":704},[1504,1508,1513,1517],{"type":32,"tag":103,"props":1505,"children":1506},{"style":120},[1507],{"type":37,"value":324},{"type":32,"tag":103,"props":1509,"children":1510},{"style":137},[1511],{"type":37,"value":1512}," { valid: ",{"type":32,"tag":103,"props":1514,"children":1515},{"style":126},[1516],{"type":37,"value":1437},{"type":32,"tag":103,"props":1518,"children":1519},{"style":137},[1520],{"type":37,"value":1076},{"type":32,"tag":33,"props":1522,"children":1523},{},[1524],{"type":37,"value":1525},"Validation fail rate'i %5'in üstündeyse prompt'ta yapısal sorun var demektir — o zaman prompt mühendisliği yapın, validation logic'i gevşetmeyin (output kalitesi düşer).",{"type":32,"tag":48,"props":1527,"children":1529},{"id":1528},"productionda-gözlemlenebilirlik",[1530],{"type":37,"value":1531},"Production'da Gözlemlenebilirlik",{"type":32,"tag":33,"props":1533,"children":1534},{},[1535],{"type":37,"value":1536},"Otonom workflow'u production'a aldıktan sonra izlemeniz gereken metrikler:",{"type":32,"tag":1538,"props":1539,"children":1540},"table",{},[1541,1565],{"type":32,"tag":1542,"props":1543,"children":1544},"thead",{},[1545],{"type":32,"tag":1546,"props":1547,"children":1548},"tr",{},[1549,1555,1560],{"type":32,"tag":1550,"props":1551,"children":1552},"th",{},[1553],{"type":37,"value":1554},"Metrik",{"type":32,"tag":1550,"props":1556,"children":1557},{},[1558],{"type":37,"value":1559},"Eşik",{"type":32,"tag":1550,"props":1561,"children":1562},{},[1563],{"type":37,"value":1564},"Aksiyun",{"type":32,"tag":1566,"props":1567,"children":1568},"tbody",{},[1569,1588,1606,1624,1642],{"type":32,"tag":1546,"props":1570,"children":1571},{},[1572,1578,1583],{"type":32,"tag":1573,"props":1574,"children":1575},"td",{},[1576],{"type":37,"value":1577},"Retry rate",{"type":32,"tag":1573,"props":1579,"children":1580},{},[1581],{"type":37,"value":1582},">10%",{"type":32,"tag":1573,"props":1584,"children":1585},{},[1586],{"type":37,"value":1587},"Prompt\u002FAPI config gözden geçir",{"type":32,"tag":1546,"props":1589,"children":1590},{},[1591,1596,1601],{"type":32,"tag":1573,"props":1592,"children":1593},{},[1594],{"type":37,"value":1595},"Validation fail rate",{"type":32,"tag":1573,"props":1597,"children":1598},{},[1599],{"type":37,"value":1600},">5%",{"type":32,"tag":1573,"props":1602,"children":1603},{},[1604],{"type":37,"value":1605},"Prompt refactor",{"type":32,"tag":1546,"props":1607,"children":1608},{},[1609,1614,1619],{"type":32,"tag":1573,"props":1610,"children":1611},{},[1612],{"type":37,"value":1613},"Avg. completion tokens",{"type":32,"tag":1573,"props":1615,"children":1616},{},[1617],{"type":37,"value":1618},"+%20 artış",{"type":32,"tag":1573,"props":1620,"children":1621},{},[1622],{"type":37,"value":1623},"Model degişikliği veya input creep (context'e gereksiz veri ekleniyor)",{"type":32,"tag":1546,"props":1625,"children":1626},{},[1627,1632,1637],{"type":32,"tag":1573,"props":1628,"children":1629},{},[1630],{"type":37,"value":1631},"Execution time P95",{"type":32,"tag":1573,"props":1633,"children":1634},{},[1635],{"type":37,"value":1636},">120s",{"type":32,"tag":1573,"props":1638,"children":1639},{},[1640],{"type":37,"value":1641},"Batch size küçült veya parallelization ekle",{"type":32,"tag":1546,"props":1643,"children":1644},{},[1645,1650,1655],{"type":32,"tag":1573,"props":1646,"children":1647},{},[1648],{"type":37,"value":1649},"Cost per output",{"type":32,"tag":1573,"props":1651,"children":1652},{},[1653],{"type":37,"value":1654},"+%30 artış",{"type":32,"tag":1573,"props":1656,"children":1657},{},[1658],{"type":37,"value":1659},"Token usage anomaly — cache miss mi, yoksa input inflation mı?",{"type":32,"tag":33,"props":1661,"children":1662},{},[1663,1665,1671,1673,1680],{"type":37,"value":1664},"n8n'de bu metrikleri toplamak için her workflow'un sonuna ",{"type":32,"tag":99,"props":1666,"children":1668},{"className":1667},[],[1669],{"type":37,"value":1670},"Log Metrics",{"type":37,"value":1672}," node'u ekleyin — structured JSON olarak DataDog\u002FGrafana'ya POST edin. Alternatif: workflow telemetrisi için ",{"type":32,"tag":70,"props":1674,"children":1677},{"href":1675,"rel":1676},"https:\u002F\u002Fwww.roibase.com.tr\u002Ftr\u002Ffirstparty",[74],[1678],{"type":37,"value":1679},"First-Party Veri & Ölçüm Mimarisi",{"type":37,"value":1681},"'nden faydalanın — workflow event'lerini first-party veri olarak toplayıp attribution pipeline'ına besleyin (hangi keyword'den üretilen içerik ne kadar trafik getirdi?).",{"type":32,"tag":33,"props":1683,"children":1684},{},[1685],{"type":37,"value":1686},"Alerting için passive log analizi yerine active health check yapın: her 15 dakikada bir test input'u workflow'a gönderin (synthetic monitoring). Test input'unun expected output'unu biliyorsunuz — eğer farklı output gelirse (veya timeout olursa) incident açın. Bu, production traffic'i etkilemeden system health'ini gösterir.",{"type":32,"tag":48,"props":1688,"children":1690},{"id":1689},"otomasyon-maturity-seviyeleri",[1691],{"type":37,"value":1692},"Otomasyon Maturity Seviyeleri",{"type":32,"tag":33,"props":1694,"children":1695},{},[1696],{"type":37,"value":1697},"Pazarlama operasyonlarında AI workflow'larının maturity seviyesi şöyle kategorize edilir:",{"type":32,"tag":33,"props":1699,"children":1700},{},[1701,1707],{"type":32,"tag":1702,"props":1703,"children":1704},"strong",{},[1705],{"type":37,"value":1706},"Seviye 1 — Assisted:",{"type":37,"value":1708}," Workflow sonucu human review gerektiriyor. Örnek: Claude başlık önerisi üretiyor, insan seçiyor. Otonom değil.",{"type":32,"tag":33,"props":1710,"children":1711},{},[1712,1717],{"type":32,"tag":1702,"props":1713,"children":1714},{},[1715],{"type":37,"value":1716},"Seviye 2 — Autonomous with fallback:",{"type":37,"value":1718}," Workflow kendi başına çalışıyor ama critical error'da human müdahale ediyor. Örnek: validation fail edince Slack'e düşüyor, insan düzeltiyor. Çoğu production workflow bu seviyede.",{"type":32,"tag":33,"props":1720,"children":1721},{},[1722,1727],{"type":32,"tag":1702,"props":1723,"children":1724},{},[1725],{"type":37,"value":1726},"Seviye 3 — Fully autonomous:",{"type":37,"value":1728}," Workflow hata durumunda bile insan müdahale etmeden kurtarıyor. Örnek: validation fail edince farklı prompt ile retry, 3 retry'dan sonra skip ve log. İdeal durum ama %100'e ulaşmak mümkün değil — edge case'ler her zaman olur.",{"type":32,"tag":33,"props":1730,"children":1731},{},[1732,1734,1739],{"type":37,"value":1733},"Roibase operasyonlarında ",{"type":32,"tag":1702,"props":1735,"children":1736},{},[1737],{"type":37,"value":1738},"Seviye 2.5",{"type":37,"value":1740}," hedefliyoruz: critical path'te human-in-the-loop yok ama dashboard'da anomaly alerting var. Örneğin günde 100 blog outline üretiyorsak, validation fail rate aniden %20'ye çıktığında bildirim alıyoruz — ama işlem durmaz, başarılı olan 80 outline yayınlanır. Bu yaklaşım velocity ile quality arasında optimal tradeoff sağlıyor.",{"type":32,"tag":48,"props":1742,"children":1744},{"id":1743},"llm-workflowunda-cost-kontrol",[1745],{"type":37,"value":1746},"LLM Workflow'unda Cost Kontrol",{"type":32,"tag":33,"props":1748,"children":1749},{},[1750],{"type":37,"value":1751},"Claude Sonnet 4 pricing (Mayıs 2026): $3\u002FM input token, $15\u002FM output token. 1500 kelimelik blog outline üretimi yaklaşık 2K output token = $0.03. Günde 100 outline = $3\u002Fgün = $90\u002Fay. Ciddi bir maliyet değil ama idempotency olmadan (duplicate call'larla) 2-3 katına çıkabilir.",{"type":32,"tag":33,"props":1753,"children":1754},{},[1755,1757,1763,1765,1771],{"type":37,"value":1756},"Cost optimization için cache stratejisi: n8n'de Redis node kullanın. Claude'a göndermeden önce ",{"type":32,"tag":99,"props":1758,"children":1760},{"className":1759},[],[1761],{"type":37,"value":1762},"GET {inputHash}",{"type":37,"value":1764}," yapın — varsa sonucu dönün (hit), yoksa Claude'u çağırıp ",{"type":32,"tag":99,"props":1766,"children":1768},{"className":1767},[],[1769],{"type":37,"value":1770},"SET {inputHash} {output} EX 2592000",{"type":37,"value":1772}," (30 gün TTL) yapın. Bu yaklaşımla aynı keyword\u002Fkategori kombinasyonu tekrar geldiğinde (örneğin aylık refresh job'ında) $0 maliyet.",{"type":32,"tag":33,"props":1774,"children":1775},{},[1776,1778,1784],{"type":37,"value":1777},"Alternatif: prompt caching kullanın (Claude API'de ",{"type":32,"tag":99,"props":1779,"children":1781},{"className":1780},[],[1782],{"type":37,"value":1783},"system",{"type":37,"value":1785}," role cache'leniyor). Eğer system prompt'unuz 10K token ve her call'da aynıysa (ki master prompt'unuz bu), ilk call'da cache'leniyor, sonraki call'larda input token cost %90 düşüyor. n8n'de aynı execution içinde birden fazla Claude node varsa, ilk node'da system prompt'u cache'leyin, sonrakiler otomatik kullanır.",{"type":32,"tag":33,"props":1787,"children":1788},{},[1789,1791,1797,1799,1804],{"type":37,"value":1790},"Cost attribution için BigQuery'de her workflow run'ının token breakdown'unu saklayın: ",{"type":32,"tag":99,"props":1792,"children":1794},{"className":1793},[],[1795],{"type":37,"value":1796},"(workflowId, runId, inputTokens, cachedTokens, outputTokens, cost)",{"type":37,"value":1798},". Dashboard'da kategori\u002Fkeyword bazında maliyet analizi yapın — hangi kategoride ortalama output token'ı yüksek? Prompt'u daraltabilir miyiz? Bu tür analiz için ",{"type":32,"tag":70,"props":1800,"children":1802},{"href":72,"rel":1801},[74],[1803],{"type":37,"value":77},{"type":37,"value":1805}," pipeline'ı gerekli — raw log'dan actionable insight çıkartmak tek başına query yazmakla olmuyor.",{"type":32,"tag":48,"props":1807,"children":1809},{"id":1808},"sonraki-adım-eval-pipelineı-kurmak",[1810],{"type":37,"value":1811},"Sonraki Adım: Eval Pipeline'ı Kurmak",{"type":32,"tag":33,"props":1813,"children":1814},{},[1815],{"type":37,"value":1816},"Otonom workflow production'a alındıktan sonra asıl sorun başlıyor: output kalitesi zamanla düşüyor mu? Prompt değişikliği performansı artırdı mı, düşürdü mü? Bunu anlamak için LLM eval pipeline'ı gerekiyor — Claude'un ürettiği içeriği başka bir LLM (veya rule-based scorer) ile değerlendirin. Örneğin her outline'ı GPT-4o'ya \"Bu başlık SEO-friendly mi? 1-10 puan ver\" diye sorun, sonuçları time series olarak kaydedin. Prompt değişikliği deploy ettikten sonra ortalama score düşüyorsa rollback yapın.",{"type":32,"tag":33,"props":1818,"children":1819},{},[1820,1822,1827],{"type":37,"value":1821},"Eval pipeline'ı başka yazının konusu ama burada önemli nokta: otomasyon sadece \"işi yaptırmak\" değil, işin ",{"type":32,"tag":40,"props":1823,"children":1824},{},[1825],{"type":37,"value":1826},"kalitesini",{"type":37,"value":1828}," sürekli ölçmek. Aksi halde autonomous system sessizce bozulur — insan müdahale etmediği için kimse farketmez. Production-grade AI operasyonlarının gerçek maliyeti buradan geliyor: sadece API cost değil, eval + monitoring infrastructure. Bunu baştan planlayın.",{"type":32,"tag":1830,"props":1831,"children":1832},"style",{},[1833],{"type":37,"value":1834},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":16,"searchDepth":143,"depth":143,"links":1836},[1837,1838,1841,1842,1843,1844,1845],{"id":50,"depth":116,"text":53},{"id":82,"depth":116,"text":85,"children":1839},[1840],{"id":430,"depth":143,"text":433},{"id":761,"depth":116,"text":764},{"id":1528,"depth":116,"text":1531},{"id":1689,"depth":116,"text":1692},{"id":1743,"depth":116,"text":1746},{"id":1808,"depth":116,"text":1811},"markdown","content:tr:ai:n8n-claude-api-pazarlama-operasyonunda-otonomi.md","content","tr\u002Fai\u002Fn8n-claude-api-pazarlama-operasyonunda-otonomi.md","tr\u002Fai\u002Fn8n-claude-api-pazarlama-operasyonunda-otonomi","md",1778911442457]