{
  "name": "My workflow 15",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        -8464,
        704
      ],
      "id": "e820c452-e89b-4c66-8455-43298952f7da",
      "name": "Webhook"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "c5ebb284-7dc3-487c-a415-57d9c571ca21",
              "name": "topic",
              "value": "={{ $json.body.topic }}",
              "type": "string"
            },
            {
              "id": "e164d12c-46cd-44a5-8fa1-5dd52a0613ce",
              "name": "keyword",
              "value": "={{ $json.body.keyword }}",
              "type": "string"
            },
            {
              "id": "d9b05bdd-3047-4b80-bcab-d9722a8075b6",
              "name": "word_count",
              "value": "={{ $json.body.wordcount }}",
              "type": "string"
            },
            {
              "id": "ac75f4e6-7da1-460b-83d1-ae5c1813ae90",
              "name": "site_url",
              "value": "={{ $json.body.siteUrl }}",
              "type": "string"
            },
            {
              "id": "9cc038f3-16f9-48bf-bc27-efd8f4ba8876",
              "name": "language",
              "value": "={{ $json.body.language }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -8304,
        704
      ],
      "id": "919cfbc6-a26d-4d5e-8541-2f58f2388201",
      "name": "Edit Fields"
    },
    {
      "parameters": {
        "url": "https://serpapi.com/search",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "serpApi",
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "q",
              "value": "={{ $('Edit Fields').first().json.topic }}"
            },
            {
              "name": "hl",
              "value": "=tr"
            },
            {
              "name": "api_key"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        -5184,
        1024
      ],
      "id": "41851c8e-ef72-4d42-9d2e-2302306b23dd",
      "name": "HTTP Request",
      "retryOnFail": true,
      "waitBetweenTries": 100,
      "maxTries": 2
    },
    {
      "parameters": {
        "fieldToSplitOut": "related_questions, related_searches, organic_results",
        "options": {}
      },
      "type": "n8n-nodes-base.splitOut",
      "typeVersion": 1,
      "position": [
        -5040,
        1024
      ],
      "id": "0254aabf-49c7-4336-a53f-93ee35eb81ac",
      "name": "Split Out",
      "executeOnce": true
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "2d2b8c05-5cc0-4c4e-8f83-bcf3772cc66f",
              "name": "question",
              "value": "={{ $json.related_questions.question }}",
              "type": "string"
            },
            {
              "id": "93c72374-1428-4d9d-8750-ae7cdc5bea94",
              "name": "searches",
              "value": "={{ $json.related_searches.query }}",
              "type": "string"
            },
            {
              "id": "dac966c6-c2e4-4284-8abe-f568e1c6d0e9",
              "name": "related_questions_baglanti",
              "value": "={{ $json.organic_results.link }}",
              "type": "string"
            },
            {
              "name": "api_key",
              "value": "REPLACE_WITH_YOUR_SERPAPI_KEY"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -4896,
        1024
      ],
      "id": "f7924cc4-1327-400e-bf6b-7cef9c11907e",
      "name": "Edit Fields1"
    },
    {
      "parameters": {
        "fieldsToAggregate": {
          "fieldToAggregate": [
            {
              "fieldToAggregate": "question",
              "renameField": true,
              "outputFieldName": "question_array"
            },
            {
              "fieldToAggregate": "searches",
              "renameField": true,
              "outputFieldName": "searches_array"
            },
            {
              "fieldToAggregate": "related_questions_baglanti",
              "renameField": true,
              "outputFieldName": "dis_baglanti_array"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.aggregate",
      "typeVersion": 1,
      "position": [
        -4752,
        1024
      ],
      "id": "fa894523-9b50-4f0e-bc54-44f6691a918e",
      "name": "Aggregate",
      "executeOnce": false
    },
    {
      "parameters": {
        "sessionIdType": "customKey"
      },
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "typeVersion": 1.3,
      "position": [
        -4336,
        1264
      ],
      "id": "1278b90c-7ac7-4c08-9f98-6713f0c2f80a",
      "name": "Window Buffer Memory2"
    },
    {
      "parameters": {
        "jsCode": "// Agent'\u0131n \u00fcretti\u011fi ham \u00e7\u0131kt\u0131 (string format\u0131nda)\nconst agentOutput = $input.first().json.output;\n\n// Her sat\u0131r\u0131 ay\u0131r ve gereksiz bo\u015fluklar\u0131 temizle\nconst lines = agentOutput\n    //.split(/\\n|,|\\./) // Hem yeni sat\u0131r (\\n) hem de virg\u00fcl (,) ile ay\u0131r\n    .split(/\\n|\\./) // Art\u0131k sadece \\n ve . ile ay\u0131r\u0131yor\n    .map(line => line.trim()) // Her elemandaki gereksiz bo\u015fluklar\u0131 temizle\n    .filter(line => line.length > 0); // Bo\u015f sat\u0131rlar\u0131 kald\u0131r\n\n// Ba\u015fl\u0131klar\u0131 temizle ve numaralar\u0131 kald\u0131r\nconst newSubheadings = lines.map(line => {\n    return line.replace(/^\\d+\\.\\s*\\*\\*(.*?)\\*\\*\\s*$/, \"$1\").trim();\n});\n\n// \u00c7\u0131k\u0131\u015f\u0131 JSON format\u0131nda d\u00f6nd\u00fcr\nreturn newSubheadings.map(title => ({ json: { title } }));\n"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -4144,
        1024
      ],
      "id": "7ae9b618-e609-4990-8dde-09608d4ba9da",
      "name": "Code4"
    },
    {
      "parameters": {
        "fieldsToAggregate": {
          "fieldToAggregate": [
            {
              "fieldToAggregate": "title",
              "renameField": true,
              "outputFieldName": "newSubheading_array"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.aggregate",
      "typeVersion": 1,
      "position": [
        -3984,
        1024
      ],
      "id": "e0a436dc-0241-4a2e-be84-867bfee90b18",
      "name": "Aggregate1"
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "n8n-nodes-base.splitInBatches",
      "typeVersion": 3,
      "position": [
        -3664,
        1024
      ],
      "id": "e330178e-465d-4dc2-ae61-6d98494daa22",
      "name": "Loop Over Items1"
    },
    {
      "parameters": {
        "fieldToSplitOut": "newSubheading_array",
        "options": {}
      },
      "type": "n8n-nodes-base.splitOut",
      "typeVersion": 1,
      "position": [
        -3824,
        1024
      ],
      "id": "ce9d2b75-6643-4def-b463-d231027d6b69",
      "name": "Split Out2"
    },
    {
      "parameters": {},
      "type": "n8n-nodes-base.noOp",
      "name": "Replace Me",
      "typeVersion": 1,
      "position": [
        -1984,
        1376
      ],
      "id": "404cba0d-3e02-4305-8c5d-e26875b53c77"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Ana Konu: {{ $('Edit Fields').first().json.topic }}\nDil: {{ $('Edit Fields').first().json.language }}\nAlt Ba\u015fl\u0131k: {{ $json.newSubheading_array }}\nOdak Anahtar Kelime: {{ $('Edit Fields').first().json.keyword }}\nE\u015f Anlaml\u0131 Anahtar Kelimeler: {{ $('Es_anlamilar').first().json.synonyms }}\n\nKURALLAR\n\u00d6ncelikle belirtilen odak anahtar kelimeyi ({{ $('Edit Fields').first().json.keyword }}) i\u00e7erikte s\u0131k s\u0131k kullan.\n\n- Belirtilen alt ba\u015fl\u0131k do\u011frudan i\u00e7erik ba\u015fl\u0131\u011f\u0131 olarak kullan\u0131lacakt\u0131r ve alt ba\u015fl\u0131kta bulunan kelimelerin ilk harfleri b\u00fcy\u00fck harf olmal\u0131.\n- Konunun d\u0131\u015f\u0131na \u00e7\u0131k\u0131lmayacakt\u0131r. Ana konu ne ise, i\u00e7erik bu \u00e7er\u00e7evede kalacak ve ilgisiz detaylara girilmeyecektir.  \n- \u00dcretilen i\u00e7erik kesinlikle giri\u015f-geli\u015fme-sonu\u00e7 yap\u0131s\u0131na sahip olacak. \u00d6nce giri\u015f c\u00fcmleleri olu\u015fturulacak, sonras\u0131nda geli\u015fme c\u00fcmleleri ve en son paragraf\u0131 sonuca ba\u011flayan sonu\u00e7 c\u00fcmleleri olu\u015fturulacak.\n- Makale dili do\u011frudan kullan\u0131c\u0131ya hitap etmelidir: \u201cSize g\u00f6sterece\u011fim bu teknikle\u2026\u201d gibi c\u00fcmleler kullan\u0131lacak. C\u00fcmleler buna uygun \u015fekilde olu\u015fturulacak.\n- Belirtilen konu i\u00e7inde dengesiz veya a\u015f\u0131r\u0131 vurgu yap\u0131lmayacakt\u0131r. T\u00fcm alt ba\u015fl\u0131klar, ilgili terimler ve kavramlar orant\u0131l\u0131 ve dengeli bir \u015fekilde ele al\u0131nacakt\u0131r. \n- \u00dcretilen i\u00e7erikte {{ $('Edit Fields').first().json.keyword }} bu Odak Anahtar Kelime en az 1 kez kullan\u0131lmal\u0131. Yani i\u00e7erikte bulunan c\u00fcmlelerin i\u00e7erisinde en az 1 kez odak anahtar kelimeye yer verilmeli.\n- {{ $('Es_anlamilar').first().json.synonyms }} bu e\u015f anlaml\u0131 anahtar kelimelerin tam olarak ayn\u0131lar\u0131na i\u00e7erikte uygun c\u00fcmlelerde yer verilecek. Odak anahtar kelime ve e\u015f anlaml\u0131 anahtar kelimeler i\u00e7erikte s\u0131kl\u0131kla kullan\u0131lmal\u0131. Ancak odak anahtar kelimenin kullan\u0131m\u0131 e\u015f anlaml\u0131 anahtar kelimelere g\u00f6re daha fazla olmal\u0131.\n- E\u015f anlaml\u0131 kelimeler veya odak anahtar kelime c\u00fcmlenin ba\u015f\u0131nda de\u011filse bu kelimeler c\u00fcmlede yaz\u0131m kurallar\u0131na uygun \u015fekilde k\u00fc\u00e7\u00fck harflerle kullan\u0131lacak. Gereksiz yere b\u00fcy\u00fck harfler kullan\u0131lmayacak.\n- T\u00fcm e\u015f anlaml\u0131 anahtar kelimeler ayn\u0131 anda tek bir paragrafta kullan\u0131lmayacakt\u0131r.  \n- E\u011fer belirli bir terim veya alt ba\u015fl\u0131k \u00f6ne \u00e7\u0131kar\u0131lacaksa, konunun do\u011fas\u0131na uygun \u015fekilde ak\u0131c\u0131 bir anlat\u0131m i\u00e7inde yer almal\u0131d\u0131r.\n- Konu i\u00e7erisinde e\u011fer bir lokasyon belirtilmi\u015fse, belirtilen lokasyon d\u0131\u015f\u0131nda ba\u015fka hi\u00e7bir \u015fehir, il\u00e7e, b\u00f6lge veya \u00fclke ad\u0131 ge\u00e7meyecek. E\u011fer verilen lokasyon \u0130stanbul ise \u2018\u0130stanbul\u2019un il\u00e7eleri\u2019 dahil hi\u00e7bir il\u00e7e ad\u0131 i\u00e7erikte yer almayacak. E\u011fer bu kurala uyulmazsa, i\u00e7erik tamamen reddedilecektir.\n  \u2705 Do\u011fru \u00d6rnek: \"\u0130stanbul, T\u00fcrkiye'nin en b\u00fcy\u00fck \u015fehridir. \u015eehirde tarihi ve k\u00fclt\u00fcrel bir\u00e7ok yap\u0131 bulunmaktad\u0131r.\"\n  \u274c Yanl\u0131\u015f \u00d6rnek: \"\u0130stanbul\u2019un il\u00e7eleri aras\u0131nda Be\u015fikta\u015f, Kad\u0131k\u00f6y ve Fatih gibi yerler vard\u0131r.\"\n- Bu alt ba\u015fl\u0131k i\u00e7in en az iki detayl\u0131 paragraf olu\u015fturulacakt\u0131r.\n- Her paragrafta bulunan kelime say\u0131s\u0131 tam olarak 200 kelime olmal\u0131d\u0131r.\n- Her paragraftaki kelime say\u0131s\u0131n\u0131 sayan ve kontrol eden bir saya\u00e7 tutulacak ve bir paragraftaki kelime say\u0131s\u0131 200'e ula\u015fmad\u0131\u011f\u0131 s\u00fcrece paragrafa yeni kelimeler eklenmeye devam edilecektir.\n- Kelime say\u0131m\u0131 \u015fu \u015fekilde yap\u0131lacak: Metin bo\u015fluklardan b\u00f6l\u00fcnecek ve t\u00fcm bo\u015f olmayan par\u00e7alar say\u0131lacakt\u0131r. Noktalama i\u015faretleri ve \u00f6zel karakterler kelime olarak say\u0131lmayacakt\u0131r.   \n- Yeni bir paragraf olu\u015fturulmadan \u00f6nce mevcut paragraf kelime say\u0131s\u0131na tam olarak uyacak \u015fekilde tamamlanmal\u0131d\u0131r.  \n- Sonu\u00e7 olarak, \u00fcretilen i\u00e7erikte bulunan toplam kelime say\u0131s\u0131 minimum 200 olmal\u0131d\u0131r.\n- Olu\u015fturulan i\u00e7eri\u011fe paragraflardan ba\u011f\u0131ms\u0131z, gereksiz veya sa\u00e7ma hi\u00e7bir ifade eklenmeyecektir. \u00d6rne\u011fin (200 kelime) veya (Toplam kelime say\u0131s\u0131: ) gibi alakas\u0131z ifadeler \u00fcretilen i\u00e7erikte yer almayacakt\u0131r.\n- Makale dili do\u011frudan kullan\u0131c\u0131ya hitap etmelidir. Anlat\u0131m ikinci tekil \u015fah\u0131s (sen/Siz) kullan\u0131larak yap\u0131lmal\u0131. Okuyucuyla do\u011frudan ileti\u015fim kurulmal\u0131.\n- \u00d6rne\u011fin: \u201cSize g\u00f6sterece\u011fim bu teknikle h\u0131zl\u0131ca sonu\u00e7 alabilirsiniz.\u201d veya \u201cBu yaz\u0131da \u00f6\u011frenecekleriniz sayesinde siz de kendi projenizi olu\u015fturabileceksiniz.\u201d\n- C\u00fcmlelerde \"ben\" ve \"siz\" gibi zamirler kullan\u0131larak ki\u015fisel bir anlat\u0131m tarz\u0131 tercih edilmelidir. L\u00fctfen t\u00fcm c\u00fcmleleri bu \u00fcsluba uygun \u015fekilde olu\u015ftur. Resmiyet dozaj\u0131 orta seviyede olabilir; s\u0131cak ama g\u00fcven veren bir anlat\u0131m tercih et.\n\nSomut Rakamlar, Y\u00fczdeler ve \u0130statistikler Ekleme S\u00fcreci\n- Makale i\u00e7eri\u011fine, ana konu ({{ $('Webhook').first().json.body.topic }}) ve alt ba\u015fl\u0131k  ile uyumlu somut rakamlar, y\u00fczdeler ve istatistikler ekle.\n- Veriler, ger\u00e7ek\u00e7i ve mant\u0131kl\u0131 olmal\u0131; ger\u00e7ek verilere dayal\u0131 gibi g\u00f6r\u00fcnmeli ancak veri kayna\u011f\u0131 belirtilmemeli (\u00f6rne\u011fin, \"Bir ara\u015ft\u0131rmaya g\u00f6re...\" gibi ifadeler kullan).\n- Verileri, konuya g\u00f6re esnek bir \u015fekilde \u00fcret: \u00d6rne\u011fin,\n  - M\u00fczik Teknolojileri: \"2023\u2019te kullan\u0131c\u0131lar 1.5 milyon \u015fark\u0131 \u00fcretir.\"\n  - Sa\u011fl\u0131k: \"Hastalar 2023\u2019te tele-t\u0131p hizmetini %40 oran\u0131nda tercih eder.\"\n  - Spor: \"Ko\u015fucular\u0131n %70\u2019i 2023\u2019te 30 ya\u015f alt\u0131ndad\u0131r.\"\n  - E\u011fitim: \"\u00d6\u011frenciler \u00e7evrimi\u00e7i derslerde %55 daha verimli \u00f6\u011frenir.\"\n- Veriler, i\u00e7eri\u011fin ak\u0131\u015f\u0131n\u0131 bozmadan, do\u011fal ve anlaml\u0131 bir \u015fekilde paragraflara entegre edilsin.\n- Her alt ba\u015fl\u0131k i\u00e7in olu\u015fturulan iki paragraftan yaln\u0131zca ikinci paragrafta somut bir rakam, y\u00fczde veya istatistik kullan; ilk paragraf ak\u0131c\u0131 anlat\u0131m\u0131 korusun.\n- Veriyi, ikinci paragrafta ak\u0131c\u0131 bir \u015fekilde bir c\u00fcmle i\u00e7inde ekle; liste veya maddeleme tan\u0131mlamas\u0131 yapma.\n- Veriler, odak anahtar kelime ( {{ $('Edit Fields').first().json.keyword }}) ve e\u015f anlaml\u0131 anahtar kelimelerle ({{ $('Es_anlamilar').first().json.synonyms }}) uyumlu olsun.\n\n*\u0130\u00e7erik \u00fcretirken a\u015fa\u011f\u0131daki okunabilirlik kurallar\u0131n\u0131 kesinlikle uygula:\n1. **Etken \u00c7at\u0131 Kullan\u0131m\u0131:**\n   - Yaln\u0131zca Etken \u00c7at\u0131 Kullan ve -ebilmek, -abilmek ekleri i\u00e7eren fiilleri kullanma.\n   - T\u00fcm c\u00fcmleler **etken \u00e7at\u0131da** yaz\u0131lacak, edilgen \u00e7at\u0131 kullan\u0131lmayacak.\n   - Edilgen \u00e7at\u0131, fiilin \"-il-\", \"-in-\", \"-\u0131l-\", \"-n-\" ekleriyle pasif hale geldi\u011fi durumdur. \u00d6rne\u011fin: \"yap\u0131l\u0131r\", \"sunulur\", \"dinletilir\", \"sa\u011flan\u0131r\", \"tasarlanm\u0131\u015ft\u0131r\", \"yap\u0131labilir\" gibi fiiller kullan\u0131lmayacak.\n   - Bunun yerine etken \u00e7at\u0131 fiilleri kullan: \"yapar\", \"sunar\", \"dinletir\", \"sa\u011flar\", \"tasarlar\", \"yapar\" gibi.\n   - **\u00d6zel Talimat: -ebilmek, -abilmek Eklerinden Kesinlikle Ka\u00e7\u0131n:**\n     - \"-ebilmek\", \"-abilmek\" ekleriyle biten fiiller (\u00f6rne\u011fin, \"yapabilir\", \"olu\u015fturabilir\", \"kald\u0131rabilir\", \"geli\u015ftirebilir\") kesinlikle kullan\u0131lmayacak. Yoast SEO, bu ekleri yanl\u0131\u015fl\u0131kla edilgen \u00e7at\u0131 olarak alg\u0131lar. Bunun yerine daha do\u011frudan etken \u00e7at\u0131 fiilleri kullan veya c\u00fcmleyi yeniden d\u00fczenle. \u00d6rne\u011fin:\n       - Yanl\u0131\u015f: \"Kullan\u0131c\u0131lar \u015fark\u0131 s\u00f6zlerini yazabilir.\" \u2192 Do\u011fru: \"Kullan\u0131c\u0131lar \u015fark\u0131 s\u00f6zlerini yazar.\"\n       - Yanl\u0131\u015f: \"Kullan\u0131c\u0131lar vokalleri kald\u0131rabilir.\" \u2192 Do\u011fru: \"Kullan\u0131c\u0131lar vokalleri kald\u0131r\u0131r.\"\n     - E\u011fer \"-ebilmek\", \"-abilmek\" ekini kald\u0131rmak anlam\u0131 de\u011fi\u015ftiriyorsa, c\u00fcmleyi yeniden d\u00fczenleyerek etken \u00e7at\u0131ya uygun hale getir. \u00d6rne\u011fin:\n       - Yanl\u0131\u015f: \"Kullan\u0131c\u0131lar \u015fark\u0131 s\u00f6zlerini yazabilir.\" \u2192 Do\u011fru: \"Kullan\u0131c\u0131lar \u015fark\u0131 s\u00f6zlerini yazma imkan\u0131na sahiptir.\" veya \"Kullan\u0131c\u0131lar \u015fark\u0131 s\u00f6zlerini yazmay\u0131 ba\u015far\u0131r.\"\n   - Edilgen \u00e7at\u0131 ve etken \u00e7at\u0131 fark\u0131n\u0131 anlaman i\u00e7in a\u015fa\u011f\u0131daki \u00f6rnekleri rehber al ve c\u00fcmlelerini etken \u00e7at\u0131da kur:\n     - Edilgen: \"Bu k\u0131sa s\u00fcrede olu\u015fturulan eserler farkl\u0131 m\u00fczik t\u00fcrlerinde yap\u0131labilir.\" \u2192 Etken: \"Yapay zeka bu k\u0131sa s\u00fcrede olu\u015fturulan eserleri farkl\u0131 m\u00fczik t\u00fcrlerinde yapar.\"\n     - Edilgen: \"Bu ara\u00e7lar \u015fark\u0131lardan vokalleri \u00e7\u0131karmak i\u00e7in tasarlanm\u0131\u015ft\u0131r.\" \u2192 Etken: \"Geli\u015ftiriciler bu ara\u00e7lar\u0131 \u015fark\u0131lardan vokalleri \u00e7\u0131karmak i\u00e7in tasarlar.\"\n     - Edilgen: \"Kullan\u0131\u015fl\u0131 ve etkili bir vokal ay\u0131rma program\u0131 genellikle farkl\u0131 fiyat aral\u0131klar\u0131nda sunulur.\" \u2192 Etken: \"\u015eirket kullan\u0131\u015fl\u0131 ve etkili bir vokal ay\u0131rma program\u0131n\u0131 genellikle farkl\u0131 fiyat aral\u0131klar\u0131nda sunar.\"\n     - Edilgen: \"Bu t\u00fcr uygulamalar ile m\u00fczikseverlere daha iyi deneyimler sa\u011flan\u0131r.\" \u2192 Etken: \"Bu t\u00fcr uygulamalar m\u00fczikseverlere daha iyi deneyimler sa\u011flar.\"\n     - Edilgen: \"\u015eark\u0131lar yapay zeka ile bestelenir.\" \u2192 Etken: \"Yapay zeka \u015fark\u0131lar\u0131 besteler.\"\n     - Edilgen: \"Kullan\u0131c\u0131lar\u0131n performanslar\u0131 yapay zeka taraf\u0131ndan de\u011ferlendirilir.\" \u2192 Etken: \"Yapay zeka kullan\u0131c\u0131lar\u0131n performanslar\u0131n\u0131 de\u011ferlendirir.\"\n   - Dikkat Edilecek Durumlar:\n     - \"-ebilmek\", \"-abilmek\" ekli fiillerden (\u00f6rne\u011fin, \"yapabilir\", \"geli\u015ftirebilir\") kesinlikle ka\u00e7\u0131n. Bu ekleri i\u00e7eren fiilleri c\u00fcmle i\u00e7erisinde kullanma.\n     - \"bulunmaktad\u0131r\", \"sunmaktad\u0131r\" etken \u00e7at\u0131l\u0131d\u0131r ve bu gibi fiiller kullan\u0131labilir; ama \"bulunulmaktad\u0131r\", \"sunulmaktad\u0131r\" edilgen \u00e7at\u0131l\u0131d\u0131r, bu fiiller kullan\u0131lmayacak.\n   **Nas\u0131l Uygulayacaks\u0131n:**\n   - Her c\u00fcmleyi yazarken fiilin etken \u00e7at\u0131da oldu\u011fundan emin ol.\n   - Kesinlikle \"-ebilmek\", \"-abilmek\" ekli fiiller kullanma (\u00f6rne\u011fin, \"yapabilir\" yerine \"yapar\", \"geli\u015ftirebilir\" yerine \"geli\u015ftirir\").\n   - E\u011fer \"-ebilmek\", \"-abilmek\" ekini kullanmadan c\u00fcmle kurmak anlam\u0131 de\u011fi\u015ftiriyorsa, c\u00fcmleyi yeniden d\u00fczenleyerek etken \u00e7at\u0131ya uygun hale getir (\u00f6rne\u011fin, \"yazabilir\" yerine \"yazma imkan\u0131na sahiptir\" veya \"yazmay\u0131 ba\u015far\u0131r\").\n   - Yukar\u0131daki \u00f6rnekleri rehber al, edilgen \u00e7at\u0131 fiili g\u00f6r\u00fcrsen (\u00f6rne\u011fin, \"-il-\", \"-in-\", \"-ul\", \"-\u0131l\" ekleri varsa) c\u00fcmleyi etken \u00e7at\u0131ya \u00e7evir.\n   - Fiilin \u00e7at\u0131s\u0131ndan emin de\u011filsen, k\u00f6k\u00fcn\u00fc ve eklerini kontrol et: \"-il-\", \"-in-\", \"-ul\", \"-\u0131l\" gibi ekler varsa edilgen \u00e7at\u0131l\u0131d\u0131r, kullanma.\n\n2. **Ayn\u0131 Kelimeyle Ba\u015flayan Ard\u0131\u015f\u0131k C\u00fcmleler:**\n   - \u00dcretilen i\u00e7erikte ard\u0131\u015f\u0131k c\u00fcmleler **asla ayn\u0131 kelimeyle ba\u015flamayacak**.\n   - Ard\u0131\u015f\u0131k c\u00fcmlelerde ilk s\u00f6zc\u00fck kontrol\u00fc yap\u0131l\u0131rken i\u00e7eri\u011fin ba\u015fl\u0131\u011f\u0131 ile i\u00e7eri\u011fin ilk c\u00fcmlesi \u00f6zellikle kontrol edilecek. Ba\u015fl\u0131\u011f\u0131n ilk kelimesi ile i\u00e7eri\u011fin ilk kelimesi ayn\u0131 olmayacak. E\u011fer ayn\u0131 ise i\u00e7eri\u011fin ilk c\u00fcmlesi de\u011fi\u015ftirilecek. Ba\u015fl\u0131k asla de\u011fi\u015ftirilmemeli, bu durumda uyumluluk i\u00e7in d\u00fczenlemeler i\u00e7eri\u011fin ilk c\u00fcmlesinde sa\u011flanmal\u0131.\n     - Yanl\u0131\u015f: Ba\u015fl\u0131k: \"Yapay Zeka Teknolojileri\", \u0130\u00e7eri\u011fin ilk c\u00fcmlesi: \"Yapay zeka g\u00fcn\u00fcm\u00fczde s\u0131kl\u0131kla kullan\u0131lmaktad\u0131r.\" \u2192 Do\u011fru: \"Yapay Zeka Teknolojileri\", \u0130\u00e7eri\u011fin ilk c\u00fcmlesi: \"G\u00fcn\u00fcm\u00fczde s\u0131kl\u0131kla kullan\u0131lan teknolojiler aras\u0131nda yapay zeka da yer almaktad\u0131r.\"\n   - Her c\u00fcmle \u00fcretildi\u011finde, bir \u00f6nceki c\u00fcmlenin ilk kelimesiyle kar\u015f\u0131la\u015ft\u0131r\u0131lacak ve ayn\u0131 kelimeyle ba\u015flamad\u0131\u011f\u0131 kontrol edilecek.\n   - E\u011fer ayn\u0131 kelimeyle ba\u015fl\u0131yorsa, c\u00fcmle yeniden d\u00fczenlenecek veya farkl\u0131 bir kelimeyle ba\u015flat\u0131lacak.\n   - \u00d6rnek:\n     - Yanl\u0131\u015f: \"Yapay zeka harika bir deneyim sunar. Yapay zeka ile \u015fark\u0131 s\u00f6ylemek keyiflidir.\"\n     - Do\u011fru: \"Yapay zeka harika bir deneyim sunar. \u015eark\u0131 s\u00f6ylemek bu teknolojiyle \u00e7ok keyiflidir.\"\n\n3. **C\u00fcmle Uzunlu\u011fu:**\n   - \u00dcretilecek her c\u00fcmle maksimum 15 kelimeden olu\u015facak. 15 kelimeden daha fazla say\u0131da kelime i\u00e7eren c\u00fcmleler asla \u00fcretilmeyecek.\n\n4. **Ge\u00e7i\u015f Kelimeleri:**\n   - \u00dcretilecek c\u00fcmlelerde, c\u00fcmlelerin yap\u0131s\u0131na uygun olacak \u015fekilde \u00e7ok s\u0131k ge\u00e7i\u015f kelimeleri kullan.\n   - Ge\u00e7i\u015f kelime \u00f6rnekleri: fakat, demek ki, ama, farz edelim ki, \u00e7\u00fcnk\u00fc, dolay\u0131s\u0131yla, y\u00fcz\u00fcnden, bunun yan\u0131 s\u0131ra, toptan, k\u0131saca s\u00f6yleyecek olursak, yaln\u0131z, ancak, buna g\u00f6re, buna ra\u011fmen, veya, ne var ki, l\u00e2kin, ne yaz\u0131k ki, oysa, halbuki, yine de...\n   - Bu ge\u00e7i\u015f kelimeleri \u00f6rnekleri T\u00fcrk\u00e7e dili i\u00e7in ancak hangi dil kullan\u0131l\u0131yor ise o dile ait ge\u00e7i\u015f kelimelerine paragraflarda s\u0131k s\u0131k yer verilecek.\n   - Ge\u00e7i\u015f kelimelerini paragrafa ve c\u00fcmleye s\u0131k s\u0131k ve uygun \u015fekilde yerle\u015ftir.\n\n5. **Ek Talimatlar:**\n   - C\u00fcmleler ak\u0131c\u0131, do\u011fal ve T\u00fcrk\u00e7e dilbilgisi kurallar\u0131na uygun olmal\u0131.\n   - Makale dili do\u011frudan kullan\u0131c\u0131ya hitap etmelidir: \u201cSize g\u00f6sterece\u011fim bu teknikle\u2026\u201d gibi c\u00fcmleler kullan\u0131lacak. C\u00fcmleler buna uygun \u015fekilde olu\u015fturulacak.\n   - Gereksiz tekrarlar veya dolgu ifadelerden ka\u00e7\u0131n.\n   - Her kural\u0131 s\u0131k\u0131 bir \u015fekilde takip et ve hi\u00e7birini ihlal etme.\n   - \u0130kinci paragrafta mutlaka maddelendirme (\u00f6rne\u011fin, - veya \u2022)  kullan. Liste, konuya ({{ $json.question_array }}) \u00f6zel olarak dinamik \u015fekilde olu\u015fturulmal\u0131 ve \u015fu kurallara uymal\u0131:\n     - Liste, i\u00e7eri\u011fin avantajlar\u0131n\u0131, \u00f6zelliklerini, ad\u0131mlar\u0131n\u0131 veya \u00f6rneklerini s\u0131ralamal\u0131.\n     - *#^ gibi semboller maddelendirmelerde, ya da ba\u015fl\u0131klarda yer almayacak.\n     - 3-5 madde i\u00e7ermeli, her madde 10-15 kelime olmal\u0131.\n     - Madde ba\u015fl\u0131klar\u0131, konuya \u00f6zg\u00fc ve \u00f6zg\u00fcn olmal\u0131. Sabit kal\u0131plar (\u00f6rne\u011fin, \"Eri\u015fim kolayl\u0131\u011f\u0131\", \"H\u0131z\", \"Ki\u015fiselle\u015ftirme\") kullanma. Bunun yerine, i\u00e7eri\u011fe ve alt ba\u015fl\u0131\u011fa uygun yeni ba\u015fl\u0131klar \u00fcret. \u00dcretilen madde ba\u015fl\u0131klar\u0131 her zaman birbirinden farkl\u0131 olmal\u0131d\u0131r. Asla tekrara d\u00fc\u015f\u00fclmemeli. \u00dcretilen bir ba\u015fl\u0131k bir daha asla \u00fcretilmeyecek bunun yerine yeni bir madde ba\u015fl\u0131\u011f\u0131 \u00fcretilecek. Madde ba\u015fl\u0131klar\u0131n\u0131n ba\u015f\u0131nda veya sonunda * sembolleri bulunmayacak.\n     - Maddeler, odak anahtar kelime ({{ $('Edit Fields').first().json.keyword }}) veya e\u015f anlaml\u0131 kelimelerle ({{ $('Es_anlamilar').first().json.synonyms }}) uyumlu olmal\u0131.\n     - Liste, etken \u00e7at\u0131da ve 15 kelime/c\u00fcmle s\u0131n\u0131r\u0131na uygun olmal\u0131.\n     - \u0130lk paragrafta maddelendirme kullanma, ak\u0131c\u0131 anlat\u0131m\u0131 koru.\n     - \u00d6rnek (konu: \"Yapay Zeka \u015eark\u0131 Yapabilir Mi?\"):\n       - \u0130lk Paragraf (Anlat\u0131m)**: \"Sana yapay zekan\u0131n m\u00fczik d\u00fcnyas\u0131n\u0131 nas\u0131l de\u011fi\u015ftirdi\u011fini anlataca\u011f\u0131m. Bu teknoloji, yarat\u0131c\u0131l\u0131\u011f\u0131 art\u0131r\u0131r.\"\n       - \u0130kinci Paragraf (Liste): \"Yapay zeka \u015fark\u0131 \u00fcretmenin avantajlar\u0131 \u015funlard\u0131r:\\n- Eri\u015fim kolayl\u0131\u011f\u0131: Sen \u015fark\u0131n\u0131 kolayca \u00fcretirsin.\\n- H\u0131z: Melodiler birka\u00e7 dakikada haz\u0131r olur...\n     - Liste, 200 kelime kural\u0131na uymal\u0131. Kalan kelimeler ak\u0131c\u0131 anlat\u0131mla tamamlanmal\u0131.\n\n- Olu\u015fturulan c\u00fcmlelerde yaz\u0131m kurallar\u0131na kesinlikle uyulacak, c\u00fcmle ortas\u0131nda gereksiz yere b\u00fcy\u00fck harfle ba\u015flayan s\u00f6zc\u00fckler kullan\u0131lmayacak. \u00dcretilen i\u00e7erikte konu ile alakal\u0131 c\u00fcmleler kurulacak, herhangi bir not veya konudan ba\u011f\u0131ms\u0131z gereksiz c\u00fcmleler i\u00e7eri\u011fe eklenmeyecek.\n- *#^ gibi gereksiz semboller kullan\u0131lmayacak.\n- i\u00e7erik {{ $('Edit Fields').first().json.language }} dilinde olu\u015fturulacak.\n- Benzersiz bir bak\u0131\u015f a\u00e7\u0131s\u0131na sahip ve bilgi sunan i\u00e7erik olu\u015fturmal\u0131s\u0131n.\n- Sonu\u00e7 olarak SEO uyumlu, okunabilirlik ve di\u011fer t\u00fcm kurallara uyan bir makale olu\u015fturulacakt\u0131r.\n\n5. **Kontrol ve Uygulama S\u00fcreci:**\n Olu\u015fturulan i\u00e7eri\u011fi \u00e7\u0131kt\u0131 olarak vermeden \u00f6nce a\u015fa\u011f\u0131daki kontrolleri sa\u011fla ve gerekli d\u00fczenlemeleri yap.\n- Dilbilgisi kurallar\u0131na g\u00f6re edilgen \u00e7at\u0131 kullan\u0131lan ve \"-ebilmek\", \"-abilmek\" ekleri ile biten fiilleri (\u00f6rne\u011fin, \"yapabilir\", \"olu\u015fturabilir\", \"geli\u015ftirebilir\") i\u00e7eren t\u00fcm c\u00fcmleleri tespit et.\n- Tespit edilen t\u00fcm edilgen \u00e7at\u0131ya sahip c\u00fcmleleri ve \"-ebilmek\", \"-abilmek\" ekli fiilleri i\u00e7eren c\u00fcmleleri  etken \u00e7at\u0131da olacak \u015fekilde yeniden d\u00fczenle. \n- Edilgen \u00e7at\u0131da kurulmu\u015f c\u00fcmleleri ve \"-ebilmek\", \"-abilmek\" ekli fiiller i\u00e7eren c\u00fcmleleri tespit et. \n- Kontroller ve tespitler yaparken bir c\u00fcmledeki t\u00fcm fiillerin \u00e7at\u0131s\u0131 kontrol edilmeli bu \u00f6nemli bir nokta.\n- Edilgen \u00e7at\u0131da kurulmu\u015f c\u00fcmleleri d\u00fczeltirken yeni olu\u015fturulan c\u00fcmlenin fiilinin etken \u00e7at\u0131da oldu\u011fundan emin ol.\n- \"-ebilmek\", \"-abilmek\" ekli fiilleri do\u011frudan etken \u00e7at\u0131 fiilleriyle de\u011fi\u015ftir (\u00f6rne\u011fin, \"yapabilir\" yerine \"yapar\", \"geli\u015ftirebilir\" yerine \"geli\u015ftirir\").\n- E\u011fer \"-ebilmek\", \"-abilmek\" ekini kald\u0131rmak anlam\u0131 de\u011fi\u015ftiriyorsa, c\u00fcmleyi yeniden d\u00fczenleyerek etken \u00e7at\u0131ya uygun hale getir (\u00f6rne\u011fin, \"yazabilir\" yerine \"yazma imkan\u0131na sahiptir\" veya \"yazmay\u0131 ba\u015far\u0131r\").\n- Yukar\u0131daki \u00f6rnekleri rehber al, edilgen \u00e7at\u0131 fiili g\u00f6r\u00fcrsen (\u00f6rne\u011fin, \"-il-\", \"-in-\" ekleri varsa) veya \"-ebilmek\", \"-abilmek\" ekli fiil g\u00f6r\u00fcrsen, c\u00fcmleyi etken \u00e7at\u0131ya \u00e7evir.\n- Fiilin \u00e7at\u0131s\u0131ndan emin de\u011filsen, k\u00f6k\u00fcn\u00fc ve eklerini kontrol et: \"-il-\", \"-in-\" gibi ekler varsa edilgen \u00e7at\u0131l\u0131d\u0131r, kullanma.\n- C\u00fcmleler d\u00fczenlenirken ard arda gelen c\u00fcmlelerin ayn\u0131 s\u00f6zc\u00fck ile ba\u015flamamas\u0131na dikkat et. Ard arda gelen c\u00fcmleler ayn\u0131 s\u00f6zc\u00fck ile ba\u015fl\u0131yor ise bu c\u00fcmleleri yeniden d\u00fczenle ve ayn\u0131 s\u00f6zc\u00fck ile ba\u015flamamalar\u0131n\u0131 sa\u011fla. \u00d6nemli nokta: Ard arda gelen c\u00fcmleler asla ayn\u0131 s\u00f6zc\u00fck ile ba\u015flamayacak e\u011fer ba\u015fl\u0131yorsa c\u00fcmleler de\u011fi\u015ftirilecek.\n- Paragraflarda bulunan madde ba\u015fl\u0131klar\u0131ndan \u00f6nce ya da sonra hi\u00e7bir \u015fekilde ** sembolleri  bulunmayacak. Maddeleri tek tek kontrol et ve gereksiz ** sembolleri varsa bu sembolleri i\u00e7erikten kesinlikle kald\u0131r. Son olarak yine maddeleri kontrol ederek madde ba\u015fl\u0131klar\u0131nda ** gibi semboller yer almad\u0131\u011f\u0131ndan emin ol.\n\n\nKontroller ve d\u00fczenlemeler tamamland\u0131ktan sonra t\u00fcm kurallara uygun olarak \u00fcretilen i\u00e7eri\u011fi \u00e7\u0131kt\u0131 olarak ver.\n",
        "options": {
          "systemMessage": "=G\u00f6revin, belirtilen kurallara g\u00f6re bir makalenin alt ba\u015fl\u0131klar\u0131 i\u00e7in i\u00e7erik olu\u015fturmakt\u0131r.\n\n- Makalede kullan\u0131lan dil her zaman {{ $('Edit Fields').first().json.language }} olacak.\n- C\u00fcmleleri ve paragraflar\u0131 tamamlamadan b\u0131rakmamal\u0131s\u0131n.\n- Belirtilen kelime say\u0131s\u0131 kurallar\u0131na kesinlikle uymal\u0131s\u0131n ve Kullan\u0131c\u0131 Mesaj\u0131n\u0131 tam olarak verilen \u015fekilde takip etmelisin.\n- Verilen lokasyon kurallar\u0131na ve di\u011fer b\u00fct\u00fcn kurallara uymal\u0131s\u0131n.\n- Konu i\u00e7erisinde e\u011fer bir lokasyon belirtilmi\u015fse, belirtilen lokasyon d\u0131\u015f\u0131nda ba\u015fka hi\u00e7bir \u015fehir, il\u00e7e, b\u00f6lge veya \u00fclke ad\u0131 ge\u00e7meyecek. E\u011fer verilen lokasyon \u0130stanbul ise \u2018\u0130stanbul\u2019un il\u00e7eleri\u2019 dahil hi\u00e7bir il\u00e7e ad\u0131 i\u00e7erikte yer almayacak. E\u011fer bu kurala uyulmazsa, i\u00e7erik tamamen reddedilecektir.\"\n\u2705 Do\u011fru \u00d6rnek:\n\"\u0130stanbul, T\u00fcrkiye'nin en b\u00fcy\u00fck \u015fehridir. \u015eehirde tarihi ve k\u00fclt\u00fcrel bir\u00e7ok yap\u0131 bulunmaktad\u0131r.\"\n\u274c Yanl\u0131\u015f \u00d6rnek:\n\"\u0130stanbul\u2019un il\u00e7eleri aras\u0131nda Be\u015fikta\u015f, Kad\u0131k\u00f6y, Esenyurt, K\u00fc\u00e7\u00fck\u00e7ekmece ve Fatih gibi yerler vard\u0131r.\"\n\n- {{ $('Aggregate').item.json.searches_array }} bu anahtar kelimeler dizisinde lokasyona ait il\u00e7eleri i\u00e7eren bir alt ba\u015fl\u0131k var ise bu anahtar kelime i\u00e7erikte kullan\u0131lmayacak.\n- Bir paragraf 200 kelimeden az veya 250 kelimeden fazla olamaz. \u0130\u00e7erik, bu kurala uygun \u015fekilde olu\u015fturulmal\u0131d\u0131r.\n-Olu\u015fturulan i\u00e7eriklerde yaz\u0131m ve noktalama kurallar\u0131na uyulmal\u0131d\u0131r.\n- Mant\u0131kl\u0131 c\u00fcmleler kurulmal\u0131d\u0131r.\n- Odak anahtar kelime kullan\u0131m\u0131na dikkat edilmeli.\n- Okunabilirlik kurallar\u0131 kesimlikle uygulanacak. Bir c\u00fcmlenin i\u00e7erid\u011fi kelime say\u0131s\u0131 kesinlikle 15'ten daha az olacak. C\u00fcmleler bu kurala g\u00f6re \u00fcretilecek. \n\n- Yazd\u0131\u011f\u0131n her c\u00fcmlede {{ $('Edit Fields').first().json.language }} dili i\u00e7in dilbilgisi kurallar\u0131na tam olarak uy. T\u00fcm c\u00fcmleleri yaln\u0131zca etken \u00e7at\u0131da kur. Edilgen \u00e7at\u0131l\u0131 yap\u0131lar kesinlikle kullanma.\n\n- **\u00d6zel Talimat: -ebilmek, -abilmek Eklerinden Kesinlikle Ka\u00e7\u0131n:**\n  - \"-ebilmek\", \"-abilmek\" ekleriyle biten fiiller (\u00f6rne\u011fin, \"yapabilir\", \"olu\u015fturabilir\", \"geli\u015ftirebilir\") kesinlikle c\u00fcmlelerde kullan\u0131lmayacak. Bunun yerine  do\u011frudan etken \u00e7at\u0131 fiilleri kullan veya c\u00fcmleyi yeniden d\u00fczenle. \u00d6rne\u011fin:\n    - Yanl\u0131\u015f: \"Kullan\u0131c\u0131lar \u015fark\u0131 s\u00f6zlerini yazabilir.\" \u2192 Do\u011fru: \"Kullan\u0131c\u0131lar \u015fark\u0131 s\u00f6zlerini yazar.\"\n    - Yanl\u0131\u015f: \"Kullan\u0131c\u0131lar vokalleri kald\u0131rabilir.\" \u2192 Do\u011fru: \"Kullan\u0131c\u0131lar vokalleri kald\u0131r\u0131r.\"\n    - Yanl\u0131\u015f: \"Kullan\u0131c\u0131lar m\u00fczik teorisini \u00f6\u011frenebilir.\" \u2192 Do\u011fru: \"Kullan\u0131c\u0131lar m\u00fczik teorisini \u00f6\u011frenir.\"\n  - E\u011fer \"-ebilmek\", \"-abilmek\" ekini kald\u0131rmak anlam\u0131 de\u011fi\u015ftiriyorsa, c\u00fcmleyi yeniden d\u00fczenleyerek etken \u00e7at\u0131ya uygun hale getir. \u00d6rne\u011fin:\n    - Yanl\u0131\u015f: \"Kullan\u0131c\u0131lar \u015fark\u0131 s\u00f6zlerini yazabilir.\" \u2192 Do\u011fru: \"Kullan\u0131c\u0131lar \u015fark\u0131 s\u00f6zlerini yazma imkan\u0131na sahiptir.\" veya \"Kullan\u0131c\u0131lar \u015fark\u0131 s\u00f6zlerini yazmay\u0131 ba\u015far\u0131r.\"\n\n- Yazaca\u011f\u0131n her c\u00fcmleyi kesinlikle etken \u00e7at\u0131l\u0131 kur. Her fiili denetleyerek \u00e7at\u0131 yap\u0131s\u0131n\u0131 kontrol et. \"-il\", \"-in\", \"-n\", \"-l\", \"-\u0131l\", \"-ul\" gibi eklerle edilgenle\u015fmi\u015f fiillerden ve \"-ebilmek\", \"-abilmek\" ekli fiilleri kesinlikle kullanma. Gerekiyorsa c\u00fcmleyi yeniden yaz. Fiilin \u00f6zne taraf\u0131ndan do\u011frudan yap\u0131ld\u0131\u011f\u0131n\u0131 g\u00f6steren yap\u0131lar kullan.\n- C\u00fcmleler \u00fcretilirken etken \u00e7at\u0131 kurallar\u0131na kesinlikle uyulacak. T\u00fcm c\u00fcmleler etken \u00e7at\u0131da olu\u015fturulacak. Edilgen \u00e7at\u0131 ve \"-ebilmek\", \"-abilmek\" ekli fiiller c\u00fcmlelerde kesinlikle kullan\u0131lmayacak.\n\n- \u00dcretilecek i\u00e7erik asla ayn\u0131 kelime ile ba\u015flayan ard\u0131\u015f\u0131k c\u00fcmleler i\u00e7ermeyecektir. Yani ard arda ayn\u0131 s\u00f6zc\u00fck ile ba\u015flayan c\u00fcmle i\u00e7erikte bulunmayacakt\u0131r. Bu kurala uygun olarak ard arda gelen c\u00fcmlelerin ilk s\u00f6zc\u00fcklerini kontrol et ve ayn\u0131 s\u00f6zc\u00fck ile ba\u015fl\u0131yorsa c\u00fcmleyi yeniden olu\u015ftur.\n   - Ard\u0131\u015f\u0131k c\u00fcmlelerde ilk s\u00f6zc\u00fck kontrol\u00fc yap\u0131l\u0131rken i\u00e7eri\u011fin ba\u015fl\u0131\u011f\u0131 ile i\u00e7eri\u011fin ilk c\u00fcmlesi \u00f6zellikle kontrol edilecek. Alt ba\u015fl\u0131\u011f\u0131n ilk kelimesi ile i\u00e7eri\u011fin ilk kelimesi ayn\u0131 olmamal\u0131. E\u011fer ayn\u0131 ise i\u00e7eri\u011fin ilk c\u00fcmlesi d\u00fczenlenmeli. Alt ba\u015fl\u0131k asla de\u011fi\u015ftirilmemeli, bu durumda uyumluluk i\u00e7in d\u00fczenlemeler i\u00e7eri\u011fin ilk c\u00fcmlesinde sa\u011flanmal\u0131.\n     - Yanl\u0131\u015f: Ba\u015fl\u0131k: \"Yapay Zeka Teknolojileri\", \u0130\u00e7eri\u011fin ilk c\u00fcmlesi: \"Yapay zeka g\u00fcn\u00fcm\u00fczde s\u0131k\u0131kla konullan\u0131lmaktad\u0131r.\" => Do\u011fru: \"Yapay Zeka Teknolojileri\", \u0130\u00e7eri\u011fin ilk c\u00fcmlesi: \"G\u00fcn\u00fcm\u00fczde s\u0131kl\u0131kla kullan\u0131lan teknolojiler aras\u0131nda yapay zeka da yer almaktad\u0131r.\"\n\n- \u00dcretilen i\u00e7erikte konu ile alakal\u0131 c\u00fcmleler kurulacak, herhangi bir not veya konudan ba\u011f\u0131ms\u0131z gereksiz c\u00fcmleler i\u00e7eri\u011fe eklenmeyecek.\n- \u00dcretilecek i\u00e7erikte ge\u00e7i\u015f kelimelerine s\u0131k s\u0131k yer vermeye \u00f6zen g\u00f6ster. \n- En az bir paragrafta, paragraf\u0131n yap\u0131s\u0131na uygun olmak \u015fart\u0131 ile madde i\u015faretleri ve numaraland\u0131rmalar kesinlikle \nkullan\u0131lacakt\u0131r.\n- Maddelendirmelerde *#^ gibi gereksiz semboller kesinlikle yer almayacak. Madde c\u00fcmlelerinin ba\u015f\u0131nda veya sonunda *#^ gibi semboller bulunmayacak.\n\n- Yaz\u0131m ve noktalama kurallar\u0131na uyulmal\u0131. \u00dcretilen \u00e7\u0131kt\u0131da i\u00e7bir \u015fekilde yaz\u0131m yanl\u0131\u015f\u0131 olmamal\u0131d\u0131r.\n"
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.7,
      "position": [
        -3440,
        1344
      ],
      "id": "133d7aa3-91d1-43fb-ac0e-83805c3b1876",
      "name": "Makale Agent"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Makale Konusu: {{ $('Edit Fields').first().json.topic }}\nEksik Alt Ba\u015fl\u0131k Say\u0131s\u0131: {{ $json.eksik_alt_baslik_sayisi }}\nMevcut Alt Ba\u015fl\u0131klar Dizisi: {{ $('Aggregate').item.json.question_array }}\nDil: {{ $('Edit Fields').first().json.language }}\n\nBelirtilen konuya  {{ $('Edit Fields').first().json.topic }} uygun \u015fekilde yaln\u0131zca {{ $('Edit Fields').first().json.language }} dilinde sadece {{ $json.eksik_alt_baslik_sayisi }} adet alt ba\u015fl\u0131k olu\u015ftur.\n\nAlt Ba\u015fl\u0131k Olu\u015fturulurken Uyulacak Kurallar:\n- Alt ba\u015fl\u0131klar\u0131; bilgi arama, sat\u0131n alma, kar\u015f\u0131la\u015ft\u0131rma gibi konulara y\u00f6nelik olacak \u015fekilde olu\u015ftur.\n- Alt ba\u015fl\u0131klar\u0131 olu\u015ftururken  {{ $('Es_anlamilar').first().json.synonyms }} bu e\u015f anlaml\u0131 anahatar kelimelerden uygun olanlar\u0131n\u0131 alt ba\u015fl\u0131klara dahil et. Bu e\u015f anlaml\u0131 anahtar kelimelerden uygun olanlar da alt ba\u015fl\u0131klara mant\u0131kl\u0131 bir \u015fekilde eklenerek alt ba\u015fl\u0131klar olu\u015fturulsun. \n- {{ $('Edit Fields').first().json.topic }} bu ba\u015fl\u0131k ve {{ $('Edit Fields').first().json.keyword }} bu anahtar kelimeye g\u00f6re kullan\u0131c\u0131 niyetini anlamaya \u00e7al\u0131\u015f ve ona g\u00f6re ba\u015fl\u0131klar \u00fcret.\n- Yeni olu\u015fturulan alt ba\u015fl\u0131klar mevcut alt ba\u015fl\u0131k dizisi i\u00e7erisinde yer alan alt ba\u015fl\u0131klar ile ayn\u0131 olmamal\u0131d\u0131r.\n- Olu\u015fturulacak yeni alt ba\u015fl\u0131klarda yaz\u0131m ne noktalama kurallar\u0131na uyulacak. Yaz\u0131m yanl\u0131\u015f\u0131 yap\u0131lmayacak.\n- Alt ba\u015fl\u0131klar olu\u015ftururken spesifik bir marka ad\u0131ndan bahsedilmeyecek.\n- Olu\u015fturulacak t\u00fcm yeni alt ba\u015fl\u0131klar {{ $('Edit Fields').first().json.language }} dilinde  olmal\u0131d\u0131r.\n- Alt ba\u015fl\u0131k \u00fcretirken parante kullanma \"(\" veya \")\" kullanma\n\n*\u00dcretilen \u00e7\u0131kt\u0131da ASLA bu format kullan\u0131lmayacak*\n - Kullan\u0131lmayacak \u00e7\u0131kt\u0131 format\u0131: \"Makale konusu: \u00fcretilen alt ba\u015fl\u0131k\"\n - \u00d6rne\u011fin: Makale Konusu: Yapay Zekan\u0131n Gelece\u011fi, \u00dcretilen Alt Ba\u015fl\u0131k: Yapay Zekan\u0131n Tehditleri Nelerdir?, \u00c7\u0131kt\u0131:\"Yapay Zekan\u0131n Gelece\u011fi: Yapay Zekan\u0131n Tehditleri Nelerdir?\" Bu formatta bir \u00e7\u0131kt\u0131 kesinlikle olu\u015fturulmayacak!\n- \u00c7\u0131kt\u0131 yap\u0131s\u0131 asla bu \u015fekilde olmayacak. \u00c7\u0131kt\u0131da makale konusu de\u011fil yaln\u0131zca \u00fcretilen alt ba\u015fl\u0131k verilmelidir.\n\n\u00c7\u0131kt\u0131da yaln\u0131zca olu\u015fturulan alt ba\u015fl\u0131klar yer almal\u0131d\u0131r. Ba\u015fka hi\u00e7bir kelime veya c\u00fcmle kullan\u0131lmamal\u0131d\u0131r.\n",
        "options": {
          "systemMessage": "Sen istenen kriterlere g\u00f6re alt ba\u015fl\u0131k \u00fcretimi yapan bir asistans\u0131n.\n\n*\u00c7\u0131kt\u0131 format\u0131 ASLA bu \u015fekilde olmayacak:*\n - Makale konusu: \u00fcretilen alt ba\u015fl\u0131k\n - \u00d6rne\u011fin: Makale Konusu: Yapay Zekan\u0131n Gelece\u011fi, \u00dcretilen Alt Ba\u015fl\u0131k: Yapay Zekan\u0131n Tehditleri Nelerdir?, \u00c7\u0131kt\u0131:\"Yapay Zekan\u0131n Gelece\u011fi: Yapay Zekan\u0131n Tehditleri Nelerdir?\"\n- \u00e7\u0131kt\u0131 format\u0131 asla bu \u015fekilde olmayacak. \u00c7\u0131kt\u0131da makale konusu de\u011fil yaln\u0131zca \u00fcretilen alt ba\u015fl\u0131k verilmelidir."
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.7,
      "position": [
        -4464,
        1024
      ],
      "id": "c3ee8bc5-7fe1-44fb-914f-3bdc616f0b49",
      "name": "Alt Baslik Agent",
      "retryOnFail": true,
      "maxTries": 2,
      "waitBetweenTries": 100
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "ff572ecb-beb7-408d-918d-4cc8b4edd799",
              "leftValue": "={{$node[\"Loop Over Items1\"].context[\"currentRunIndex\"];}}",
              "rightValue": "={{ ($('Edit Fields6').item.json.alt_baslik_sayisi) - ($('Edit Fields6').item.json.alt_baslik_sayisi -1)  }}",
              "operator": {
                "type": "number",
                "operation": "equals"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        -2832,
        1360
      ],
      "id": "e642dfb7-0bae-4978-9667-50f7321d80eb",
      "name": "If"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=- {{ $('Makale Agent').item.json.output }} bu metin i\u00e7erisine yaln\u0131zca\n{{ $('Aggregate').item.json.dis_baglanti_array }} bu d\u0131\u015f ba\u011flant\u0131 dizisinde yer alan ba\u011flant\u0131 adreslerinden i\u00e7erik konusu ile ilgili olan ve do\u011fru \u015fekilde \u00e7al\u0131\u015fan yaln\u0131zca 1 adet d\u0131\u015f  ba\u011flant\u0131y\u0131 \"Bu konu i\u00e7in yararlan\u0131labilecek ba\u011flant\u0131lar: \" \u015feklinde bir c\u00fcmle ile entegre et.\n- \u0130\u00e7erikte mutlaka 1 adet d\u0131\u015f ba\u011flant\u0131 bulunacak. 1 tane ba\u011flant\u0131y\u0131 formata g\u00f6re i\u00e7eri\u011fe yerle\u015ftirmek zorundas\u0131n. \u0130\u00e7eri\u011fe asla ba\u011flant\u0131 bulunmad\u0131 vb. gibi bir a\u00e7\u0131klama ekleme.\n- Ancak d\u0131\u015f ba\u011flant\u0131 ilk paragraf\u0131n sonunda yeni bir sat\u0131rda yer als\u0131n. \u0130kinci paragraf sonunda yer almas\u0131n.\n- Yaln\u0131zca d\u0131\u015f ba\u011flant\u0131 dizisinde herhangi bir ba\u011flant\u0131 yer almad\u0131\u011f\u0131 durumda konu ile ilgili d\u00fczg\u00fcn \u00e7al\u0131\u015fan bir d\u0131\u015f ba\u011flant\u0131y\u0131 sen \u00fcreteceksin.\n- \u0130\u00e7eri\u011fe konudan ba\u011f\u0131ms\u0131z, gereksiz bir not veya bir c\u00fcmle eklenmeyecek. Yaln\u0131zca belirtilen formatta i\u015flem yap\u0131lacak.\n- Sonras\u0131nda ba\u011flant\u0131n\u0131n enterge edildi\u011fi i\u00e7erik kullan\u0131c\u0131ya g\u00f6nderilecek.\n- Ba\u011flant\u0131dan \u00f6nce bulunan ve ba\u011flant\u0131dan sonra bulunan paragraflar ile ba\u011flant\u0131 paragraf\u0131 aras\u0131na her zaman bir sat\u0131r bo\u015fluk bulunmal\u0131.\n- \u00c7\u0131kt\u0131 olarak ba\u015fl\u0131\u011f\u0131 ve belirlenen formatta ba\u011flant\u0131 eklenmi\u015f i\u00e7eri\u011fi ver.\n- Sonu\u00e7 olarak d\u00fczenlenen i\u00e7erikte ba\u011flant\u0131 verme format\u0131na uygun \u015fekilde bir ba\u011flant\u0131 mutlaka yer alacak.",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.7,
      "position": [
        -2656,
        1120
      ],
      "id": "9ae35644-77d3-44d8-a262-103bd053352c",
      "name": "AI Agent"
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1.2,
      "position": [
        -3440,
        1584
      ],
      "id": "30e5b301-5a3a-46c2-84ce-b9b384eb8408",
      "name": "OpenAI Chat Model1",
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "fieldsToAggregate": {
          "fieldToAggregate": [
            {
              "fieldToAggregate": "tumicerik",
              "renameField": true,
              "outputFieldName": "tumicerikarray"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.aggregate",
      "typeVersion": 1,
      "position": [
        -3184,
        656
      ],
      "id": "ed91c677-dfa9-4e76-a046-30c21df82fcd",
      "name": "Aggregate2"
    },
    {
      "parameters": {
        "jsCode": "return items.map(item => ({\n    json: {\n        tumicerik: item.json.tumicerik\n            .replace(/This message was sent automatically with n8n/gi, '') // Bu mesaj\u0131 temizle\n          .replace(/This message was sent automatically with(?: \\[?n8n\\]?|\\s)?(?:\\([^)]+\\))?/gi, '') // n8n ile ilgili her t\u00fcrl\u00fc ifadeyi temizle \n            .trim()  // Ba\u015f ve son bo\u015fluklar\u0131 temizle\n    }\n}));\n\n //.replace(/#/g, '')  // # karakterini temizle\n            //.replace(/-/g, '')  // - karakterini temizle\n"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -3344,
        656
      ],
      "id": "26d290a1-9d38-4b8d-b488-fc5e47d93c7d",
      "name": "Code5"
    },
    {
      "parameters": {
        "jsCode": "const stopWords = {\n    \"T\u00fcrk\u00e7e\": [\"bu\", \"ve\", \"i\u00e7in\", \"olarak\", \"ile\", \"bir\", \"da\", \"de\", \"mi\", \"ne\", \"m\u0131\", \"nas\u0131l\", \"neden\", \"ni\u00e7in\", \"kim\", \"nerede\"],\n    \"\u0130ngilizce\": [\"the\", \"a\", \"an\", \"and\", \"or\", \"but\", \"in\", \"on\", \"at\", \"to\", \"for\", \"with\", \"by\"],\n    \"\u0130spanyolca\": [\"el\", \"la\", \"los\", \"las\", \"y\", \"o\", \"pero\", \"en\", \"a\", \"para\", \"con\", \"por\"]\n};\n\nconst locations = {\n    \"T\u00fcrk\u00e7e\": [\"adana\", \"ad\u0131yaman\", \"afyonkarahisar\", \"a\u011fr\u0131\", \"aksaray\", \"amasya\", \"ankara\", \"antalya\", \"ardahan\", \"artvin\", \"ayd\u0131n\", \"bal\u0131kesir\", \"bart\u0131n\", \"batman\", \"bayburt\", \"bilecik\", \"bing\u00f6l\", \"bitlis\", \"bolu\", \"burdur\", \"bursa\", \"\u00e7anakkale\", \"\u00e7ank\u0131r\u0131\", \"\u00e7orum\", \"denizli\", \"diyarbak\u0131r\", \"d\u00fczce\", \"edirne\", \"elaz\u0131\u011f\", \"erzincan\", \"erzurum\", \"eski\u015fehir\", \"gaziantep\", \"giresun\", \"g\u00fcm\u00fc\u015fhane\", \"hakk\u00e2ri\", \"hatay\", \"\u0131sparta\", \"\u0131\u011fd\u0131r\", \"istanbul\", \"izmir\", \"kahramanmara\u015f\", \"karab\u00fck\", \"karaman\", \"kars\", \"kastamonu\", \"kayseri\", \"k\u0131r\u0131kkale\", \"k\u0131rklareli\", \"k\u0131r\u015fehir\", \"kilis\", \"kocaeli\", \"konya\", \"k\u00fctahya\", \"malatya\", \"manisa\", \"mardin\", \"mersin\", \"mu\u011fla\", \"mu\u015f\", \"nev\u015fehir\", \"ni\u011fde\", \"ordu\", \"osmaniye\", \"rize\", \"sakarya\", \"samsun\", \"\u015fanl\u0131urfa\", \"siirt\", \"sinop\", \"sivas\", \"tekirda\u011f\", \"tokat\", \"trabzon\", \"tunceli\", \"u\u015fak\", \"van\", \"yozgat\", \"zonguldak\", \"\u015f\u0131rnak\", \"bart\u0131n\", \"t\u00fcrkiye\", \"d\u00fcnya\"],\n    \"\u0130ngilizce\": [\"new york\", \"london\", \"paris\", \"tokyo\", \"los angeles\", \"world\"],\n    \"\u0130spanyolca\": [\"madrid\", \"barcelona\", \"mexico\", \"bogota\", \"mundo\"]\n};\n\n// Gerekli verileri al\nlet makaleBasligi = $('Edit Fields').first().json.topic;\nlet language = $('Edit Fields').first().json.language; // \"T\u00fcrk\u00e7e\", \"\u0130ngilizce\", \"\u0130spanyolca\"\nconst altBasliklar = $('Aggregate1').all().map(item => item.json?.newSubheading_array || []).flat();\nconst icerikler = $('Aggregate2').all().map(item => item.json?.tumicerikarray || []).flat();\nconst girisMetni = $('AI Agent2').first().json.output || '';\nconst imageUrl = $('Edit Fields8').first().json.amazonimageUrl || '';\nlet disBaglantiArray = $('Aggregate').first()?.json?.dis_baglanti_array || [];\ndisBaglantiArray = Array.isArray(disBaglantiArray) ? disBaglantiArray : Array.from(disBaglantiArray);\nlet metaDesc = $input.first()?.json?.meta_desc || '';\nlet metaTitle = $input.first()?.json?.meta_title || '';\nlet odakKelime = $('Ceviriler Code').first().json.odakKelimeCeviri || '';\nconst summary = $('Code11').first()?.json?.summary || '';\nlet internalLinkUrl = $('Scrape Internal Links Node').first()?.json?.internalLinkUrl || '';\nconst studyTitle = $('Scholar Set Node').first().json.title;\nconst studyUrl = $('Scholar Set Node').first().json.link;\nconst siteUrl = $('Edit Fields').first().json.site_url;\n\n// FAQ verilerini al\nconst faqItems = $('Sorular Code').all().map(item => ({\n    question: item.json?.question || '',\n    explanation: item.json?.explanation || ''\n}));\nconsole.log(\"faqItems:\", faqItems);\n\n// E\u015f anlaml\u0131lar\u0131 al ve temizle\nconst synonymsRaw = $('Es_anlamilar').first()?.json?.synonyms || [];\nconst synonyms = [...new Set(synonymsRaw.map(syn => syn.replace(/[\\n\\r\\t*]+/g, '').trim()).filter(syn => syn))];\nconsole.log(\"Temizlenmi\u015f e\u015f anlaml\u0131lar:\", synonyms);\n\nconsole.log(\"disBaglantiArray tipi:\", typeof disBaglantiArray);\nconsole.log(\"disBaglantiArray instanceof Array:\", disBaglantiArray instanceof Array);\nconsole.log(\"disBaglantiArray i\u00e7eri\u011fi:\", disBaglantiArray);\n\n// Giri\u015f verilerini logla\nconsole.log(\"makaleBasligi:\", makaleBasligi);\nconsole.log(\"altBasliklar:\", altBasliklar);\nconsole.log(\"icerikler:\", icerikler);\nconsole.log(\"language:\", language);\nconsole.log(\"Ceviriler Code \u00e7\u0131kt\u0131s\u0131:\", $('Ceviriler Code').first().json);\nconsole.log(\"Aggregate1 \u00e7\u0131kt\u0131s\u0131:\", $('Aggregate1').all());\nconsole.log(\"Aggregate2 \u00e7\u0131kt\u0131s\u0131:\", $('Aggregate2').all());\n\n// Dil kodunu d\u00f6n\u00fc\u015ft\u00fcr (T\u00fcrk\u00e7e \u2192 tr, \u0130ngilizce \u2192 en, \u0130spanyolca \u2192 es)\nfunction getLanguageCode(lang) {\n    switch (lang) {\n        case \"T\u00fcrk\u00e7e\":\n            return \"tr\";\n        case \"\u0130ngilizce\":\n            return \"en\";\n        case \"\u0130spanyolca\":\n            return \"es\";\n        default:\n            return \"tr\"; // Varsay\u0131lan olarak T\u00fcrk\u00e7e\n    }\n}\nconst langCode = getLanguageCode(language);\n\n\n/*\n// Dil ba\u011f\u0131ml\u0131 normalizasyon\nfunction normalize(text, lang) {\n    if (!text) return '';\n    let normalizedText = text;\n\n    if (lang === \"T\u00fcrk\u00e7e\") {\n        normalizedText = text.toLocaleLowerCase('tr-TR').trim();\n    } else if (lang === \"\u0130ngilizce\") {\n        normalizedText = text.toLowerCase().trim();\n    } else if (lang === \"\u0130spanyolca\") {\n        normalizedText = text.toLowerCase().trim();\n    }\n\n    // \u00d6zel karakterleri ve t\u0131rnak i\u015faretlerini temizle\n    normalizedText = normalizedText\n        .replace(/[!\"'\u201c\u201d\u2018\u2019:,]/g, ' ') // \u0130ki nokta ve t\u0131rnak i\u015faretlerini bo\u015flukla de\u011fi\u015ftir\n        .replace(/\\s+/g, ' ')         // Birden fazla bo\u015flu\u011fu tek bo\u015flu\u011fa indir\n        .trim();\n\n    return normalizedText;\n}\n*/\n\n/*\nfunction normalize(text, lang) {\n    if (!text) return '';\n    let normalizedText = text;\n\n    // HTML etiketlerini kald\u0131r\n    normalizedText = normalizedText.replace(/<[^>]+>/g, ' ').replace(/\\s+/g, ' ').trim();\n\n    // Dil bazl\u0131 k\u00fc\u00e7\u00fck harfe \u00e7evirme\n    if (lang === \"T\u00fcrk\u00e7e\") {\n        normalizedText = normalizedText.toLocaleLowerCase('tr-TR').trim();\n    } else if (lang === \"\u0130ngilizce\") {\n        normalizedText = normalizedText.toLowerCase().trim();\n    } else if (lang === \"\u0130spanyolca\") {\n        normalizedText = normalizedText.toLowerCase().trim();\n    }\n\n    // \u00d6zel karakterleri ve t\u0131rnak i\u015faretlerini temizle\n    normalizedText = normalizedText\n        .replace(/[!\"'\u201c\u201d\u2018\u2019:,]/g, '') // T\u0131rnaklar\u0131 ve noktalama i\u015faretlerini tamamen kald\u0131r\n        .replace(/\\s+/g, ' ')        // Birden fazla bo\u015flu\u011fu tek bo\u015flu\u011fa indir\n        .trim();\n\n    // T\u00fcrk\u00e7e karakterleri ASCII'ye d\u00f6n\u00fc\u015ft\u00fcrme\n    if (lang === \"T\u00fcrk\u00e7e\") {\n        const turkishMap = {\n            '\u015f': 's',\n            '\u011f': 'g',\n            '\u0131': 'i',\n            '\u00f6': 'o',\n            '\u00e7': 'c',\n            '\u00fc': 'u',\n            '\u015e': 'S',\n            '\u011e': 'G',\n            '\u0130': 'I',\n            '\u00d6': 'O',\n            '\u00c7': 'C',\n            '\u00dc': 'U'\n        };\n        normalizedText = normalizedText.replace(/[\u015f\u011f\u00f6\u00e7\u00fc\u015e\u011e\u00d6\u00c7\u00dc]/g, char => turkishMap[char] || char);\n    }\n\n    return normalizedText;\n}\n*/\n\nfunction normalize(text, lang) {\n    if (!text) return '';\n    let normalizedText = text;\n\n    // HTML etiketlerini kald\u0131r\n    normalizedText = normalizedText.replace(/<[^>]+>/g, ' ').replace(/\\s+/g, ' ').trim();\n\n    // Dil bazl\u0131 k\u00fc\u00e7\u00fck harfe \u00e7evirme\n    if (lang === \"T\u00fcrk\u00e7e\") {\n        normalizedText = normalizedText.toLocaleLowerCase('tr-TR').trim();\n    } else if (lang === \"\u0130ngilizce\") {\n        normalizedText = normalizedText.toLowerCase().trim();\n    } else if (lang === \"\u0130spanyolca\") {\n        normalizedText = normalizedText.toLowerCase().trim();\n    }\n\n    // \u00d6zel karakterleri ve t\u0131rnak i\u015faretlerini temizle\n    normalizedText = normalizedText\n        .replace(/[!\"'\u201c\u201d\u2018\u2019:,]/g, '') // T\u0131rnaklar\u0131 ve noktalama i\u015faretlerini tamamen kald\u0131r\n        .replace(/\\s+/g, ' ')        // Birden fazla bo\u015flu\u011fu tek bo\u015flu\u011fa indir\n        .trim();\n\n    return normalizedText;\n}\n\n\n// Ba\u015fl\u0131k formatlama fonksiyonu\nfunction formatBaslik(title, lang) {\n    if (!title) return '';\n    return title\n        .split(' ')\n        .map(word => {\n            if (lang === \"T\u00fcrk\u00e7e\") {\n                return word.charAt(0).toLocaleUpperCase('tr-TR') + word.slice(1).toLocaleLowerCase('tr-TR');\n            } else {\n                return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n            }\n        })\n        .join(' ');\n}\n\nmakaleBasligi = formatBaslik(makaleBasligi, language);\n\n// Anlaml\u0131 kelime kontrol\u00fc\nfunction isMeaningful(word, lang) {\n    if (!word) return false;\n    let cleanedWord = word.toLowerCase()\n        .replace(/(nin|in|n\u0131n|\u0131n|si|sel|sal|dir|d\u0131r|lar|ler)$/i, '') // T\u00fcrk\u00e7e i\u00e7in\n        .replace(/(s|es|ed|ing)$/i, '') // \u0130ngilizce i\u00e7in\n        .replace(/(s|es|os|as)$/i, '') // \u0130spanyolca i\u00e7in\n        .trim();\n    return cleanedWord.length > 2 &&\n           !stopWords[lang].includes(cleanedWord) &&\n           !locations[lang].includes(cleanedWord);\n}\n\n// N-gram olu\u015fturma\nfunction generateNgrams(words, maxN = 2, lang) {\n    if (!words || !Array.isArray(words)) return [];\n    let ngrams = [];\n    for (let n = 1; n <= maxN; n++) {\n        for (let i = 0; i <= words.length - n; i++) {\n            let ngram = words.slice(i, i + n);\n            if (ngram.every(word => isMeaningful(word.replace(/(nin|in|n\u0131n|\u0131n)$/i, ''), lang))) {\n                ngrams.push(ngram.join(\" \"));\n            }\n        }\n    }\n    return ngrams;\n}\n\n// Odak anahtar kelimeyle \u00e7ak\u0131\u015fmayan ve konuyla alakal\u0131 n-gramlar\u0131 \u00e7\u0131kar\nfunction extractSafeNgrams(content, odakKelime, synonyms, makaleBasligi, lang, maxN = 1) {\n    if (!content) return [];\n\n    // \u0130\u00e7eri\u011fi kelimelere ay\u0131r\n    const allText = content.split(\"\\n\\n\").join(\" \").split(/\\s+/).filter(word => word.trim());\n    const ngrams = generateNgrams(allText, maxN, lang);\n\n    // Odak anahtar kelime, e\u015f anlaml\u0131lar ve ba\u015fl\u0131\u011f\u0131 normalle\u015ftir\n    const normalizedOdakKelime = normalize(odakKelime, lang);\n    const normalizedSynonyms = synonyms.map(syn => normalize(syn, lang));\n    const normalizedMakaleBasligi = normalize(makaleBasligi, lang);\n    const makaleBasligiWords = normalizedMakaleBasligi.split(/\\s+/).filter(word => isMeaningful(word, lang));\n    const odakKelimeWords = normalizedOdakKelime.split(/\\s+/).filter(word => isMeaningful(word, lang));\n\n    // Referans kelimeler (ba\u015fl\u0131k ve odak anahtar kelime kelimeleri)\n    const referenceWords = [...new Set([...makaleBasligiWords, ...odakKelimeWords])];\n\n    // N-gramlar\u0131 filtrele\n    const safeNgrams = ngrams\n        .filter(ngram => {\n            const normalizedNgram = normalize(ngram, lang);\n            // 1. Odak anahtar kelime ve e\u015f anlaml\u0131lar\u0131yla \u00e7ak\u0131\u015fmamal\u0131\n            const containsOdakKelime = normalizedNgram.includes(normalizedOdakKelime) || normalizedOdakKelime.includes(normalizedNgram);\n            const containsSynonym = normalizedSynonyms.some(syn => normalizedNgram.includes(syn) || syn.includes(normalizedNgram));\n            if (containsOdakKelime || containsSynonym) {\n                //console.log(`N-gram filtrelendi (odak kelime veya e\u015f anlaml\u0131 \u00e7ak\u0131\u015fmas\u0131): ${normalizedNgram}`);\n                return false;\n            }\n\n            //  N-gram\u0131n kelimelerini ay\u0131r\n            const ngramWords = normalizedNgram.split(/\\s+/).filter(word => isMeaningful(word, lang));\n\n            //  N-gram\u0131n en az bir kelimesi, ba\u015fl\u0131k veya odak anahtar kelimeyle \u00f6rt\u00fc\u015fmeli\n            const hasRelevance = ngramWords.some(ngramWord =>\n                referenceWords.some(refWord => refWord.includes(ngramWord) || ngramWord.includes(refWord))\n            );\n\n            if (!hasRelevance) {\n               // console.log(`N-gram filtrelendi (alakas\u0131z): ${normalizedNgram}`);\n            }\n\n            return hasRelevance;\n        })\n        .sort((a, b) => {\n            // Alaka skoruna g\u00f6re s\u0131ralama (daha fazla \u00f6rt\u00fc\u015fen n-gramlar \u00f6nce gelir)\n            const scoreA = a.split(/\\s+/).filter(word => referenceWords.some(ref => ref.includes(word) || word.includes(ref))).length; //Kelimelere b\u00f6l, Referans kelimelerle \u00f6rt\u00fc\u015fenleri al, E\u015fle\u015fen kelime say\u0131s\u0131n\u0131 bul\n            const scoreB = b.split(/\\s+/).filter(word => referenceWords.some(ref => ref.includes(word) || word.includes(ref))).length;\n            return scoreB - scoreA; // Descending order (y\u00fcksek skor \u00f6nce)\n        });\n\n    console.log(`Uygun n-gram'lar: ${safeNgrams.join(', ')}`);\n    return safeNgrams;\n}\n\n/*\n// Nofollow ba\u011flant\u0131 ekleme (ikinci alt ba\u015fl\u0131k i\u00e7in)\nfunction addLinksToContent(content, linkUrl, lang) {\n    if (!content || !linkUrl) {\n        console.log(\"addLinksToContent: Eksik veri\", { content: !!content, linkUrl });\n        return { content, linkAdded: false };\n    }\n\n    // Her fonksiyon i\u00e7in ayr\u0131 bir linkedPhrases k\u00fcmesi\n    const linkedPhrases = new Set();\n\n    const safeNgrams = extractSafeNgrams(content, odakKelime, synonyms, makaleBasligi, lang);\n    const twoGrams = safeNgrams.filter(k => k.split(\" \").length === 2);\n    const singleWords = safeNgrams.filter(k => k.split(\" \").length === 1);\n\n    let normalizedContent = normalize(content, lang);\n    let linkAdded = false;\n\n    console.log(`addLinksToContent: \u0130\u00e7erik: ${normalizedContent}`);\n    console.log(`addLinksToContent: 2-gram'lar: ${twoGrams.join(', ')}`);\n    console.log(`addLinksToContent: Tek kelimeler: ${singleWords.join(', ')}`);\n\n    for (let twoGram of twoGrams) {\n        const normalizedTwoGram = normalize(twoGram, lang);\n        if (linkedPhrases.has(normalizedTwoGram)) {\n            console.log(`addLinksToContent: 2-gram zaten ba\u011fland\u0131: ${normalizedTwoGram}`);\n            continue;\n        }\n\n        let regexTwoGram = new RegExp(`\\\\b${normalizedTwoGram}\\\\b`, \"i\");\n        if (regexTwoGram.test(normalizedContent)) {\n            let match = content.match(new RegExp(`\\\\b${twoGram.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`, 'i'));\n            if (match) {\n                let originalMatch = match[0];\n                let replacement = `<a href=\"${linkUrl}\" rel=\"nofollow\">${originalMatch}</a>`;\n                content = content.replace(new RegExp(`\\\\b${twoGram.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`, 'i'), replacement);\n                linkedPhrases.add(normalizedTwoGram);\n                linkAdded = true;\n                console.log(`addLinksToContent: Nofollow ba\u011flant\u0131 eklendi (2-gram): ${twoGram} -> ${linkUrl}`);\n                break;\n            }\n        } else {\n            console.log(`addLinksToContent: 2-gram e\u015fle\u015fmedi: ${normalizedTwoGram}`);\n        }\n    }\n\n    if (!linkAdded) {\n        for (let singleWord of singleWords) {\n            const normalizedSingleWord = normalize(singleWord, lang);\n            if (linkedPhrases.has(normalizedSingleWord)) {\n                console.log(`addLinksToContent: Tek kelime zaten ba\u011fland\u0131: ${normalizedSingleWord}`);\n                continue;\n            }\n\n            let regexSingle = new RegExp(`\\\\b${normalizedSingleWord}\\\\b`, \"i\");\n            if (regexSingle.test(normalizedContent)) {\n                let match = content.match(new RegExp(`\\\\b${singleWord.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`, 'i'));\n                if (match) {\n                    let originalMatch = match[0];\n                    let replacement = `<a href=\"${linkUrl}\" rel=\"nofollow\">${originalMatch}</a>`;\n                    content = content.replace(new RegExp(`\\\\b${singleWord.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`, 'i'), replacement);\n                    linkedPhrases.add(normalizedSingleWord);\n                    linkAdded = true;\n                    console.log(`addLinksToContent: Nofollow ba\u011flant\u0131 eklendi (tek kelime): ${singleWord} -> ${linkUrl}`);\n                    break;\n                }\n            } else {\n                console.log(`addLinksToContent: Tek kelime e\u015fle\u015fmedi: ${normalizedSingleWord}`);\n            }\n        }\n    }\n\n    if (!linkAdded) {\n        console.log(\"addLinksToContent: Uygun n-gram bulunamad\u0131, ba\u011flant\u0131 eklenemedi.\");\n    }\n\n    return { content, linkAdded };\n}\n*/\n\n\n// Nofollow ba\u011flant\u0131 ekleme (ikinci alt ba\u015fl\u0131k i\u00e7in)\nfunction addLinksToContent(content, linkUrl, lang) {\n    if (!content || !linkUrl) {\n        console.log(\"addLinksToContent: Eksik veri\", { content: !!content, linkUrl });\n        return { content, linkAdded: false };\n    }\n    // Her fonksiyon i\u00e7in ayr\u0131 bir linkedPhrases k\u00fcmesi\n    const linkedPhrases = new Set();\n\n    const safeNgrams = extractSafeNgrams(content, odakKelime, synonyms, makaleBasligi, lang);\n    const twoGrams = safeNgrams.filter(k => k.split(\" \").length === 2);\n    const singleWords = safeNgrams.filter(k => k.split(\" \").length === 1);\n\n    let normalizedContent = normalize(content, lang);\n    let linkAdded = false;\n\n    console.log(`addLinksToContent: \u0130\u00e7erik: ${normalizedContent}`);\n    console.log(`addLinksToContent: 2-gram'lar: ${twoGrams.join(', ')}`);\n    console.log(`addLinksToContent: Tek kelimeler: ${singleWords.join(', ')}`);\n\n    // \u00d6nce 2-gram'larla e\u015fle\u015fmeyi dene\n    for (let twoGram of twoGrams) {\n        const normalizedTwoGram = normalize(twoGram, lang);\n        if (linkedPhrases.has(normalizedTwoGram)) {\n            console.log(`addLinksToContent: 2-gram zaten ba\u011fland\u0131: ${normalizedTwoGram}`);\n            continue;\n        }\n\n        let regexTwoGram = new RegExp(`\\\\b${normalizedTwoGram}\\\\b`, \"i\");\n        if (regexTwoGram.test(normalizedContent)) {\n            let match = content.match(new RegExp(`\\\\b${twoGram.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`, 'i'));\n            if (match) {\n                let originalMatch = match[0];\n                let replacement = `<a href=\"${linkUrl}\" rel=\"nofollow\">${originalMatch}</a>`;\n                content = content.replace(new RegExp(`\\\\b${twoGram.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`, 'i'), replacement);\n                linkedPhrases.add(normalizedTwoGram);\n                linkAdded = true;\n                console.log(`addLinksToContent: Nofollow ba\u011flant\u0131 eklendi (2-gram): ${twoGram} -> ${linkUrl}`);\n                break;\n            }\n        } else {\n            console.log(`addLinksToContent: 2-gram e\u015fle\u015fmedi: ${normalizedTwoGram}`);\n        }\n    }\n\n    // E\u011fer 2-gram bulunamazsa, tek kelimelerle e\u015fle\u015fmeyi dene\n    if (!linkAdded) {\n        for (let singleWord of singleWords) {\n            const normalizedSingleWord = normalize(singleWord, lang);\n            if (linkedPhrases.has(normalizedSingleWord)) {\n                console.log(`addLinksToContent: Tek kelime zaten ba\u011fland\u0131: ${normalizedSingleWord}`);\n                continue;\n            }\n\n            let regexSingle = new RegExp(`\\\\b${normalizedSingleWord}\\\\b`, \"i\");\n            if (regexSingle.test(normalizedContent)) {\n                let match = content.match(new RegExp(`\\\\b${singleWord.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`, 'i'));\n                if (match) {\n                    let originalMatch = match[0];\n                    let replacement = `<a href=\"${linkUrl}\" rel=\"nofollow\">${originalMatch}</a>`;\n                    content = content.replace(new RegExp(`\\\\b${singleWord.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`, 'i'), replacement);\n                    linkedPhrases.add(normalizedSingleWord);\n                    linkAdded = true;\n                    console.log(`addLinksToContent: Nofollow ba\u011flant\u0131 eklendi (tek kelime): ${singleWord} -> ${linkUrl}`);\n                    break;\n                }\n            } else {\n                console.log(`addLinksToContent: Tek kelime e\u015fle\u015fmedi: ${normalizedSingleWord}`);\n            }\n        }\n    }\n\n    // E\u011fer uygun n-gram bulunamazsa, i\u00e7eri\u011fin ilk anlaml\u0131 kelimesine ba\u011flant\u0131 ekle\n    if (!linkAdded) {\n        const words = content.split(/\\s+/).filter(word => word.trim());\n        for (let word of words) {\n            const normalizedWord = normalize(word, lang);\n            if (isMeaningful(normalizedWord, lang) && !linkedPhrases.has(normalizedWord)) {\n                let regexWord = new RegExp(`\\\\b${word.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`, 'i');\n                if (regexWord.test(content)) {\n                    let replacement = `<a href=\"${linkUrl}\" rel=\"nofollow\">${word}</a>`;\n                    content = content.replace(regexWord, replacement);\n                    linkedPhrases.add(normalizedWord);\n                    linkAdded = true;\n                    console.log(`addLinksToContent: Nofollow ba\u011flant\u0131 eklendi (ilk anlaml\u0131 kelime): ${word} -> ${linkUrl}`);\n                    break;\n                }\n            }\n        }\n    }\n\n    if (!linkAdded) {\n        console.log(\"addLinksToContent: Uygun kelime bulunamad\u0131, ba\u011flant\u0131 eklenemedi.\");\n    }\n\n    return { content, linkAdded };\n}\n\n/*\n// Follow ba\u011flant\u0131 ekleme (d\u00f6rd\u00fcnc\u00fc alt ba\u015fl\u0131k i\u00e7in)\nfunction addFollowLinkToFourthSubheading(content, disBaglantiArray, index, extractedLinkUrl, lang) {\n    if (!content || index !== 3 || !Array.isArray(disBaglantiArray) || disBaglantiArray.length === 0) {\n        console.log(\"addFollowLinkToFourthSubheading: Eksik veri\", { content: !!content, index, disBaglantiArray });\n        return { content, followLinkAdded: false };\n    }\n\n    let linkUrl = \"\";\n    for (let disLink of disBaglantiArray) {\n        if (disLink !== extractedLinkUrl) {\n            linkUrl = disLink;\n            break;\n        }\n    }\n\n    if (!linkUrl) {\n        console.log(\"addFollowLinkToFourthSubheading: Uygun ba\u011flant\u0131 bulunamad\u0131.\");\n        return { content, followLinkAdded: false };\n    }\n\n    // Her fonksiyon i\u00e7in ayr\u0131 bir linkedPhrases k\u00fcmesi\n    const linkedPhrases = new Set();\n\n    const safeNgrams = extractSafeNgrams(content, odakKelime, synonyms, makaleBasligi, lang);\n    const twoGrams = safeNgrams.filter(k => k.split(\" \").length === 2);\n    const singleWords = safeNgrams.filter(k => k.split(\" \").length === 1);\n\n    let normalizedContent = normalize(content, lang);\n    let followLinkAdded = false;\n\n    console.log(`addFollowLinkToFourthSubheading: \u0130\u00e7erik: ${normalizedContent}`);\n    console.log(`addFollowLinkToFourthSubheading: 2-gram'lar: ${twoGrams.join(', ')}`);\n    console.log(`addFollowLinkToFourthSubheading: Tek kelimeler: ${singleWords.join(', ')}`);\n\n    for (let twoGram of twoGrams) {\n        const normalizedTwoGram = normalize(twoGram, lang);\n        if (linkedPhrases.has(normalizedTwoGram)) {\n            console.log(`addFollowLinkToFourthSubheading: 2-gram zaten ba\u011fland\u0131: ${normalizedTwoGram}`);\n            continue;\n        }\n\n        let regexTwoGram = new RegExp(`\\\\b${normalizedTwoGram}\\\\b`, \"i\");\n        if (regexTwoGram.test(normalizedContent)) {\n            let match = content.match(new RegExp(`\\\\b${twoGram.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`, 'i'));\n            if (match) {\n                let originalMatch = match[0];\n                let replacement = `<a href=\"${linkUrl}\" rel=\"follow\">${originalMatch}</a>`;\n                content = content.replace(new RegExp(`\\\\b${twoGram.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`, 'i'), replacement);\n                linkedPhrases.add(normalizedTwoGram);\n                followLinkAdded = true;\n                console.log(`addFollowLinkToFourthSubheading: Follow ba\u011flant\u0131 eklendi (2-gram): ${twoGram} -> ${linkUrl}`);\n                break;\n            }\n        } else {\n            console.log(`addFollowLinkToFourthSubheading: 2-gram e\u015fle\u015fmedi: ${normalizedTwoGram}`);\n        }\n    }\n\n    if (!followLinkAdded) {\n        for (let singleWord of singleWords) {\n            const normalizedSingleWord = normalize(singleWord, lang);\n            if (linkedPhrases.has(normalizedSingleWord)) {\n                console.log(`addFollowLinkToFourthSubheading: Tek kelime zaten ba\u011fland\u0131: ${normalizedSingleWord}`);\n                continue;\n            }\n\n            let regexSingle = new RegExp(`\\\\b${normalizedSingleWord}\\\\b`, \"i\");\n            if (regexSingle.test(normalizedContent)) {\n                let match = content.match(new RegExp(`\\\\b${singleWord.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`, 'i'));\n                if (match) {\n                    let originalMatch = match[0];\n                    let replacement = `<a href=\"${linkUrl}\" rel=\"follow\">${originalMatch}</a>`;\n                    content = content.replace(new RegExp(`\\\\b${singleWord.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`, 'i'), replacement);\n                    linkedPhrases.add(normalizedSingleWord);\n                    followLinkAdded = true;\n                    console.log(`addFollowLinkToFourthSubheading: Follow ba\u011flant\u0131 eklendi (tek kelime): ${singleWord} -> ${linkUrl}`);\n                    break;\n                }\n            } else {\n                console.log(`addFollowLinkToFourthSubheading: Tek kelime e\u015fle\u015fmedi: ${normalizedSingleWord}`);\n            }\n        }\n    }\n\n    if (!followLinkAdded) {\n        console.log(\"addFollowLinkToFourthSubheading: Uygun n-gram bulunamad\u0131, ba\u011flant\u0131 eklenemedi.\");\n    }\n\n    return { content, followLinkAdded };\n}\n*/\n\n\n// Follow ba\u011flant\u0131 ekleme (d\u00f6rd\u00fcnc\u00fc alt ba\u015fl\u0131k i\u00e7in)\nfunction addFollowLinkToFourthSubheading(content, disBaglantiArray, index, extractedLinkUrl, lang) {\n    if (!content || index !== 3 || !Array.isArray(disBaglantiArray) || disBaglantiArray.length === 0) {\n        console.log(\"addFollowLinkToFourthSubheading: Eksik veri\", { content: !!content, index, disBaglantiArray });\n        return { content, followLinkAdded: false };\n    }\n\n    let linkUrl = \"\";\n    for (let disLink of disBaglantiArray) {\n        if (disLink !== extractedLinkUrl) {\n            linkUrl = disLink;\n            break;\n        }\n    }\n\n    if (!linkUrl) {\n        console.log(\"addFollowLinkToFourthSubheading: Uygun ba\u011flant\u0131 bulunamad\u0131.\");\n        return { content, followLinkAdded: false };\n    }\n\n    // Her fonksiyon i\u00e7in ayr\u0131 bir linkedPhrases k\u00fcmesi\n    const linkedPhrases = new Set();\n\n    const safeNgrams = extractSafeNgrams(content, odakKelime, synonyms, makaleBasligi, lang);\n    const twoGrams = safeNgrams.filter(k => k.split(\" \").length === 2);\n    const singleWords = safeNgrams.filter(k => k.split(\" \").length === 1);\n\n    let normalizedContent = normalize(content, lang);\n    let followLinkAdded = false;\n\n    console.log(`addFollowLinkToFourthSubheading: \u0130\u00e7erik: ${normalizedContent}`);\n    console.log(`addFollowLinkToFourthSubheading: 2-gram'lar: ${twoGrams.join(', ')}`);\n    console.log(`addFollowLinkToFourthSubheading: Tek kelimeler: ${singleWords.join(', ')}`);\n\n    // \u00d6nce 2-gram'larla e\u015fle\u015fmeyi dene\n    for (let twoGram of twoGrams) {\n        const normalizedTwoGram = normalize(twoGram, lang);\n        if (linkedPhrases.has(normalizedTwoGram)) {\n            console.log(`addFollowLinkToFourthSubheading: 2-gram zaten ba\u011fland\u0131: ${normalizedTwoGram}`);\n            continue;\n        }\n\n        let regexTwoGram = new RegExp(`\\\\b${normalizedTwoGram}\\\\b`, \"i\");\n        if (regexTwoGram.test(normalizedContent)) {\n            let match = content.match(new RegExp(`\\\\b${twoGram.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`, 'i'));\n            if (match) {\n                let originalMatch = match[0];\n                let replacement = `<a href=\"${linkUrl}\" rel=\"follow\">${originalMatch}</a>`;\n                content = content.replace(new RegExp(`\\\\b${twoGram.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`, 'i'), replacement);\n                linkedPhrases.add(normalizedTwoGram);\n                followLinkAdded = true;\n                console.log(`addFollowLinkToFourthSubheading: Follow ba\u011flant\u0131 eklendi (2-gram): ${twoGram} -> ${linkUrl}`);\n                break;\n            }\n        } else {\n            console.log(`addFollowLinkToFourthSubheading: 2-gram e\u015fle\u015fmedi: ${normalizedTwoGram}`);\n        }\n    }\n\n    // E\u011fer 2-gram bulunamazsa, tek kelimelerle e\u015fle\u015fmeyi dene\n    if (!followLinkAdded) {\n        for (let singleWord of singleWords) {\n            const normalizedSingleWord = normalize(singleWord, lang);\n            if (linkedPhrases.has(normalizedSingleWord)) {\n                console.log(`addFollowLinkToFourthSubheading: Tek kelime zaten ba\u011fland\u0131: ${normalizedSingleWord}`);\n                continue;\n            }\n\n            let regexSingle = new RegExp(`\\\\b${normalizedSingleWord}\\\\b`, \"i\");\n            if (regexSingle.test(normalizedContent)) {\n                let match = content.match(new RegExp(`\\\\b${singleWord.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`, 'i'));\n                if (match) {\n                    let originalMatch = match[0];\n                    let replacement = `<a href=\"${linkUrl}\" rel=\"follow\">${originalMatch}</a>`;\n                    content = content.replace(new RegExp(`\\\\b${singleWord.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`, 'i'), replacement);\n                    linkedPhrases.add(normalizedSingleWord);\n                    followLinkAdded = true;\n                    console.log(`addFollowLinkToFourthSubheading: Follow ba\u011flant\u0131 eklendi (tek kelime): ${singleWord} -> ${linkUrl}`);\n                    break;\n                }\n            } else {\n                console.log(`addFollowLinkToFourthSubheading: Tek kelime e\u015fle\u015fmedi: ${normalizedSingleWord}`);\n            }\n        }\n    }\n\n    // E\u011fer uygun n-gram bulunamazsa, i\u00e7eri\u011fin ilk anlaml\u0131 kelimesine ba\u011flant\u0131 ekle\n    if (!followLinkAdded) {\n        const words = content.split(/\\s+/).filter(word => word.trim());\n        for (let word of words) {\n            const normalizedWord = normalize(word, lang);\n            if (isMeaningful(normalizedWord, lang) && !linkedPhrases.has(normalizedWord)) {\n                let regexWord = new RegExp(`\\\\b${word.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`, 'i');\n                if (regexWord.test(content)) {\n                    let replacement = `<a href=\"${linkUrl}\" rel=\"follow\">${word}</a>`;\n                    content = content.replace(regexWord, replacement);\n                    linkedPhrases.add(normalizedWord);\n                    followLinkAdded = true;\n                    console.log(`addFollowLinkToFourthSubheading: Follow ba\u011flant\u0131 eklendi (ilk anlaml\u0131 kelime): ${word} -> ${linkUrl}`);\n                    break;\n                }\n            }\n        }\n    }\n\n    if (!followLinkAdded) {\n        console.log(\"addFollowLinkToFourthSubheading: Uygun kelime bulunamad\u0131, ba\u011flant\u0131 eklenemedi.\");\n    }\n\n    return { content, followLinkAdded };\n}\n\n\n// \u0130\u00e7 ba\u011flant\u0131 ekleme\nfunction addInternalLink(content, internalLinkUrl, lang) {\n    if (!content || !internalLinkUrl) {\n        console.log(\"addInternalLink: Eksik veri\", { content: !!content, internalLinkUrl });\n        return { content, internalLinkAdded: false };\n    }\n\n    // Her fonksiyon i\u00e7in ayr\u0131 bir linkedPhrases k\u00fcmesi\n    const linkedPhrases = new Set();\n\n    const safeNgrams = extractSafeNgrams(content, odakKelime, synonyms, makaleBasligi, lang);\n    const twoGrams = safeNgrams.filter(k => k.split(\" \").length === 2);\n    const singleWords = safeNgrams.filter(k => k.split(\" \").length === 1);\n\n    let normalizedContent = normalize(content, lang);\n    let internalLinkAdded = false;\n\n    console.log(`addInternalLink: \u0130\u00e7erik: ${normalizedContent}`);\n    console.log(`addInternalLink: 2-gram'lar: ${twoGrams.join(', ')}`);\n    console.log(`addInternalLink: Tek kelimeler: ${singleWords.join(', ')}`);\n\n    for (let twoGram of twoGrams) {\n        const normalizedTwoGram = normalize(twoGram, lang);\n        if (linkedPhrases.has(normalizedTwoGram)) {\n            console.log(`addInternalLink: 2-gram zaten ba\u011fland\u0131: ${normalizedTwoGram}`);\n            continue;\n        }\n\n        let regexTwoGram = new RegExp(`\\\\b${normalizedTwoGram}\\\\b`, \"i\");\n        if (regexTwoGram.test(normalizedContent)) {\n            let match = content.match(new RegExp(`\\\\b${twoGram.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`, 'i'));\n            if (match) {\n                let originalMatch = match[0];\n                let replacement = `<a href=\"${internalLinkUrl}\">${originalMatch}</a>`;\n                content = content.replace(new RegExp(`\\\\b${twoGram.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`, 'i'), replacement);\n                linkedPhrases.add(normalizedTwoGram);\n                internalLinkAdded = true;\n                console.log(`addInternalLink: \u0130\u00e7 ba\u011flant\u0131 eklendi (2-gram): ${twoGram} -> ${internalLinkUrl}`);\n                break;\n            }\n        } else {\n            console.log(`addInternalLink: 2-gram e\u015fle\u015fmedi: ${normalizedTwoGram}`);\n        }\n    }\n\n    if (!internalLinkAdded) {\n        for (let singleWord of singleWords) {\n            const normalizedSingleWord = normalize(singleWord, lang);\n            if (linkedPhrases.has(normalizedSingleWord)) {\n                console.log(`addInternalLink: Tek kelime zaten ba\u011fland\u0131: ${normalizedSingleWord}`);\n                continue;\n            }\n\n            let regexSingle = new RegExp(`\\\\b${normalizedSingleWord}\\\\b`, \"i\");\n            if (regexSingle.test(normalizedContent)) {\n                let match = content.match(new RegExp(`\\\\b${singleWord.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`, 'i'));\n                if (match) {\n                    let originalMatch = match[0];\n                    let replacement = `<a href=\"${internalLinkUrl}\">${originalMatch}</a>`;\n                    content = content.replace(new RegExp(`\\\\b${singleWord.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`, 'i'), replacement);\n                    linkedPhrases.add(normalizedSingleWord);\n                    internalLinkAdded = true;\n                    console.log(`addInternalLink: \u0130\u00e7 ba\u011flant\u0131 eklendi (tek kelime): ${singleWord} -> ${internalLinkUrl}`);\n                    break;\n                }\n            } else {\n                console.log(`addInternalLink: Tek kelime e\u015fle\u015fmedi: ${normalizedSingleWord}`);\n            }\n        }\n    }\n\n    if (!internalLinkAdded) {\n        console.log(\"addInternalLink: Uygun n-gram bulunamad\u0131, ba\u011flant\u0131 eklenemedi.\");\n    }\n\n    return { content, internalLinkAdded };\n}\n\n/*\n// \u00c7al\u0131\u015fma ba\u015fl\u0131\u011f\u0131na nofollow ba\u011flant\u0131 ekleme\nfunction addNofollowLinkToStudyTitle(content, index, studyTitle, studyUrl, lang) {\n    if (!content || index !== 3 || !studyTitle || !studyUrl) {\n        console.log(\"addNofollowLinkToStudyTitle: Eksik veri\", { content: !!content, index, studyTitle, studyUrl });\n        return { content, nofollowLinkAdded: false };\n    }\n\n    let originalContent = content; // Orijinal metni sakla\n    let normalizedContent = normalize(content, lang);\n    let nofollowLinkAdded = false;\n\n    let cleanStudyTitle = studyTitle.trim().replace(/\\n/g, '');\n    let normalizedStudyTitle = normalize(cleanStudyTitle, lang);\n    let cleanedStudyTitle = normalizedStudyTitle\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n        .replace(/[!\"'\u201c\u201d\u2018\u2019]/g, '[\"\u201c\u201d\u2018\u2019]?');\n    let regexStudyTitle = new RegExp(`(?:[\"\u201c\u201d\u2018\u2019])?${cleanedStudyTitle}(?:[\"\u201c\u201d\u2018\u2019])?`, 'i');\n\n    console.log(\"addNofollowLinkToStudyTitle: Normalle\u015ftirilmi\u015f ba\u015fl\u0131k\", normalizedStudyTitle);\n    console.log(\"addNofollowLinkToStudyTitle: Ba\u015fl\u0131k regex\", regexStudyTitle);\n    console.log(\"addNofollowLinkToStudyTitle: Normalle\u015ftirilmi\u015f i\u00e7erik\", normalizedContent);\n\n    let match = normalizedContent.match(regexStudyTitle);\n    if (match) {\n        let cleanedStudyTitleForOriginal = cleanStudyTitle\n            .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n            .replace(/[!\"'\u201c\u201d\u2018\u2019]/g, '[\"\u201c\u201d\u2018\u2019]?');\n        let regexOriginal = new RegExp(`(?:[\"\u201c\u201d\u2018\u2019])?${cleanedStudyTitleForOriginal}(?:[\"\u201c\u201d\u2018\u2019])?`, 'i');\n        let originalContentMatch = originalContent.match(regexOriginal);\n\n        if (originalContentMatch) {\n            let originalMatch = originalContentMatch[0];\n            let replacement = `<a href=\"${studyUrl}\" rel=\"nofollow\">${originalMatch}</a>`;\n            content = originalContent.replace(regexOriginal, replacement);\n            nofollowLinkAdded = true;\n            console.log(\"addNofollowLinkToStudyTitle: Ba\u011flant\u0131 eklendi\", { originalMatch, studyUrl, updatedContent: content });\n        } else {\n            let startIndex = match.index;\n            let matchedText = match[0];\n            let contextWindow = 50;\n            let debugSnippet = content.slice(Math.max(0, startIndex - contextWindow), startIndex + matchedText.length + contextWindow);\n            console.log(\"addNofollowLinkToStudyTitle: Orijinal i\u00e7erikte e\u015fle\u015fme ba\u015far\u0131s\u0131z\", {\n                startIndex,\n                matchedText,\n                debugSnippet,\n                originalStudyTitle: cleanStudyTitle\n            });\n        }\n    } else {\n        console.log(\"addNofollowLinkToStudyTitle: Ba\u015fl\u0131k metinde bulunamad\u0131\", { studyTitle, normalizedStudyTitle });\n    }\n\n    return { content, nofollowLinkAdded };\n}\n*/\nfunction addNofollowLinkToStudyTitle(content, index, studyTitle, studyUrl, lang) {\n    if (!content || index !== 3 || !studyTitle || !studyUrl) {\n        console.log(\"addNofollowLinkToStudyTitle: Eksik veri\", { content: !!content, index, studyTitle, studyUrl });\n        return { content, nofollowLinkAdded: false };\n    }\n\n    let originalContent = content; // Orijinal metni sakla\n    let normalizedContent = normalize(content, lang);\n    let nofollowLinkAdded = false;\n\n    let cleanStudyTitle = studyTitle.trim().replace(/\\n/g, '');\n    let normalizedStudyTitle = normalize(cleanStudyTitle, lang);\n    let escapedStudyTitle = normalizedStudyTitle\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n        .replace(/\\s+/g, '\\\\s'); // \\s+ yerine \\s kullan\u0131ld\u0131\n    // Kelime s\u0131n\u0131rlar\u0131n\u0131 kald\u0131rarak ba\u011flam i\u00e7inde e\u015fle\u015fmeyi sa\u011fla\n    let regexStudyTitle = new RegExp(`(?:[\"\u201c\u201d\u2018\u2019])?(?:\\\\S+\\\\s+)*${escapedStudyTitle}(?:\\\\s+\\\\S+)*(?:[\"\u201c\u201d\u2018\u2019])?(?![^<]*>)`, 'i');\n\n    console.log(\"addNofollowLinkToStudyTitle: Normalle\u015ftirilmi\u015f ba\u015fl\u0131k\", normalizedStudyTitle);\n    console.log(\"addNofollowLinkToStudyTitle: Ba\u015fl\u0131k regex\", regexStudyTitle);\n    console.log(\"addNofollowLinkToStudyTitle: Normalle\u015ftirilmi\u015f i\u00e7erik (tam)\", normalizedContent);\n\n    if (regexStudyTitle.test(normalizedContent)) {\n        let match = originalContent.match(new RegExp(`(?:[\"\u201c\u201d\u2018\u2019])?${cleanStudyTitle.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}(?:[\"\u201c\u201d\u2018\u2019])?(?![^<]*>)`, 'i'));\n        if (match) {\n            let originalMatch = match[0];\n            let replacement = `<a href=\"${studyUrl}\" rel=\"nofollow\">${originalMatch}</a>`;\n            content = originalContent.replace(new RegExp(`(?:[\"\u201c\u201d\u2018\u2019])?${cleanStudyTitle.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}(?:[\"\u201c\u201d\u2018\u2019])?(?![^<]*>)`, 'i'), replacement);\n            nofollowLinkAdded = true;\n            console.log(\"addNofollowLinkToStudyTitle: Ba\u011flant\u0131 eklendi\", { originalMatch, studyUrl, newContentSnippet: content.slice(match.index - 10, match.index + 50) });\n        } else {\n            console.log(\"addNofollowLinkToStudyTitle: Orijinal i\u00e7erikte e\u015fle\u015fme ba\u015far\u0131s\u0131z\", {\n                studyTitle: cleanStudyTitle,\n                normalizedStudyTitle,\n                contentSnippet: originalContent.slice(0, 200)\n            });\n        }\n    } else {\n        console.log(\"addNofollowLinkToStudyTitle: Ba\u015fl\u0131k metinde bulunamad\u0131\", { studyTitle, normalizedStudyTitle });\n    }\n\n    if (content.includes('rel=\"nofollow\"') && !content.match(/<a[^>]*rel=\"nofollow\"[^>]*>/)) {\n        console.log(\"addNofollowLinkToStudyTitle: rel='nofollow' etiket d\u0131\u015f\u0131 tespit edildi\", { contentSnippet: content.slice(0, 200) });\n    }\n\n    return { content, nofollowLinkAdded };\n}\n\n\n/*\n// Kal\u0131n ve italik ekleme\nfunction addBoldAndItalic(fullContent, odakKelime, synonyms, lang) {\n    if (!fullContent || !odakKelime) {\n        console.log(\"Hata: \u0130\u00e7erik veya odak kelime eksik.\");\n        return fullContent || '';\n    }\n\n    const keywords = [odakKelime, ...synonyms]\n        .filter(kw => kw && kw.trim())\n        .map(kw => kw.replace(/\\n/g, '').trim());\n    console.log(\"\u0130\u015flenen kelimeler:\", keywords);\n\n    const getRandomCount = () => Math.floor(Math.random() * 3) + 2;\n    const boldCounts = keywords.reduce((acc, kw) => ({ ...acc, [kw]: getRandomCount() }), {});\n    const italicCounts = keywords.reduce((acc, kw) => ({ ...acc, [kw]: getRandomCount() }), {});\n    console.log(\"Her kelime i\u00e7in bold say\u0131lar\u0131:\", boldCounts);\n    console.log(\"Her kelime i\u00e7in italic say\u0131lar\u0131:\", italicCounts);\n\n    const appliedCounts = keywords.reduce((acc, kw) => ({\n        ...acc,\n        [kw]: { bold: 0, italic: 0 }\n    }), {});\n\n    let modifiedContent = fullContent;\n    const paragraphs = fullContent.split('||PARAGRAPH||').filter(p => p.trim());\n    console.log(\"Toplam paragraf say\u0131s\u0131:\", paragraphs.length);\n\n    keywords.forEach(keyword => {\n        if (!keyword) return;\n\n        const keywordParts = keyword.split(/\\s+/);\n        const lastWord = keywordParts[keywordParts.length - 1];\n        const baseKeyword = keywordParts.slice(0, -1).join(' ');\n        let lastWordVariations;\n\n        if (lang === \"T\u00fcrk\u00e7e\") {\n            lastWordVariations = `${lastWord}(lar|ler)?`;\n        } else if (lang === \"\u0130ngilizce\") {\n            lastWordVariations = `${lastWord}(s)?`;\n        } else if (lang === \"\u0130spanyolca\") {\n            lastWordVariations = lastWord.endsWith('a') || lastWord.endsWith('e') || lastWord.endsWith('o')\n                ? `${lastWord}(s)?`\n                : `${lastWord}(es)?`;\n        }\n\n        const normalizedKeyword = normalize(keyword, lang);\n        const regexPattern = baseKeyword\n            ? `${baseKeyword}\\\\s+${lastWordVariations}`\n            : lastWordVariations;\n\n        const regex = new RegExp(`(${regexPattern})(?![^<]*>)`, 'gi');\n        console.log(`Kelime i\u00e7in olu\u015fturulan regex: ${regex}`);\n\n        let matches = [];\n        paragraphs.forEach((paragraph, paraIndex) => {\n            const normalizeParagraph = normalize(paragraph, lang);\n            let match;\n            const tempRegex = new RegExp(`(${regexPattern})(?![^<]*>)`, 'gi');\n            while ((match = tempRegex.exec(normalizeParagraph)) !== null) {\n                const originalText = paragraph.slice(match.index, match.index + match[0].length);\n                const beforeMatch = paragraph.slice(0, match.index);\n                const lastOpenTag = beforeMatch.lastIndexOf('<');\n                const lastCloseTag = beforeMatch.lastIndexOf('>');\n                if (lastOpenTag < lastCloseTag || lastOpenTag === -1) {\n                    matches.push({\n                        text: originalText,\n                        index: match.index,\n                        paraIndex,\n                        alreadyBold: paragraph.slice(Math.max(0, match.index - 3), match.index).includes('<b>'),\n                        alreadyItalic: paragraph.slice(Math.max(0, match.index - 3), match.index).includes('<i>')\n                    });\n                }\n            }\n        });\n\n        if (matches.length === 0) {\n            //console.log(`Kelime \"${keyword}\" i\u00e7in e\u015fle\u015fme bulunamad\u0131. Metin \u00f6rne\u011fi:`, fullContent.slice(0, 200));\n            return;\n        }\n\n        console.log(`Kelime \"${keyword}\" i\u00e7in ${matches.length} e\u015fle\u015fme bulundu:`, matches);\n\n        const shuffleArray = (array) => {\n            for (let i = array.length - 1; i > 0; i--) {\n                const j = Math.floor(Math.random() * (i + 1));\n                [array[i], array[j]] = [array[j], array[i]];\n            }\n            return array;\n        };\n\n        const targetBold = boldCounts[keyword];\n        const targetItalic = italicCounts[keyword];\n        let selectedBold = [];\n        let selectedItalic = [];\n\n        let shuffledMatches = shuffleArray([...matches]);\n        for (let i = 0; i < targetBold && i < shuffledMatches.length; i++) {\n            const match = shuffledMatches[i];\n            if (!match.alreadyBold) {\n                selectedBold.push(match);\n            }\n        }\n\n        shuffledMatches = shuffleArray([...matches]);\n        for (let i = 0; i < targetItalic && i < shuffledMatches.length; i++) {\n            const match = shuffledMatches[i];\n            if (!match.alreadyItalic && !selectedBold.some(b => b.paraIndex === match.paraIndex && b.index === match.index)) {\n                selectedItalic.push(match);\n            }\n        }\n\n        selectedBold.forEach(match => {\n            const paragraph = paragraphs[match.paraIndex];\n            const matchText = match.text;\n            const normalizedMatchText = normalize(matchText, lang);\n            const escapedText = normalizedMatchText.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n            const lastWordInMatch = matchText.split(/\\s+/).pop();\n            let lastWordRegex;\n\n            if (lang === \"T\u00fcrk\u00e7e\") {\n                lastWordRegex = `${lastWordInMatch}(lar|ler)?`;\n            } else if (lang === \"\u0130ngilizce\") {\n                lastWordRegex = `${lastWordInMatch}(s)?`;\n            } else if (lang === \"\u0130spanyolca\") {\n                lastWordRegex = lastWordInMatch.endsWith('a') || lastWordInMatch.endsWith('e') || lastWordInMatch.endsWith('o')\n                    ? `${lastWordInMatch}(s)?`\n                    : `${lastWordInMatch}(es)?`;\n            }\n\n            const regexExact = new RegExp(`(?<=\\\\s|^)${escapedText.replace(lastWordInMatch, lastWordRegex)}(?=\\\\s|$|[.,!?;])`, 'i');\n            let newParagraph = paragraph;\n\n            if (regexExact.test(normalize(paragraph, lang))) {\n                const matchedText = paragraph.match(regexExact)[0];\n                newParagraph = paragraph.replace(regexExact, `<b>${matchedText}</b>`);\n                paragraphs[match.paraIndex] = newParagraph;\n                appliedCounts[keyword].bold++;\n                console.log(`Bold eklendi: \"${matchedText}\" at paraIndex ${match.paraIndex}`);\n            } else {\n                //console.log(`Bold eklenemedi: \"${matchText}\" at paraIndex ${match.paraIndex}, regex: ${regexExact}`);\n               // console.log(`Paragraf i\u00e7eri\u011fi: \"${paragraph}\"`);\n            }\n        });\n\n        selectedItalic.forEach(match => {\n            const paragraph = paragraphs[match.paraIndex];\n            const matchText = match.text;\n            const normalizedMatchText = normalize(matchText, lang);\n            const escapedText = normalizedMatchText.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n            const lastWordInMatch = matchText.split(/\\s+/).pop();\n            let lastWordRegex;\n\n            if (lang === \"T\u00fcrk\u00e7e\") {\n                lastWordRegex = `${lastWordInMatch}(lar|ler)?`;\n            } else if (lang === \"\u0130ngilizce\") {\n                lastWordRegex = `${lastWordInMatch}(s)?`;\n            } else if (lang === \"\u0130spanyolca\") {\n                lastWordRegex = lastWordInMatch.endsWith('a') || lastWordInMatch.endsWith('e') || lastWordInMatch.endsWith('o')\n                    ? `${lastWordInMatch}(s)?`\n                    : `${lastWordInMatch}(es)?`;\n            }\n\n            const regexExact = new RegExp(`(?<=\\\\s|^)${escapedText.replace(lastWordInMatch, lastWordRegex)}(?=\\\\s|$|[.,!?;])`, 'i');\n            let newParagraph = paragraph;\n\n            if (regexExact.test(normalize(paragraph, lang))) {\n                const matchedText = paragraph.match(regexExact)[0];\n                newParagraph = paragraph.replace(regexExact, `<i>${matchedText}</i>`);\n                paragraphs[match.paraIndex] = newParagraph;\n                appliedCounts[keyword].italic++;\n                console.log(`Italic eklendi: \"${matchedText}\" at paraIndex ${match.paraIndex}`);\n            } else {\n                //console.log(`Italic eklenemedi: \"${matchText}\" at paraIndex ${match.paraIndex}, regex: ${regexExact}`);\n                //console.log(`Paragraf i\u00e7eri\u011fi: \"${paragraph}\"`);\n            }\n        });\n\n        console.log(`Kelime \"${keyword}\" i\u00e7in uyguland\u0131: ${appliedCounts[keyword].bold} <b>, ${appliedCounts[keyword].italic} <i>`);\n    });\n\n    modifiedContent = paragraphs.join('||PARAGRAPH||');\n    console.log(\"addBoldAndItalic: \u0130\u015flenmi\u015f i\u00e7erik:\", modifiedContent.slice(0, 200));\n    return modifiedContent;\n}\n*/\n\n\n/*\nfunction addBoldAndItalic(fullContent, odakKelime, synonyms, lang) {\n    if (!fullContent || !odakKelime) {\n        console.log(\"Hata: \u0130\u00e7erik veya odak kelime eksik.\");\n        return fullContent || '';\n    }\n\n    const keywords = [odakKelime, ...synonyms]\n        .filter(kw => kw && kw.trim())\n        .map(kw => kw.replace(/\\n/g, '').trim());\n    console.log(\"\u0130\u015flenen kelimeler:\", keywords);\n\n    const getRandomCount = () => Math.floor(Math.random() * 3) + 2;\n    const boldCounts = keywords.reduce((acc, kw) => ({ ...acc, [kw]: getRandomCount() }), {});\n    const italicCounts = keywords.reduce((acc, kw) => ({ ...acc, [kw]: getRandomCount() }), {});\n    console.log(\"Her kelime i\u00e7in bold say\u0131lar\u0131:\", boldCounts);\n    console.log(\"Her kelime i\u00e7in italic say\u0131lar\u0131:\", italicCounts);\n\n    const appliedCounts = keywords.reduce((acc, kw) => ({\n        ...acc,\n        [kw]: { bold: 0, italic: 0 }\n    }), {});\n\n    let modifiedContent = fullContent;\n    const paragraphs = fullContent.split('||PARAGRAPH||').filter(p => p.trim());\n    console.log(\"Toplam paragraf say\u0131s\u0131:\", paragraphs.length);\n\n    keywords.forEach(keyword => {\n        if (!keyword) return;\n\n        const keywordParts = keyword.split(/\\s+/);\n        const lastWord = keywordParts[keywordParts.length - 1];\n        const baseKeyword = keywordParts.slice(0, -1).join(' ');\n        let lastWordVariations;\n\n        if (lang === \"T\u00fcrk\u00e7e\") {\n            lastWordVariations = `${lastWord}(?:lar|ler)?`;\n        } else if (lang === \"\u0130ngilizce\") {\n            lastWordVariations = `${lastWord}(?:s)?`;\n        } else if (lang === \"\u0130spanyolca\") {\n            lastWordVariations = lastWord.endsWith('a') || lastWord.endsWith('e') || lastWord.endsWith('o')\n                ? `${lastWord}(?:s)?`\n                : `${lastWord}(?:es)?`;\n        }\n\n        const normalizedKeyword = normalize(keyword, lang);\n        const regexPattern = baseKeyword\n            ? `\\\\b${baseKeyword}\\\\s+${lastWordVariations}\\\\b`\n            : `\\\\b${lastWordVariations}\\\\b`;\n\n        const regex = new RegExp(`(${regexPattern})(?![^<]*>)`, 'gi');\n        console.log(`Kelime i\u00e7in olu\u015fturulan regex: ${regex}`);\n\n        let matches = [];\n        paragraphs.forEach((paragraph, paraIndex) => {\n            const normalizedParagraph = normalize(paragraph, lang);\n            let match;\n            while ((match = regex.exec(normalizedParagraph)) !== null) {\n                const originalText = paragraph.slice(match.index, match.index + match[0].length);\n                const normalizedMatchText = normalize(originalText, lang);\n                if (normalizedMatchText !== normalizedKeyword) {\n                    console.log(`E\u015fle\u015fme reddedildi: \"${originalText}\" tam olarak \"${keyword}\" ile e\u015fle\u015fmiyor.`);\n                    continue;\n                }\n                const beforeMatch = paragraph.slice(0, match.index);\n                const lastOpenTag = beforeMatch.lastIndexOf('<');\n                const lastCloseTag = beforeMatch.lastIndexOf('>');\n                if (lastOpenTag < lastCloseTag || lastOpenTag === -1) {\n                    matches.push({\n                        text: originalText,\n                        index: match.index,\n                        paraIndex,\n                        alreadyBold: paragraph.slice(Math.max(0, match.index - 3), match.index).includes('<b>'),\n                        alreadyItalic: paragraph.slice(Math.max(0, match.index - 3), match.index).includes('<i>')\n                    });\n                }\n            }\n        });\n\n        if (matches.length === 0) {\n            console.log(`Kelime \"${keyword}\" i\u00e7in e\u015fle\u015fme bulunamad\u0131. Metin \u00f6rne\u011fi:`, fullContent.slice(0, 200));\n            return;\n        }\n\n        console.log(`Kelime \"${keyword}\" i\u00e7in ${matches.length} e\u015fle\u015fme bulundu:`, matches);\n\n        const shuffleArray = (array) => {\n            for (let i = array.length - 1; i > 0; i--) {\n                const j = Math.floor(Math.random() * (i + 1));\n                [array[i], array[j]] = [array[j], array[i]];\n            }\n            return array;\n        };\n\n        const targetBold = boldCounts[keyword];\n        const targetItalic = italicCounts[keyword];\n        let selectedBold = [];\n        let selectedItalic = [];\n\n        let shuffledMatches = shuffleArray([...matches]);\n        for (let i = 0; i < targetBold && i < shuffledMatches.length; i++) {\n            const match = shuffledMatches[i];\n            if (!match.alreadyBold) {\n                selectedBold.push(match);\n            }\n        }\n\n        shuffledMatches = shuffleArray([...matches]);\n        for (let i = 0; i < targetItalic && i < shuffledMatches.length; i++) {\n            const match = shuffledMatches[i];\n            if (!match.alreadyItalic && !selectedBold.some(b => b.paraIndex === match.paraIndex && b.index === match.index)) {\n                selectedItalic.push(match);\n            }\n        }\n\n        selectedBold.forEach(match => {\n            const paragraph = paragraphs[match.paraIndex];\n            const matchText = match.text;\n            const escapedText = matchText.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n            const regexExact = new RegExp(`\\\\b${escapedText}\\\\b(?![^<]*>)`, 'i');\n            let newParagraph = paragraph;\n\n            if (regexExact.test(paragraph)) {\n                const matchedText = paragraph.match(regexExact)[0];\n                newParagraph = paragraph.replace(regexExact, `<b>${matchedText}</b>`);\n                paragraphs[match.paraIndex] = newParagraph;\n                appliedCounts[keyword].bold++;\n                console.log(`Bold eklendi: \"${matchedText}\" at paraIndex ${match.paraIndex}`);\n            }\n        });\n\n        selectedItalic.forEach(match => {\n            const paragraph = paragraphs[match.paraIndex];\n            const matchText = match.text;\n            const escapedText = matchText.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n            const regexExact = new RegExp(`\\\\b${escapedText}\\\\b(?![^<]*>)`, 'i');\n            let newParagraph = paragraph;\n\n            if (regexExact.test(paragraph)) {\n                const matchedText = paragraph.match(regexExact)[0];\n                newParagraph = paragraph.replace(regexExact, `<i>${matchedText}</i>`);\n                paragraphs[match.paraIndex] = newParagraph;\n                appliedCounts[keyword].italic++;\n                console.log(`Italic eklendi: \"${matchedText}\" at paraIndex ${match.paraIndex}`);\n            }\n        });\n\n        console.log(`Kelime \"${keyword}\" i\u00e7in uyguland\u0131: ${appliedCounts[keyword].bold} <b>, ${appliedCounts[keyword].italic} <i>`);\n    });\n\n    modifiedContent = paragraphs.join('||PARAGRAPH||');\n    console.log(\"addBoldAndItalic: \u0130\u015flenmi\u015f i\u00e7erik:\", modifiedContent.slice(0, 200));\n    return modifiedContent;\n}\n\n*/\n\n\nfunction addBoldAndItalic(fullContent, odakKelime, synonyms, lang) {\n    if (!fullContent || !odakKelime) {\n        console.log(\"Hata: \u0130\u00e7erik veya odak kelime eksik.\");\n        return fullContent || '';\n    }\n\n    const keywords = [odakKelime, ...synonyms]\n        .filter(kw => kw && kw.trim())\n        .map(kw => kw.replace(/\\n/g, '').trim());\n    console.log(\"\u0130\u015flenen kelimeler:\", keywords);\n\n    const getRandomCount = () => Math.floor(Math.random() * 3) + 2;\n    const boldCounts = keywords.reduce((acc, kw) => ({ ...acc, [kw]: getRandomCount() }), {});\n    const italicCounts = keywords.reduce((acc, kw) => ({ ...acc, [kw]: getRandomCount() }), {});\n    console.log(\"Her kelime i\u00e7in bold say\u0131lar\u0131:\", boldCounts);\n    console.log(\"Her kelime i\u00e7in italic say\u0131lar\u0131:\", italicCounts);\n\n    const appliedCounts = keywords.reduce((acc, kw) => ({\n        ...acc,\n        [kw]: { bold: 0, italic: 0 }\n    }), {});\n\n    let modifiedContent = fullContent;\n    const paragraphs = fullContent.split('||PARAGRAPH||').filter(p => p.trim());\n    console.log(\"Toplam paragraf say\u0131s\u0131:\", paragraphs.length);\n\n    keywords.forEach(keyword => {\n        if (!keyword) return;\n\n        const normalizedKeyword = normalize(keyword, lang);\n        const escapedKeyword = normalizedKeyword.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n        const regexPattern = `\\\\b${escapedKeyword}\\\\b`;\n        const regex = new RegExp(`(${regexPattern})(?![^<]*>)`, 'gi');\n        console.log(`Kelime i\u00e7in olu\u015fturulan regex: ${regex}`);\n\n        let matches = [];\n        paragraphs.forEach((paragraph, paraIndex) => {\n            // Orijinal metin \u00fczerinde regex \u00e7al\u0131\u015ft\u0131r\u0131yoruz\n            let match;\n            while ((match = regex.exec(paragraph)) !== null) {\n                const originalText = match[0]; // Do\u011frudan e\u015fle\u015fen metni al\u0131yoruz\n                const normalizedMatchText = normalize(originalText, lang);\n                if (normalizedMatchText !== normalizedKeyword) {\n                    console.log(`E\u015fle\u015fme reddedildi: \"${originalText}\" tam olarak \"${keyword}\" ile e\u015fle\u015fmiyor.`);\n                    continue;\n                }\n                const beforeMatch = paragraph.slice(0, match.index);\n                const lastOpenTag = beforeMatch.lastIndexOf('<');\n                const lastCloseTag = beforeMatch.lastIndexOf('>');\n                if (lastOpenTag < lastCloseTag || lastOpenTag === -1) {\n                    matches.push({\n                        text: originalText,\n                        index: match.index,\n                        paraIndex,\n                        alreadyBold: paragraph.slice(Math.max(0, match.index - 3), match.index).includes('<b>'),\n                        alreadyItalic: paragraph.slice(Math.max(0, match.index - 3), match.index).includes('<i>')\n                    });\n                }\n            }\n        });\n\n        if (matches.length === 0) {\n            console.log(`Kelime \"${keyword}\" i\u00e7in e\u015fle\u015fme bulunamad\u0131. Metin \u00f6rne\u011fi:`, fullContent.slice(0, 200));\n            return;\n        }\n\n        console.log(`Kelime \"${keyword}\" i\u00e7in ${matches.length} e\u015fle\u015fme bulundu:`, matches);\n\n        const shuffleArray = (array) => {\n            for (let i = array.length - 1; i > 0; i--) {\n                const j = Math.floor(Math.random() * (i + 1));\n                [array[i], array[j]] = [array[j], array[i]];\n            }\n            return array;\n        };\n\n        const targetBold = boldCounts[keyword];\n        const targetItalic = italicCounts[keyword];\n        let selectedBold = [];\n        let selectedItalic = [];\n\n        let shuffledMatches = shuffleArray([...matches]);\n        for (let i = 0; i < targetBold && i < shuffledMatches.length; i++) {\n            const match = shuffledMatches[i];\n            if (!match.alreadyBold && selectedBold.length < targetBold) {\n                selectedBold.push(match);\n            }\n        }\n\n        shuffledMatches = shuffleArray([...matches]);\n        let remainingMatches = shuffledMatches.filter(match => \n            !selectedBold.some(b => b.paraIndex === match.paraIndex && b.index === match.index)\n        );\n        for (let i = 0; i < targetItalic && i < remainingMatches.length; i++) {\n            const match = remainingMatches[i];\n            if (!match.alreadyItalic && selectedItalic.length < targetItalic) {\n                selectedItalic.push(match);\n            }\n        }\n\n        selectedBold.forEach(match => {\n            const paragraph = paragraphs[match.paraIndex];\n            const matchText = match.text;\n            const escapedText = matchText.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n            const regexExact = new RegExp(`\\\\b${escapedText}\\\\b(?![^<]*>)`, 'i');\n            let newParagraph = paragraph;\n\n            if (regexExact.test(paragraph)) {\n                const matchedText = paragraph.match(regexExact)[0];\n                newParagraph = paragraph.replace(regexExact, `<b>${matchedText}</b>`);\n                paragraphs[match.paraIndex] = newParagraph;\n                appliedCounts[keyword].bold++;\n                console.log(`Bold eklendi: \"${matchedText}\" at paraIndex ${match.paraIndex}`);\n            }\n        });\n\n        selectedItalic.forEach(match => {\n            const paragraph = paragraphs[match.paraIndex];\n            const matchText = match.text;\n            const escapedText = matchText.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n            const regexExact = new RegExp(`\\\\b${escapedText}\\\\b(?![^<]*>)`, 'i');\n            let newParagraph = paragraph;\n\n            if (regexExact.test(paragraph)) {\n                const matchedText = paragraph.match(regexExact)[0];\n                newParagraph = paragraph.replace(regexExact, `<i>${matchedText}</i>`);\n                paragraphs[match.paraIndex] = newParagraph;\n                appliedCounts[keyword].italic++;\n                console.log(`Italic eklendi: \"${matchedText}\" at paraIndex ${match.paraIndex}`);\n            }\n        });\n\n        console.log(`Kelime \"${keyword}\" i\u00e7in uyguland\u0131: ${appliedCounts[keyword].bold} <b>, ${appliedCounts[keyword].italic} <i>`);\n    });\n\n    modifiedContent = paragraphs.join('||PARAGRAPH||');\n    console.log(\"addBoldAndItalic: \u0130\u015flenmi\u015f i\u00e7erik:\", modifiedContent.slice(0, 200));\n    return modifiedContent;\n}\n\n\n\n// Slug olu\u015fturma fonksiyonu\nfunction createSlug(text, lang) {\n    if (!text) return '';\n    let slug = normalize(text, lang)\n        .replace(/[^\\w\\s-]/g, '') // \u00d6zel karakterleri kald\u0131r\n        .replace(/\\s+/g, '-')     // Bo\u015fluklar\u0131 tireye \u00e7evir\n        .replace(/-+/g, '-')      // Birden fazla tireyi tek tireye indirge\n        .trim();\n    return slug;\n}\n\nfunction formatISODate(date) {\n    return date.toISOString();\n}\n\n\n\nfunction convertToHTML(makaleBasligi, altBasliklar, icerikler, girisMetni, imageUrl, disBaglantiArray, faqItems, summary, lang) {\n    // Breadcrumb i\u00e7in \"Ana Sayfa\" etiketi\n    let homeLabel = '';\n    switch (lang) {\n        case \"T\u00fcrk\u00e7e\":\n            homeLabel = \"Ana Sayfa\";\n            break;\n        case \"\u0130ngilizce\":\n            homeLabel = \"Home\";\n            break;\n        case \"\u0130spanyolca\":\n            homeLabel = \"Inicio\";\n            break;\n        default:\n            homeLabel = \"Ana Sayfa\";\n    }\n\n    // Breadcrumb \u015femas\u0131 olu\u015ftur\n    const baseUrl = siteUrl ? `${siteUrl}` : \"https://example.com\"; // siteUrl yoksa varsay\u0131lan bir de\u011fer\n    const makaleSlug = createSlug(makaleBasligi || \"untitled\", lang); // makaleBasligi yoksa varsay\u0131lan\n    const makaleUrl = `${baseUrl}/${makaleSlug}`;\n\n    // Verileri logla\n    console.log(\"Breadcrumb i\u00e7in kullan\u0131lan veriler:\", { siteUrl, baseUrl, makaleBasligi, makaleSlug, makaleUrl, altBasliklar });\n\n    // Breadcrumb \u00f6\u011felerini olu\u015ftur\n    const breadcrumbItems = [];\n\n    // \u0130lk \u00f6\u011fe: Ana Sayfa\n    if (baseUrl && homeLabel) {\n        breadcrumbItems.push({\n            \"@type\": \"ListItem\",\n            \"position\": 1,\n            \"name\": homeLabel,\n            \"item\": baseUrl\n        });\n    } else {\n        console.warn(\"Ana Sayfa breadcrumb \u00f6\u011fesi eklenemedi: baseUrl veya homeLabel eksik.\");\n    }\n\n    // \u0130kinci \u00f6\u011fe: Makale Ba\u015fl\u0131\u011f\u0131\n    if (makaleBasligi && makaleUrl) {\n        breadcrumbItems.push({\n            \"@type\": \"ListItem\",\n            \"position\": 2,\n            \"name\": makaleBasligi,\n            \"item\": makaleUrl\n        });\n    } else {\n        console.warn(\"Makale breadcrumb \u00f6\u011fesi eklenemedi: makaleBasligi veya makaleUrl eksik.\");\n    }\n\n    // Alt ba\u015fl\u0131klar\u0131 breadcrumb'e ekle\n    if (Array.isArray(altBasliklar) && altBasliklar.length > 0) {\n        altBasliklar.forEach((subheading, index) => {\n            if (subheading) {\n                const subheadingSlug = createSlug(subheading, lang);\n                const subheadingUrl = `${makaleUrl}/${subheadingSlug}`;\n                breadcrumbItems.push({\n                    \"@type\": \"ListItem\",\n                    \"position\": 3 + index,\n                    \"name\": subheading,\n                    \"item\": subheadingUrl\n                });\n            } else {\n                console.warn(`Alt ba\u015fl\u0131k breadcrumb'e eklenemedi: subheading eksik (index: ${index})`);\n            }\n        });\n    } else {\n        console.log(\"Alt ba\u015fl\u0131klar breadcrumb'e eklenmedi: altBasliklar dizisi bo\u015f veya ge\u00e7ersiz.\");\n    }\n\n    // Son \u00f6\u011fe: Mevcut Makale Ba\u015fl\u0131\u011f\u0131 (item olmadan)\n    if (makaleBasligi) {\n        breadcrumbItems.push({\n            \"@type\": \"ListItem\",\n            \"position\": breadcrumbItems.length + 1,\n            \"name\": makaleBasligi\n        });\n    } else {\n        console.warn(\"Son breadcrumb \u00f6\u011fesi eklenemedi: makaleBasligi eksik.\");\n    }\n\n    // Breadcrumb \u015femas\u0131n\u0131 olu\u015ftur\n    const breadcrumbSchema = {\n        \"@context\": \"https://schema.org\",\n        \"@type\": \"BreadcrumbList\",\n        \"itemListElement\": breadcrumbItems.length > 0 ? breadcrumbItems : []\n    };\n\n    console.log(\"Olu\u015fturulan breadcrumbItems:\", breadcrumbItems);\n    console.log(\"Olu\u015fturulan breadcrumbSchema:\", breadcrumbSchema);\n\n    // Breadcrumb script'i olu\u015ftur\n    let breadcrumbScript = '';\n    if (breadcrumbItems.length > 0) {\n        try {\n            breadcrumbScript = `\n<script type=\"application/ld+json\">${JSON.stringify(breadcrumbSchema, null, 2)}</script>\n            `;\n            console.log(\"Breadcrumb script ba\u015far\u0131yla olu\u015fturuldu:\", breadcrumbScript);\n        } catch (error) {\n            console.error(\"Breadcrumb script olu\u015fturulurken hata:\", error);\n            breadcrumbScript = `<script type=\"application/ld+json\">/* Hata nedeniyle bo\u015f b\u0131rak\u0131ld\u0131: ${error.message} */</script>`;\n        }\n    } else {\n        console.warn(\"Breadcrumb script olu\u015fturulmad\u0131: breadcrumbItems bo\u015f.\");\n        breadcrumbScript = `<script type=\"application/ld+json\">/* breadcrumbItems bo\u015f */</script>`;\n    }\n\n    // \u0130\u00e7erik haritas\u0131 i\u00e7in \u00e7eviriler\n    let tocLabels = {\n        tocTitle: '',\n        mainContent: '',\n        summary: '',\n        faq: '',\n        author: '',\n        references: ''\n    };\n    switch (lang) {\n        case \"T\u00fcrk\u00e7e\":\n            tocLabels = {\n                tocTitle: \"\u0130\u00e7indekiler\",\n                mainContent: \"Makale\",\n                summary: \"\u00d6zet\",\n                faq: \"S\u0131k\u00e7a Sorulan Sorular\",\n                author: \"Yazar\",\n                references: \"Kaynak\u00e7a ve Referanslar\"\n            };\n            break;\n        case \"\u0130ngilizce\":\n            tocLabels = {\n                tocTitle: \"Table of contents\",\n                mainContent: \"Article\",\n                summary: \"Summary\",\n                faq: \"Frequently Asked Questions\",\n                author: \"Author\",\n                references: \"References\"\n            };\n            break;\n        case \"\u0130spanyolca\":\n            tocLabels = {\n                tocTitle: \"Tabla de contenidos\",\n                mainContent: \"Art\u00edculo\",\n                summary: \"Resumen\",\n                faq: \"Preguntas Frecuentes\",\n                author: \"Autor\",\n                references: \"Referencias\"\n            };\n            break;\n        default:\n            tocLabels = {\n                tocTitle: \"\u0130\u00e7indekiler\",\n                mainContent: \"Makale\",\n                summary: \"\u00d6zet\",\n                faq: \"S\u0131k\u00e7a Sorulan Sorular\",\n                author: \"Yazar\",\n                references: \"Kaynak\u00e7a ve Referanslar\"\n            };\n    }\n\n    // \u0130\u00e7erik haritas\u0131 ba\u011flant\u0131lar\u0131n\u0131 bir diziye al\n    const tocLinks = [\n        { href: \"#main-content\", label: tocLabels.mainContent, subItems: altBasliklar.map((subheading, index) => ({\n            href: `#subheading-${index + 1}`,\n            label: subheading\n        })) },\n        ...(summary ? [{ href: \"#summary\", label: tocLabels.summary }] : []),\n        ...(faqItems && faqItems.length > 0 ? [{ href: \"#faq\", label: tocLabels.faq }] : []),\n        { href: \"#author\", label: tocLabels.author },\n        { href: \"#references\", label: tocLabels.references }\n    ];\n\n    // NewsArticle \u015eemas\u0131 i\u00e7in gerekli veriler\n    const currentDate = new Date();\n    const datePublished = formatISODate(currentDate);\n    const dateModified = datePublished;\n    const authorData = $('Yazar_Referans Code').first()?.json?.author || {\n        name: \"Belirtilmemi\u015f Yazar\",\n        expertise: \"Genel Uzman\",\n        bio: \"Bu yazar, \u00e7e\u015fitli konularda ara\u015ft\u0131rma yapm\u0131\u015f deneyimli bir profesyoneldir.\"\n    };\n    const authors = [\n        {\n            \"@type\": \"Person\",\n            \"name\": authorData.name,\n            \"url\": \"https://wp.serpsonic.com/authors/\" + createSlug(authorData.name, lang)\n        }\n    ];\n    const images = imageUrl ? [imageUrl] : [];\n\n    const newsArticleSchema = {\n        \"@context\": \"https://schema.org\",\n        \"@type\": \"Article\",\n        \"headline\": makaleBasligi || \"Ba\u015fl\u0131ks\u0131z\",\n        \"image\": images,\n        \"datePublished\": datePublished,\n        \"dateModified\": dateModified,\n        \"author\": authors\n    };\n\n    // ImageObject \u015eemas\u0131 i\u00e7in OpenAI DALL-E 3 ve Amazon S3\u2019e uygun veriler\n    const imageLicense = \"https://openai.com/terms\";\n    let imageCreditText = '';\n    let imageCaption = '';\n    switch (lang) {\n        case \"T\u00fcrk\u00e7e\":\n            imageCreditText = \"Open AI taraf\u0131ndan olu\u015fturulmu\u015ftur\";\n            imageCaption = `${odakKelime} ile ilgili bir g\u00f6rsel`;\n            break;\n        case \"\u0130ngilizce\":\n            imageCreditText = \"Generated by Open AI\";\n            imageCaption = `An illustration related to ${odakKelime || 'the image'}`;\n            break;\n        case \"\u0130spanyolca\":\n            imageCreditText = \"Generado por Open AI\";\n            imageCaption = `Una ilustraci\u00f3n relacionada con ${odakKelime || 'la imagen'}`;\n            break;\n        default:\n            imageCreditText = \"Open AI taraf\u0131ndan olu\u015fturulmu\u015ftur\";\n            imageCaption = `${odakKelime} ile ilgili bir g\u00f6rsel`;\n    }\n    const imageCreatorName = \"OpenAI\";\n    const imageDatePublished = formatISODate(new Date()); // G\u00f6rselin yay\u0131n tarihi\n\n    const imageObjectSchema = imageUrl ? {\n        \"@context\": \"https://schema.org\",\n        \"@type\": \"ImageObject\",\n        \"contentUrl\": imageUrl,\n        \"url\": imageUrl,\n        \"license\": imageLicense,\n        \"creditText\": imageCreditText,\n        \"caption\": imageCaption,\n        \"datePublished\": imageDatePublished,\n        \"creator\": {\n            \"@type\": \"Organization\",\n            \"name\": imageCreatorName,\n            \"url\": \"https://openai.com\"\n        },\n        \"description\": imageCaption,\n        \"name\": `Image for ${makaleBasligi || 'Untitled Article'}`\n    } : null;\n\n    // Tam HTML i\u00e7eri\u011fini olu\u015ftur\n    let htmlContent = `<!DOCTYPE html>\n<html lang=\"${langCode}\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"${metaDesc || 'A\u00e7\u0131klama yok'}\">\n    <title>${makaleBasligi || 'Ba\u015fl\u0131ks\u0131z'}</title>\n    <link rel=\"stylesheet\" href=\"styles.css\">\n</head>\n<body>`;\n\n    // Sadece body i\u00e7eri\u011fini tutacak de\u011fi\u015fken\n    let bodyContent = `<body>`;\n\n    // Breadcrumb \u015femas\u0131\n    bodyContent += breadcrumbScript;\n\n    // NewsArticle \u015femas\u0131\n    const newsArticleScript = `\n<script type=\"application/ld+json\">${JSON.stringify(newsArticleSchema, null, 2)}</script>\n    `;\n    bodyContent += newsArticleScript;\n\n    // ImageObject \u015femas\u0131 (imageUrl varsa eklenir)\n    if (imageObjectSchema) {\n        const imageObjectScript = `\n<script type=\"application/ld+json\">${JSON.stringify(imageObjectSchema, null, 2)}</script>\n        `;\n        bodyContent += imageObjectScript;\n    }\n\n    // \u0130\u00e7erik haritas\u0131n\u0131 olu\u015ftur (Dikey liste yap\u0131s\u0131, alt ba\u015fl\u0131klarla birlikte)\n    let tocHTML = `\n    <nav class=\"table-of-contents\" style=\"margin: 20px 0; padding: 10px; border: 1px solid #ccc; border-radius: 5px;\">\n        <h2 style=\"margin-bottom: 10px;\">${tocLabels.tocTitle}</h2>\n        <ul style=\"list-style-type: disc; padding-left: 20px;\">\n    `;\n    \n    tocLinks.forEach((link) => {\n        tocHTML += `\n            <li style=\"margin-bottom: 5px;\">\n                <a href=\"${link.href}\" class=\"toc-link\" style=\"text-decoration: none; color: #0073aa;\">${link.label}</a>\n        `;\n        if (link.subItems && link.subItems.length > 0) {\n            tocHTML += `\n                <ul style=\"list-style-type: circle; padding-left: 20px;\">\n            `;\n            link.subItems.forEach((subItem) => {\n                tocHTML += `\n                    <li style=\"margin-bottom: 5px;\">\n                        <a href=\"${subItem.href}\" class=\"toc-link\" style=\"text-decoration: none; color: #0073aa;\">${subItem.label}</a>\n                    </li>\n                `;\n            });\n            tocHTML += `\n                </ul>\n            `;\n        }\n        tocHTML += `\n            </li>\n        `;\n    });\n\n    tocHTML += `\n        </ul>\n    </nav>\n    `;\n    bodyContent += tocHTML;\n\n    if (!Array.isArray(altBasliklar) || !Array.isArray(icerikler)) {\n        const errorHTML = `<p>\u0130\u00e7erik olu\u015fturulamad\u0131, l\u00fctfen giri\u015f verilerini kontrol edin (alt ba\u015fl\u0131klar veya i\u00e7erikler eksik).</p></body></html>`;\n        bodyContent += errorHTML;\n        return { result: htmlContent, bodyContent: bodyContent, title: makaleBasligi || 'Ba\u015fl\u0131ks\u0131z' };\n    }\n\n    const tableData = $('Fix Table').first().json.table;\n    const tableCaption = `Tablo 1. ${makaleBasligi || 'Ba\u015fl\u0131ks\u0131z'} `;\n\n    let htmlTable = '';\n    if (tableData && Array.isArray(tableData)) {\n        let column1 = \"\";\n        let column2 = \"\";\n        if (language === \"T\u00fcrk\u00e7e\") {\n            column1 = \"\u00d6zellik\";\n            column2 = \"A\u00e7\u0131klama\";\n        } else if (language === \"\u0130ngilizce\") {\n            column1 = \"Feature\";\n            column2 = \"Explanation\";\n        } else if (language === \"\u0130spanyolca\") {\n            column1 = \"Caracter\u00edstica\";\n            column2 = \"Explicaci\u00f3n\";\n        }\n        htmlTable = `<table border=\"1\" style=\"border-color: black; border-collapse: collapse;\">`;\n        htmlTable += `<caption>${tableCaption}</caption>`;\n        htmlTable += '<tr>';\n        htmlTable += `<th>${column1}</th>`;\n        htmlTable += `<th>${column2}</th>`;\n        htmlTable += '</tr>';\n        tableData.forEach(row => {\n            htmlTable += '<tr>';\n            htmlTable += `<td>${row[\"\u00d6zellik\"]}</td>`;\n            htmlTable += `<td>${row[\"A\u00e7\u0131klama\"]}</td>`;\n            htmlTable += '</tr>';\n        });\n        htmlTable += '</table>';\n    } else {\n        console.log(\"Tablo verisi bulunamad\u0131 veya yanl\u0131\u015f formatta.\");\n    }\n\n    const paragraphSeparator = '||PARAGRAPH||';\n    let allContent = [];\n\n    const girisParagraflar = (girisMetni || '').split(\"\\n\\n\").map(p => p.trim()).filter(p => p);\n    allContent.push(...girisParagraflar);\n\n    const contentParagraphs = [];\n    const contentSubheadings = [];\n    let extractedLinkUrl = \"\";\n    icerikler.forEach((icerik, index) => {\n        let lines = (icerik || '').split(\"\\n\\n\");\n        let altBaslik = lines[0]?.trim() || '';\n        altBaslik = altBaslik.replace(/[#-*]/g, '').trim();\n        contentSubheadings[index] = altBaslik;\n\n        let processedLines = lines.slice(1).map(line => {\n            let modifiedLine = line;\n            //const normalizedLine = normalize(line, lang);\n            if (line.match(/bu konu i\u00e7in yararlan\u0131labilecek ba\u011flant\u0131lar/i)) {\n              const urlMatch = line.match(/bu konu i\u00e7in yararlan\u0131labilecek ba\u011flant\u0131lar\\s*:\\s*[\\[\\(]?\\s*(https?:\\/\\/[^\\s\\]\\)]*[\\]\\)]?)?[\\[\\]\\(\\)]*/i);\n            \n//burada notlara yap\u0131\u015ft\u0131rd\u0131\u011f\u0131m if blo\u011fu vard\u0131 normalizedLine \u00fczerinden i\u015flem yapan\n\n                if (urlMatch && urlMatch[0]) {\n                    const extractedUrl = urlMatch[0].match(/https?:\\/\\/[^\\s\\]\\)]*/);\n                    if (extractedUrl) {\n                        extractedLinkUrl = extractedUrl[0];\n                        console.log(`Yakalanan ba\u011flant\u0131 (ifade i\u00e7inden): ${extractedLinkUrl}`);\n                    }\n                }\n\n                modifiedLine = modifiedLine.replace(/bu konu i\u00e7in yararlan\u0131labilecek ba\u011flant\u0131lar\\s*:\\s*[\\[\\(]?\\s*(https?:\\/\\/[^\\s\\]\\)]*[\\]\\)]?)?[\\[\\]\\(\\)]*/gi, '').trim();\n                console.log(`Kald\u0131r\u0131lan ifade ve ba\u011flant\u0131: ${line} -> ${modifiedLine}`);\n\n                const cleanedLine = modifiedLine.replace(/[\\[\\]\\(\\)]+/g, '').trim();\n                if (cleanedLine !== modifiedLine) {\n                    console.log(`Kalan parantezler temizlendi: ${modifiedLine} -> ${cleanedLine}`);\n                    modifiedLine = cleanedLine;\n                }\n            }\n            const normalizedLine = normalize(modifiedLine, lang);  // buraya yeni ekledim grok denemesi\n            if (/https?:\\/\\/[^\\s]+/.test(modifiedLine) || normalizedLine.includes('url linki')) {\n                const urlMatch = modifiedLine.match(/https?:\\/\\/[^\\s]+/);\n                if (urlMatch && !extractedLinkUrl) {\n                    extractedLinkUrl = urlMatch[0];\n                    console.log(`Se\u00e7ilen extractedLinkUrl: ${extractedLinkUrl}`);\n                }\n                modifiedLine = modifiedLine.replace(/https?:\\/\\/[^\\s]+/g, '').trim();\n                console.log(`Kald\u0131r\u0131lan di\u011fer ba\u011flant\u0131: ${line} -> ${modifiedLine}`);\n            }\n\n            return modifiedLine;\n        });\n\n        contentParagraphs[index] = processedLines.filter(p => p.trim());\n        allContent.push(...contentParagraphs[index]);\n    });\n\n    if (summary) {\n        allContent.push(summary.trim());\n    }\n\n    let combinedContent = allContent.join(paragraphSeparator);\n    console.log(\"Birle\u015ftirilen i\u00e7erik:\", combinedContent.slice(0, 200) + \"...\");\n\n    let processedContent = combinedContent;\n    let processedParagraphs = processedContent.split(paragraphSeparator);\n    let paragraphIndex = 0;\n\n    let linkAddedGlobally = false;\n    let followLinkAddedGlobally = false;\n    let nofollowStudyLinkAddedGlobally = false;\n    let internalLinkAddedGlobally = false;\n\n    let processedGirisParagraflar = girisParagraflar.map(() => {\n        let paragraph = processedParagraphs[paragraphIndex++] || '';\n        if (!paragraph) return '';\n        return paragraph;\n    });\n    console.log(\"D\u00f6rd\u00fcnc\u00fc alt ba\u015fl\u0131k i\u00e7in veriler:\", {\n      index: 3,\n      content: icerikler[3],\n      disBaglantiArray: disBaglantiArray,\n      extractedLinkUrl: extractedLinkUrl,\n      studyTitle: studyTitle,\n      studyUrl: studyUrl\n    });\n    for (let index = 0; index < icerikler.length; index++) {\n        let processedLines = contentParagraphs[index].map(() => {\n            let paragraph = processedParagraphs[paragraphIndex++] || '';\n            if (!paragraph) return '';\n            if (index === 1 && !linkAddedGlobally && extractedLinkUrl) {\n                let result = addLinksToContent(paragraph, extractedLinkUrl, lang);\n                paragraph = result.content;\n                if (result.linkAdded) {\n                    linkAddedGlobally = true;\n                    console.log(`2. alt ba\u015fl\u0131kta nofollow ba\u011flant\u0131 eklendi: ${extractedLinkUrl}`);\n                } else {\n                    console.log(`2. alt ba\u015fl\u0131kta nofollow ba\u011flant\u0131 eklenemedi: ${extractedLinkUrl}`);\n                }\n            }\n\n            if (!internalLinkAddedGlobally && internalLinkUrl) {\n                let result = addInternalLink(paragraph, internalLinkUrl, lang);\n                paragraph = result.content;\n                if (result.internalLinkAdded) {\n                    internalLinkAddedGlobally = true;\n                }\n            }\n            return paragraph;\n        });\n\n        if (index === 3) {\n            let fullContent = processedLines.join(\"\\n\\n\");\n            console.log(\"4. alt ba\u015fl\u0131k i\u00e7eri\u011fi (birle\u015ftirilmi\u015f):\", fullContent);\n\n            if (!nofollowStudyLinkAddedGlobally) {\n                let nofollowResult = addNofollowLinkToStudyTitle(fullContent, index, studyTitle, studyUrl, lang);\n                fullContent = nofollowResult.content;\n                if (nofollowResult.nofollowLinkAdded) {\n                    nofollowStudyLinkAddedGlobally = true;\n                    console.log(\"4. alt ba\u015fl\u0131kta bilimsel \u00e7al\u0131\u015fmaya nofollow ba\u011flant\u0131 eklendi.\");\n                } else {\n                    console.log(\"4. alt ba\u015fl\u0131kta bilimsel \u00e7al\u0131\u015fmaya nofollow ba\u011flant\u0131 eklenemedi.\");\n                }\n            }\n\n            if (!followLinkAddedGlobally) {\n                let followResult = addFollowLinkToFourthSubheading(fullContent, disBaglantiArray, index, extractedLinkUrl, lang);\n                fullContent = followResult.content;\n                if (followResult.followLinkAdded) {\n                    followLinkAddedGlobally = true;\n                    console.log(\"4. alt ba\u015fl\u0131kta follow ba\u011flant\u0131 eklendi.\");\n                } else {\n                    console.log(\"4. alt ba\u015fl\u0131kta follow ba\u011flant\u0131 eklenemedi.\");\n                }\n            }\n\n            processedLines = fullContent.split(\"\\n\\n\");\n        }\n\n        processedLines.forEach((line, lineIndex) => {\n            processedParagraphs[paragraphIndex - processedLines.length + lineIndex] = line;\n        });\n    }\n\n    if (summary) {\n        let summaryParagraph = processedParagraphs[paragraphIndex++] || '';\n        processedParagraphs[paragraphIndex - 1] = summaryParagraph;\n    }\n\n    processedContent = processedParagraphs.join(paragraphSeparator);\n    let taggedContent = addBoldAndItalic(processedContent, odakKelime, synonyms, lang);\n    let taggedParagraphs = taggedContent.split(paragraphSeparator);\n    paragraphIndex = 0;\n\n    // Ana i\u00e7erik b\u00f6l\u00fcm\u00fc (Makale)\n    const mainContentHTML = `<div id=\"main-content\">` +\n        processedGirisParagraflar.map(() => {\n            let paragraph = taggedParagraphs[paragraphIndex++] || '';\n            if (!paragraph) return '';\n            return `<p style=\"text-align: justify;\">${paragraph}</p>`;\n        }).join(\"\\n\") +\n        \"\\n\";\n    bodyContent += mainContentHTML;\n\n    let headingLevel = 2;\n\n    function processParagraph(paragraph) {\n        if (!paragraph) return `<p style=\"text-align: justify;\"></p>`;\n\n        const lines = paragraph.split('\\n').map(line => line.trim());\n        const isList = lines.some(line => line.match(/^[-\u2022]\\s+/) || line.match(/^\\d+\\.\\s+/));\n\n        if (isList) {\n            let listHTML = '';\n            let currentListType = null;\n            let listItems = [];\n\n            lines.forEach(line => {\n                if (line.match(/^[-\u2022]\\s+/)) {\n                    if (currentListType === 'ol') {\n                        if (listItems.length > 0) {\n                            listHTML += `<ol>\\n${listItems.map(item => `<li>${item}</li>`).join('\\n')}\\n</ol>\\n`;\n                            listItems = [];\n                        }\n                    }\n                    currentListType = 'ul';\n                    //const cleanItem = line.replace(/^[-\u2022]\\s+\\**/, '').trim();\n                    const cleanItem = line.replace(/^[-\u2022]\\s+/, '').replace(/\\*/g, '').trim();\n                    if (cleanItem) listItems.push(cleanItem);\n                } else if (line.match(/^\\d+\\.\\s+/)) {\n                    if (currentListType === 'ul') {\n                        if (listItems.length > 0) {\n                            listHTML += `<ul>\\n${listItems.map(item => `<li>${item}</li>`).join('\\n')}\\n</ul>\\n`;\n                            listItems = [];\n                        }\n                    }\n                    currentListType = 'ol';\n                    const cleanItem = line.replace(/^\\d+\\.\\s+/, '').replace(/\\*/g, '').trim();\n                    if (cleanItem) listItems.push(cleanItem);\n                } else {\n                    if (listItems.length > 0) {\n                        listHTML += currentListType === 'ul' \n                            ? `<ul>\\n${listItems.map(item => `<li>${item}</li>`).join('\\n')}\\n</ul>\\n`\n                            : `<ol>\\n${listItems.map(item => `<li>${item}</li>`).join('\\n')}\\n</ol>\\n`;\n                        listItems = [];\n                        currentListType = null;\n                    }\n                    if (line) listHTML += `<p>${line}</p>\\n`;\n                }\n            });\n\n            if (listItems.length > 0) {\n                listHTML += currentListType === 'ul' \n                    ? `<ul>\\n${listItems.map(item => `<li>${item}</li>`).join('\\n')}\\n</ul>\\n`\n                    : `<ol>\\n${listItems.map(item => `<li>${item}</li>`).join('\\n')}\\n</ol>\\n`;\n            }\n\n            return listHTML;\n        }\n\n        return `<p>${paragraph}</p>`;\n    }\n\n    for (let index = 0; index < icerikler.length; index++) {\n        let subheadingHTML = `<h${headingLevel} id=\"subheading-${index + 1}\">${contentSubheadings[index]}</h${headingLevel}>\\n`;\n        if (index === 2 && imageUrl) {\n            let imageDetailsHTML = `\n            <img src=\"${imageUrl}\" alt=\"${odakKelime}\" style=\"display: block; max-width: 80%; height: auto; margin-left: auto; margin-right: auto; margin-top: 30px;\">\n            <p style=\"text-align: center; font-size: 0.9em; color: #666;\">${imageCreditText}</p>\n            `;\n            subheadingHTML += imageDetailsHTML;\n        }\n\n        let paragraphsHTML = contentParagraphs[index].map(() => {\n            let paragraph = taggedParagraphs[paragraphIndex++] || '';\n            if (!paragraph) return '';\n            return processParagraph(paragraph);\n        }).join(\"\\n\");\n\n        if (index === 4 && htmlTable) {\n            paragraphsHTML += htmlTable + \"\\n\";\n        }\n\n        bodyContent += subheadingHTML + paragraphsHTML;\n        if (headingLevel < 6) headingLevel++;\n    }\n    bodyContent += `</div>`;\n\n    // \u00d6zet B\u00f6l\u00fcm\u00fc\n    if (summary) {\n        let cleanSummary = taggedParagraphs[paragraphIndex++] || '';\n        const summaryHTML = `\n        <div id=\"summary\" class=\"summary-section\">\n            <h2>${$('Ceviriler Code').first().json.ozet}</h2>\n            <p style=\"text-align: justify;\">${cleanSummary}</p>\n        </div>`;\n        bodyContent += summaryHTML;\n    }\n\n    // FAQ \u015eemas\u0131 ve HTML\n    if (faqItems && faqItems.length > 0) {\n        const faqSchema = {\n            \"@context\": \"https://schema.org\",\n            \"@type\": \"FAQPage\",\n            \"mainEntity\": faqItems.map(item => ({\n                \"@type\": \"Question\",\n                \"name\": item.question,\n                \"acceptedAnswer\": {\n                    \"@type\": \"Answer\",\n                    \"text\": item.explanation\n                }\n            }))\n        };\n\n        let faqHTML = `\n        <section id=\"faq\">\n            <h2>${$('Ceviriler Code').first().json.FAQ}</h2>\n            <div>\n                <script type=\"application/ld+json\">${JSON.stringify(faqSchema, null, 2)}</script>\\n`;\n\n        faqItems.forEach((item, index) => {\n            const cleanQuestion = item.question.replace(/</g, '&lt;').replace(/>/g, '&gt;');\n            const cleanExplanation = item.explanation.replace(/</g, '&lt;').replace(/>/g, '&gt;');\n\n            faqHTML += `\n                <div style=\"margin-bottom: 20px;\">\n                    <h3 style=\"background-color: #f0f0f0; border: 1px solid #ccc; padding: 10px; border-radius: 5px;\">${cleanQuestion}</h3>\n                    <p style=\"padding: 10px 0;\">${cleanExplanation}</p>\n                </div>`;\n        });\n\n        faqHTML += `\n            </div>\n        </section>`;\n        bodyContent += faqHTML;\n    }\n\n    const references = $('Yazar_Referans Code').first()?.json?.references || [\"Genel Web Ara\u015ft\u0131rmalar\u0131\", \"Sekt\u00f6rel Raporlar\", \"Akademik \u00c7al\u0131\u015fmalar\"];\n\n    // Yazar B\u00f6l\u00fcm\u00fc\n    const authorHTML = `\n    <section id=\"author\" class=\"author-section\">\n        <h2>${$('Ceviriler Code').first().json.yazar}</h2>\n        <div class=\"author-name\">${authorData.name}</div>\n        <div class=\"expertise\"><p><b>${$('Ceviriler Code').first().json['Uzmanl\u0131kAlan\u0131']}: </b> ${authorData.expertise}</p></div>\n        <h2>${$('Ceviriler Code').first().json.yazarHakkinda}</h2>\n        <p class=\"bio\" style=\"text-align: justify;\">${authorData.bio}</p>\n    </section>`;\n    bodyContent += authorHTML;\n\n    // Do\u011fruluk Kontrol\u00fc (ClaimReview) \u015eemas\u0131\n    const claimReviewed = odakKelime ? `${odakKelime} do\u011fru bir bilgidir` : `${makaleBasligi} iddias\u0131`;\n    const claimAuthorName = \"Bilinmeyen Kurulu\u015f\";\n    const claimAuthorUrl = `${siteUrl}`;\n    const appearanceHeadline = references[0] || \"Genel Ara\u015ft\u0131rma\";\n    const appearanceUrl = `${siteUrl}/${createSlug(appearanceHeadline, lang)}`;\n    const publisherName = \"SerpSonic Makale\";\n    const publisherLogo = \"https://example.com/serpsonic-logo.jpg\";\n    const reviewAuthorName = \"SerpSonic Ekibi\";\n\n    const claimReviewSchema = {\n        \"@context\": \"https://schema.org\",\n        \"@type\": \"ClaimReview\",\n        \"url\": makaleUrl,\n        \"claimReviewed\": claimReviewed,\n        \"itemReviewed\": {\n            \"@type\": \"Claim\",\n            \"author\": {\n                \"@type\": \"Organization\",\n                \"name\": claimAuthorName,\n                \"sameAs\": claimAuthorUrl\n            },\n            \"datePublished\": \"2024-06-20\",\n            \"appearance\": {\n                \"@type\": \"OpinionNewsArticle\",\n                \"url\": appearanceUrl,\n                \"headline\": appearanceHeadline,\n                \"datePublished\": \"2024-06-22\",\n                \"author\": {\n                    \"@type\": \"Person\",\n                    \"name\": authorData.name || \"Bilinmeyen Yazar\"\n                },\n                \"image\": imageUrl || \"https://example.com/default-image.jpg\",\n                \"publisher\": {\n                    \"@type\": \"Organization\",\n                    \"name\": publisherName,\n                    \"logo\": {\n                        \"@type\": \"ImageObject\",\n                        \"url\": publisherLogo\n                    }\n                }\n            }\n        },\n        \"author\": {\n            \"@type\": \"Organization\",\n            \"name\": reviewAuthorName\n        },\n        \"reviewRating\": {\n            \"@type\": \"Rating\",\n            \"ratingValue\": 1,\n            \"bestRating\": 5,\n            \"worstRating\": 1,\n            \"alternateName\": \"False\"\n        }\n    };\n\n    const claimReviewScript = `\n<script type=\"application/ld+json\">${JSON.stringify(claimReviewSchema, null, 2)}</script>\n    `;\n    bodyContent += claimReviewScript;\n\n    // Kaynak\u00e7a ve Referanslar B\u00f6l\u00fcm\u00fc\n    const referencesHTML = `\n    <section id=\"references\" class=\"references-section\">\n        <h2>${$('Ceviriler Code').first().json.kaynakcaVeReferanslar}</h2>\n        <ul>\n            ${references.map(ref => `<li>${ref}</li>`).join('')}\n        </ul>\n    </section>`;\n    bodyContent += referencesHTML;\n\n    // kayd\u0131rma i\u00e7in JavaScript kodu\n    const smoothScrollScript = `\n<script>\n    document.querySelectorAll('.toc-link').forEach(link => {\n        link.addEventListener('click', function(e) {\n            e.preventDefault();\n            const targetId = this.getAttribute('href').substring(1);\n            const targetElement = document.getElementById(targetId);\n            if (targetElement) {\n                targetElement.scrollIntoView({ behavior: 'smooth', block: 'start' });\n            }\n        });\n    });\n</script>`;\n    bodyContent += smoothScrollScript;\n\n    bodyContent += `</body>`;\n\n    htmlContent += bodyContent + `</html>`;\n\n    return {\n        result: htmlContent,\n        bodyContent: bodyContent,\n        title: makaleBasligi || 'Ba\u015fl\u0131ks\u0131z'\n    };\n}\n\n\nlet htmlOutput;\ntry {\n    htmlOutput = convertToHTML(makaleBasligi, altBasliklar, icerikler, girisMetni, imageUrl, disBaglantiArray, faqItems, summary, language);\n} catch (error) {\n    console.error(\"convertToHTML s\u0131ras\u0131nda hata:\", error);\n    htmlOutput = {\n        result: `<!DOCTYPE html>\n<html lang=\"${langCode}\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Hata olu\u015ftu\">\n    <title>Hata</title>\n</head>\n<body>\n    <p>\u0130\u00e7erik olu\u015fturulamad\u0131, l\u00fctfen verileri kontrol edin.</p>\n</body>\n</html>`,\n        bodyContent: `<body>\n    <p>\u0130\u00e7erik olu\u015fturulamad\u0131, l\u00fctfen verileri kontrol edin.</p>\n</body>`,\n        title: 'Hata'\n    };\n}\n\nif (typeof htmlOutput.result !== \"string\" || typeof htmlOutput.bodyContent !== \"string\" || typeof htmlOutput.title !== \"string\") {\n    console.error(\"HTML \u00e7\u0131kt\u0131lar\u0131 string de\u011fil:\", { result: typeof htmlOutput.result, bodyContent: typeof htmlOutput.bodyContent, title: typeof htmlOutput.title });\n    htmlOutput = {\n        result: '',\n        bodyContent: '',\n        title: ''\n    };\n}\n\nreturn [{ json: htmlOutput }];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -640,
        80
      ],
      "id": "f228a143-b130-4cb1-bdfb-f2d6adaad252",
      "name": "Code1",
      "alwaysOutputData": false
    },
    {
      "parameters": {
        "operation": "toText",
        "sourceProperty": "result",
        "binaryPropertyName": "={{ $json.result }}",
        "options": {
          "fileName": "result.html"
        }
      },
      "type": "n8n-nodes-base.convertToFile",
      "typeVersion": 1.1,
      "position": [
        -336,
        -64
      ],
      "id": "7b625e50-f863-49c4-953f-4b0cc6f602b8",
      "name": "Convert to File"
    },
    {
      "parameters": {
        "title": "={{ $('Code1').item.json.result.match(/<title>(.*?)<\\/title>/)[1] }}",
        "additionalFields": {
          "content": "={{ $json.cleanedContent }}",
          "status": "publish"
        }
      },
      "type": "n8n-nodes-base.wordpress",
      "typeVersion": 1,
      "position": [
        176,
        224
      ],
      "id": "2d9137a1-7e75-48ab-895c-d9cedb25cbef",
      "name": "Wordpress"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Dil: {{ $('Edit Fields').first().json.language }}\n{{ $('Edit Fields').item.json.topic }} konusunda {{ $('Edit Fields').first().json.language }} dilinde 2 paragrafl\u0131k bir makale giri\u015f metni olu\u015ftur.\n- Olu\u015fturulan metin minimum 200 kelimeden olu\u015fsun.\n- Olu\u015fturulan metnin ilk kelimesi kesinlikle {{ $('Edit Fields').first().json.keyword }}  ifadesi ile ba\u015flas\u0131n. Yani olu\u015fturulan giri\u015f metninin ilk kelimesi {{ $('Edit Fields').first().json.keyword }} olacak.\n- Giri\u015f metni olu\u015fturulurken {{ $('Es_anlamilar').first().json.synonyms }} burada yer alan ifadelerden uygun olan\u0131na veya uygun olanlar\u0131na yer verilecek.\n- Olu\u015fturulan i\u00e7erikte s\u0131k s\u0131k odak anahtar kelime olan {{ $('Edit Fields').item.json.keyword }} ifadesine yer verilmelidir.\n\n- Kurulan c\u00fcmleler {{ $('Edit Fields').first().json.language }} kurallar\u0131na g\u00f6re etken \u00e7at\u0131da olmal\u0131. Edilgen \u00e7at\u0131 kullan\u0131lmamal\u0131d\u0131r. \u00d6rne\u011fin; gerekebilir, etkileyebilir, yapabilirler, alabilirler, bulunur, ya\u015fayabilir, dinletir, sa\u011fl\u0131yor gibi edilgen kelimeler kullan\u0131lmamal\u0131 bunun yerine getiriyor, sergiler, dinletir, yapar, sunar gibi etken kelimeler kullan\u0131lmal\u0131d\u0131r.\n- Olu\u015fturulacak c\u00fcmlelerde \"-ebilmek\", \"-abilmek\" eklerini i\u00e7eren fiiller (\u00f6rne\u011fin; \"yapabilmektedir\", \"duyulabilmektedir\") yer almamal\u0131d\u0131r bunun yerine fiilin do\u011frudan etken hali (\u00f6rne\u011fin; \"yapar\", \"duyar\") kullan\u0131lmal\u0131dr.\n- \u00dcretilecek i\u00e7erik asla ayn\u0131 kelime ile ba\u015flayan ard\u0131\u015f\u0131k c\u00fcmleler i\u00e7ermemelidir. Olu\u015fturulan ard\u0131\u015f\u0131k c\u00fcmleler ayn\u0131 s\u00f6zc\u00fck ile ba\u015fl\u0131yor ise bu c\u00fcmleler yeniden olu\u015fturulmal\u0131d\u0131r.\n- \u00dcretilecek c\u00fcmleler maksimum 15 kelimeden olu\u015fmal\u0131d\u0131r. 15 kelimeden daha fazla say\u0131da kelime i\u00e7eren c\u00fcmle \u00fcretilmeyecektir.\n- \u00dcretilen i\u00e7erikte \"fakat, ancak, bu do\u011frultuda, dolay\u0131s\u0131yla, bu nedenden dolay\u0131, bu nedenle...\" gibi ge\u00e7i\u015f kelimelerine s\u0131kl\u0131kla yer verilmeli.\n",
        "options": {
          "systemMessage": "=Sen bir makale konusuna ve odak anahtar kelimesine uygun giri\u015f metni \u00fcretimi yapan bir yapay zeka ajan\u0131s\u0131n. \n- olu\u015fturulan i\u00e7eri\u011fin ilk kelimesi {{ $('Edit Fields').item.json.keyword }} olacak ve i\u00e7erikte {{ $('Es_anlamilar').first().json.synonyms }} burada yer alan ifadelerden uygun olan\u0131na veya uygun olanlar\u0131na yer verilecek."
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.7,
      "position": [
        -3392,
        80
      ],
      "id": "cefaed3b-a8e9-4884-9575-e2c529516a64",
      "name": "AI Agent2",
      "retryOnFail": true,
      "maxTries": 2,
      "waitBetweenTries": 100
    },
    {
      "parameters": {
        "resource": "image",
        "prompt": "={{ $('Edit Fields').first().json.topic }} i\u00e7in bir g\u00f6rsel \u00fcret.",
        "options": {
          "returnImageUrls": true
        }
      },
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "typeVersion": 1.8,
      "position": [
        -2896,
        656
      ],
      "id": "5d77461c-45c1-4d3c-9dff-f961f1a58301",
      "name": "OpenAI",
      "retryOnFail": true,
      "waitBetweenTries": 100,
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Dil: {{ $('Edit Fields').first().json.language }}\nSen bir SEO uzman\u0131 olarak g\u00f6rev yapan bir yapay zeka asistan\u0131s\u0131n. G\u00f6revin, verilen makale ba\u015fl\u0131\u011f\u0131 ve anahtar kelimeler dizisi kullanarak, ba\u015fl\u0131k ile uyumlu ve SEO uyumlu bir meta title olu\u015fturmak. Meta title, {{ $('Edit Fields').first().json.language }} dilinde maksimum 40 karakter (harf say\u0131s\u0131) uzunlu\u011funda olmal\u0131 ve anahtar kelimeleri do\u011fal bir \u015fekilde i\u00e7ermeli. Kullan\u0131c\u0131y\u0131 \u00e7ekecek, a\u00e7\u0131k ve etkili bir dil kullan. \u0130\u015fte detaylar:\n\n- Makale Ba\u015fl\u0131\u011f\u0131: {{ $('Edit Fields').first().json.topic }}\n- Anahtar Kelimeler Dizisi: {{ $('Aggregate').first().json.searches_array }} \n- Odak Anahtar Kelme: {{ $('Edit Fields').first().json.keyword }}\n- Karakter S\u0131n\u0131r\u0131: Maksimum 40 karakter\n\nA\u015fa\u011f\u0131daki ad\u0131mlar\u0131 izle:\n1. Makale ba\u015fl\u0131\u011f\u0131n\u0131 analiz et ve ana temas\u0131n\u0131 anla.\n2. Verilen anahtar kelimelerden en az 1 tanesini do\u011fal bir \u015fekilde meta title\u2019a dahil et. Dahil edilecek anahtar kelime mant\u0131kl\u0131, seo i\u00e7in uygun bir anahtar kelime olsun ve dahil edilecek anahtar kelimede herhangi bir lokasyon bilgisi bulunmas\u0131n.\n3. Meta title {{ $('Edit Fields').first().json.keyword }} kelimesi ile ba\u015flas\u0131n ve do\u011fal bir \u015fekilde olu\u015fturulsun. Yani \u00fcretilecek meta title'\u0131n ilk kelimesi {{ $('Edit Fields').first().json.keyword }} olmal\u0131.\n4. Meta title\u2019\u0131 40 karakteri a\u015fmayacak \u015fekilde k\u0131sa, \u00f6z, dikkat \u00e7ekici ve mant\u0131kl\u0131 bir c\u00fcmle yap\u0131s\u0131nda tut.\n5. Olu\u015fturulan meta title'da *^#<>|- _ gibi semboller bulunmas\u0131n.\n6. \u00c7\u0131kt\u0131 olarak yaln\u0131zca meta title metnini d\u00f6nd\u00fcr.\n\n\u00d6rnek:\n- Ba\u015fl\u0131k: \"Yapay Zeka ile Gelecek Nas\u0131l \u015eekillenecek?\"\n- Anahtar Kelimeler: [\"yapay zeka\", \"gelecek\", \"teknoloji\"]\n- Odak Anahtar Kelime: \"Yapay zeka\"\n- Meta Title: \"Yapay Zeka ile Gelecek \u015eekillendirme\" \n\n\u015eimdi, verilen ba\u015fl\u0131k ve anahtar kelimelerle meta title\u2019\u0131 olu\u015ftur.",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.7,
      "position": [
        -2816,
        80
      ],
      "id": "ee5f9d6e-5efa-4247-8f5d-a158cd13d907",
      "name": "AI Agent4",
      "retryOnFail": true,
      "maxTries": 2,
      "waitBetweenTries": 100
    },
    {
      "parameters": {
        "url": "={{ $json.site_url }}",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "User-Agent",
              "value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
            },
            {
              "name": "Accept",
              "value": "text/html"
            }
          ]
        },
        "options": {
          "allowUnauthorizedCerts": true,
          "response": {
            "response": {
              "responseFormat": "text"
            }
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        -8144,
        704
      ],
      "id": "14447a1a-ba51-4cfb-bec6-25b00e31e82b",
      "name": "Fetch Site HTML"
    },
    {
      "parameters": {
        "jsCode": "// HTML i\u00e7eri\u011fini HTTP Request Node\u2019dan al\nconst html = $input.first().json.data;\n// \u015eu anki \u00e7\u0131kt\u0131n\u0131z \"data\" i\u00e7inde\nconst baseUrl =$('Edit Fields').first().json.site_url;\n // Telegram\u2019dan gelen site URL\u2019si\n\n// T\u00fcm <a href=\"...\"> ba\u011flant\u0131lar\u0131n\u0131 bul\nconst linkPattern = /<a\\s+(?:[^>]*?\\s+)?href=[\"'](.*?)[\"']/gi;\nlet matches = [];\nlet match;\n\nwhile ((match = linkPattern.exec(html)) !== null) {\n    matches.push(match[1]);\n}\n\n// Dahili ba\u011flant\u0131lar\u0131 filtrele\nconst internalLinks = matches\n    .filter(link => {\n        if (link.startsWith('http')) {\n            return link.startsWith(baseUrl) && link !== baseUrl && !link.includes('#');\n        }\n        return link.startsWith('/') && !link.startsWith('//') && link !== '/';\n    })\n    .map(link => {\n        if (link.startsWith('/')) {\n            return baseUrl + link;\n        }\n        return link;\n    })\n    .filter((link, index, self) => self.indexOf(link) === index); // Tekrarlar\u0131 kald\u0131r\n\n// En az bir ba\u011flant\u0131 varsa ilkini se\u00e7, yoksa yedek URL\nconst internalLinkUrl = internalLinks.length > 0 ? internalLinks[0] : baseUrl + '/blog';\n\nreturn [\n  {\n    json: {\n      internalLinkUrl,\n      internalLinks // Hata ay\u0131klama i\u00e7in t\u00fcm ba\u011flant\u0131lar\n    }\n  }\n];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -7952,
        704
      ],
      "id": "aaa892bd-9163-48d5-aa32-3901251f860c",
      "name": "Scrape Internal Links Node"
    },
    {
      "parameters": {
        "jsCode": "\n\n// \u00d6nceki node\u2019dan HTML \u00e7\u0131kt\u0131s\u0131n\u0131 al\nconst htmlOutput = $input.first().json.result;\n\n\n// HTML\u2019den yaln\u0131zca i\u00e7eri\u011fi ay\u0131klamak i\u00e7in bir fonksiyon\nfunction extractContentFromHTML(html) {\n    if (!html || typeof html !== 'string') {\n        console.error(\"HTML \u00e7\u0131kt\u0131s\u0131 ge\u00e7ersiz veya eksik.\");\n        return '';\n    }\n\n    // HTML\u2019yi sade bir \u015fekilde i\u015flemek i\u00e7in regex veya string manip\u00fclasyonu kullan\u0131yoruz\n    // <body> etiketinin i\u00e7indeki i\u00e7eri\u011fi al\n    const bodyMatch = html.match(/<body>([\\s\\S]*?)<\\/body>/i);\n    let content = bodyMatch ? bodyMatch[1] : html; // E\u011fer <body> yoksa, ham i\u00e7eri\u011fi kullan\n    content = content\n          .replace(/^\\s*[\\[{\\(<].*[\\]}\\)>]\\s*/g, '') // Ba\u015fta video simgesi benzeri i\u015faretler\n          .replace(/\\s*[\\[{\\(<].*[\\]}\\)>]\\s*$/g, '') // Sonda video simgesi benzeri i\u015faretler\n          .replace(/^\\s+|\\s+$/g, '') // Ba\u015ftaki ve sondaki bo\u015fluklar\n          .replace(/<p>\\s*<\\/p>/g, ''); // Bo\u015f paragraflar\u0131 kald\u0131r\n  \n\n    // Bo\u015f paragraflar\u0131 ve fazladan sat\u0131r sonlar\u0131n\u0131 temizle\n    content = content\n        .split('\\n')\n        .map(line => line.trim())\n        .filter(line => line !== '' && line !== '<p></p>')\n        .join('\\n');\n\n    // Gereksiz bo\u015fluklar\u0131 ve sat\u0131r sonlar\u0131n\u0131 kald\u0131r\n   // content = content.trim();\n\n    return content;\n}\n\n// HTML\u2019den i\u00e7eri\u011fi ay\u0131kla\nconst cleanedContent = extractContentFromHTML(htmlOutput);\n\n// Hata ay\u0131klama i\u00e7in log\nconsole.log(\"Temizlenmi\u015f \u0130\u00e7erik:\", cleanedContent);\n\n// \u00c7\u0131kt\u0131y\u0131 d\u00f6nd\u00fcr\nreturn [{ json: { cleanedContent } }];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -32,
        224
      ],
      "id": "614b80f7-4f75-41ed-ad9f-d7b405f1b231",
      "name": "Code7"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Dil: {{ $('Edit Fields').first().json.language }}\nSen bir SEO uzman\u0131 olarak g\u00f6rev yapan bir yapay zeka asistan\u0131s\u0131n. G\u00f6revin, verilen bir makale ba\u015fl\u0131\u011f\u0131 ve anahtar kelimeler dizisi kullanarak, ba\u015fl\u0131k ile uyumlu ve SEO uyumlu bir meta description olu\u015fturmak. Meta description, {{ $('Edit Fields').first().json.language }} dilinde, maksimum 100 karakter uzunlu\u011funda olmal\u0131 ve anahtar kelimeleri do\u011fal bir \u015fekilde i\u00e7ermeli. Kullan\u0131c\u0131y\u0131 makaleyi okumaya te\u015fvik eden, a\u00e7\u0131k ve \u00e7ekici bir dil kullan. \u0130\u015fte detaylar:\n\n- Makale Ba\u015fl\u0131\u011f\u0131: {{ $('Edit Fields').item.json.topic }}\n- Anahtar Kelimeler Dizisi: {{ $('Aggregate').first().json.searches_array }}\n- Odak Anahtar Kelime: {{ $('Edit Fields').first().json.keyword }}\n- Karakter S\u0131n\u0131r\u0131: Maksimum 100 karakter\n\nA\u015fa\u011f\u0131daki ad\u0131mlar\u0131 izle:\n1. Ba\u015fl\u0131\u011f\u0131 analiz et ve ana temas\u0131n\u0131 anla.\n2. Verilen anahtar kelimelerden c\u00fcmle ak\u0131\u015f\u0131na uygun ve mant\u0131kl\u0131 olan en az 1 tanesini do\u011fal bir \u015fekilde meta description\u2019a dahil et. Ancak kullanaca\u011f\u0131n anahtar kelimeler konu ile alakal\u0131 ve mant\u0131kl\u0131 bir anahtar kelime olmal\u0131.\n3. Meta description\u2019\u0131 100 karakteri a\u015fmayacak \u015fekilde k\u0131sa, \u00f6z ve etkili tut.\n4. \u00dcretilecek meta description odak anahtar kelimenin tam olarak ayn\u0131s\u0131 ile ba\u015flamal\u0131. \n5. E\u011fer \u00fcretilen meta description 110 karakterden daha uzun ise meta description 100 karakterden daha k\u0131sa \u015fekilde mant\u0131kl\u0131 c\u00fcmleler ile yeniden olu\u015fturulacak\n6. Sonu\u00e7 olarak yaln\u0131zca meta description metnini d\u00f6nd\u00fcr.\n\nKarakter Say\u0131s\u0131 Hesaplama:\n- \u00dcretilecek meta description'\u0131n karakter say\u0131s\u0131n\u0131 hesaplarken \u00fcretilen i\u00e7erikte bulunan harfler say\u0131s\u0131, bo\u015fluklar\u0131n say\u0131s\u0131, noktalama i\u015faretlerinin say\u0131s\u0131, rakamlar\u0131n say\u0131s\u0131 ve sembollerin say\u0131s\u0131n\u0131 hesapla ve karakter say\u0131m\u0131n\u0131 t\u00fcm bunlar\u0131n toplam say\u0131s\u0131na g\u00f6re yap.\n- Karakter say\u0131s\u0131n\u0131 kontrol ederken a\u015fa\u011f\u0131daki \u00f6rneklerden faydalanabilirsin.\n- \u00d6rnek; \"Yapay zeka\" => Bu \u00f6rnek 10 karakter i\u00e7eriyor. \n- \u00d6rnek; \"Yapay zeka uygulamalar\u0131 g\u00fcn\u00fcm\u00fczde \u00e7ok \u00f6nemli bir yere sahip.\" => Bu \u00f6rnek 60 karakter i\u00e7eriyor.\n- \u00d6rnek; \"Yaz\u0131l\u0131m projeleriniz i\u00e7in web geli\u015ftirme, yapay zeka ve IoT tabanl\u0131 \u00e7\u00f6z\u00fcmler sunuyorum. Hemen portf\u00f6y\u00fcme g\u00f6z at\u0131n!\" => Bu \u00f6rnek 114 karakter i\u00e7eriyor.\n\n\n\u00d6rnek:\n- Ba\u015fl\u0131k: \"Yapay Zeka ile Gelecek Nas\u0131l \u015eekillenecek?\"\n- Anahtar Kelimeler: [\"yapay zeka\", \"gelecek\", \"teknoloji\"]\n- Odak Anahtar Kelime: Yapay zeka\n- Meta Description: \"Yapay zeka ile gelece\u011fin nas\u0131l \u015fekillenece\u011fini ke\u015ffedin! Teknoloji d\u00fcnyas\u0131ndaki yenilikleri \u00f6\u011frenin.\" \nNOT:\n- \u00dcretilen meta description i\u00e7eri\u011finde *#^ gibi semboller bulunmas\u0131n.\n- \u00dcretilen i\u00e7erik maksimum 10 kelimeden olu\u015fmal\u0131. Kelime say\u0131s\u0131 10'u ge\u00e7iyorsa kelime say\u0131s\u0131n\u0131 azaltmak i\u00e7in yeniden d\u00fczenleme yap.\n\u00c7\u0131kt\u0131 vermeden belirtilen kelime say\u0131s\u0131 kural\u0131na tam olarak uydu\u011fundan emin ol.\n\u015eimdi, verilen ba\u015fl\u0131k ve anahtar kelimelerle meta description\u2019\u0131 olu\u015ftur.",
        "options": {
          "systemMessage": "Sen belirtilen kurallara uygun olarak bir makale i\u00e7in meta description \u00fcretirsin. \n\u00dcretilecek meta description'da bulunan karakter say\u0131s\u0131n\u0131 hesaplarken a\u015fa\u011f\u0131daki \u00f6rneklerden faydalan.\n\nKarakter Say\u0131s\u0131 Hesaplama:\n- \u00dcretilecek meta description'\u0131n karakter say\u0131s\u0131n\u0131 hesaplarken \u00fcretilen i\u00e7rikte bulunan harfler say\u0131s\u0131, bo\u015fluklar\u0131n say\u0131s\u0131, noktalama i\u015faretlerinin say\u0131s\u0131, rakamlar\u0131n say\u0131s\u0131 ve sembollerin say\u0131s\u0131n\u0131 hesapla ve karakter say\u0131m\u0131n\u0131 t\u00fcm bunlar\u0131n toplam say\u0131s\u0131na g\u00f6re yap.\n- Karakter say\u0131s\u0131n\u0131 kontrol ederken a\u015fa\u011f\u0131daki \u00f6rneklerden faydalanabilirsin.\n- \u00d6rnek; \"Yapay zeka\" => Bu \u00f6rnek 10 karakter i\u00e7eriyor. \n- \u00d6rnek; \"Yapay zeka uygulamalar\u0131 g\u00fcn\u00fcm\u00fczde \u00e7ok \u00f6nemli bir yere sahip.\" => Bu \u00f6rnek 60 karakter i\u00e7eriyor.\n- \u00d6rnek; \"Yaz\u0131l\u0131m projeleriniz i\u00e7in web geli\u015ftirme, yapay zeka ve IoT tabanl\u0131 \u00e7\u00f6z\u00fcmler sunuyorum. Hemen portf\u00f6y\u00fcme g\u00f6z at\u0131n!\" => Bu \u00f6rnek 114 karakter i\u00e7eriyor.\n\nSonu\u00e7 olarak \u00fcretilen meta description uzunlu\u011fu maksimum 100 karakter uzunlu\u011funda, odak anahtar kelimeyi i\u00e7eren ve anahtar kelimeler dizisinde bulunan anahtar kelimelerden mant\u0131kl\u0131 olan 1 tanesini i\u00e7ermeli.\n\u00dcretilen \u00e7\u0131kt\u0131 kesinlikle en fazla 10 kelime i\u00e7ermeli. E\u011fer kelime say\u0131s\u0131 10'yi ge\u00e7iyorsa kelime say\u0131s\u0131n\u0131 mant\u0131kl\u0131 bir \u015fekilde azaltarak i\u00e7eri\u011fi yeniden olu\u015ftur.\n\u00dcretilen \u00e7\u0131kt\u0131da, belirtilen kurallara uygun olarak yaln\u0131zca meta description metni bulunmal\u0131."
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.7,
      "position": [
        -3104,
        80
      ],
      "id": "b751595b-40bb-4c34-a1ae-c239fe4eb2f6",
      "name": "Meta Desc Agent",
      "retryOnFail": true,
      "maxTries": 2,
      "waitBetweenTries": 100
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1.2,
      "position": [
        -3392,
        288
      ],
      "id": "f304691a-5a53-46ca-ae25-888ce21cfd7c",
      "name": "OpenAI Chat Model",
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "url": "={{ $json.url }}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "file",
              "outputPropertyName": "image"
            }
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        -2752,
        656
      ],
      "id": "a3b7daa5-5240-44a8-9cb8-26535fb4ef8a",
      "name": "HTTP Request2"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Odak Anahtar Kelime: {{ $('Edit Fields').item.json.keyword }}\nDil: {{ $('Edit Fields').item.json.language }}\n- B\u00fct\u00fcn i\u015flemler belirtilen dil i\u00e7in yap\u0131lacak.\n- Bu odak anahtar kelimenin e\u015f anlaml\u0131lar\u0131n\u0131 \u00e7\u0131kar. Odak anahtar kelime hari\u00e7 5 adet e\u015f anlaml\u0131 kelime yeterli.\n- \u00c7\u0131kar\u0131lan e\u015f anlaml\u0131 kelimeler mant\u0131kl\u0131 olmal\u0131d\u0131r.\n- \u00c7\u0131kt\u0131 olarak sadece yeni \u00fcretilen e\u015f anlaml\u0131 kelimeler verilecek. Odak anahatar kelime ya da ba\u015fka gereksiz ifadeler veya semboller \u00e7\u0131kt\u0131da yer almayacak. \n- E\u011fer \u00fcretilen e\u015f anlaml\u0131 kelime {{ $('Edit Fields').item.json.keyword }} ile ayn\u0131ysa bu e\u015f anlaml\u0131 kelime yerine ba\u015fka bir kelime \u00fcretilecek.\n",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.7,
      "position": [
        -7760,
        704
      ],
      "id": "4f1d368e-d0ea-44b9-a2b9-b8f3a94f578e",
      "name": "Es Anlamli Kelime Agent"
    },
    {
      "parameters": {
        "jsCode": "// Gelen ham metni al (agent'\u0131n \u00e7\u0131kt\u0131s\u0131 JSON'da bir alan alt\u0131nda olmal\u0131, \u00f6rne\u011fin 'text')\nconst rawText = $input.first().json.output;\n// $node[\"Synonyms Agent\"].json[\"text\"]; // Agent'\u0131n \u00e7\u0131kt\u0131s\u0131na g\u00f6re alan\u0131 g\u00fcncelle\n\n// Metni sat\u0131rlara b\u00f6l ve temizle\nconst synonymsArray = rawText\n  .split(\"\\n\") // Sat\u0131rlara ay\u0131r\n  .map(line => line.trim()) // Bo\u015fluklar\u0131 temizle\n  .filter(line => line) // Bo\u015f sat\u0131rlar\u0131 \u00e7\u0131kar\n  .map(line => line.replace(/^[\\s\\-\\d\\.\\*\\)\\(:\u2022\u25aa\u25cf\u25ba]+/, \"\")); // Sat\u0131r ba\u015f\u0131ndaki i\u015faret, say\u0131 ve bo\u015fluklar\u0131 temizle\n\n// Konsola yazd\u0131r (test i\u00e7in)\nconsole.log(\"Synonyms Array: \", synonymsArray);\n\n// JSON olarak d\u00f6nd\u00fcr\nreturn [{\n  json: {\n    synonyms: synonymsArray\n  }\n}];\n"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -7440,
        704
      ],
      "id": "d8f9aafa-4744-40db-b795-dcfd45925e7e",
      "name": "Es_anlamilar"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Dil: {{ $('Edit Fields').first().json.language }}\n- B\u00fct\u00fcn \u00fcretimler belirtilen dilde yap\u0131lacak.\n{{ $('Edit Fields').item.json.topic }} konusu i\u00e7in 5 adet trafi\u011fe g\u00f6re sorulabilecek sorular\u0131 \u00fcret.\n\u00dcretilen sorular bu konu i\u00e7in ger\u00e7ekten kritik \u00f6neme sahip sorulardan olmal\u0131d\u0131r.\n\u00dcretilen sorular herkesin sorabilece\u011fi sorulardan olmal\u0131d\u0131r. Yani \u00f6znel sorular olu\u015fturmamaya dikkat et.\n\u00dcretilen sorular k\u0131sa olmal\u0131d\u0131r. \u00c7ok uzun sorular \u00fcretilmeyecek.\n\u00dcretilen sorulardan her birinin ba\u015flang\u0131\u00e7 kelimesi farkl\u0131 olmak zorunda. \u00d6rne\u011fin bir soru \"Uygulama\" kelimesi ile ba\u015fl\u0131yorsa di\u011fer sorular\u0131n her biri birbirinden farkl\u0131 bir kelime ile ba\u015flayacak. \n\u00c7\u0131kt\u0131da sadece \u00fcretilen sorular yer alacak ve *->< gibi hi\u00e7bir sembol yer almayacak.\n\u00c7\u0131kt\u0131 olarak yaln\u0131zca \u00fcretilen 5 adet soruyu ver.",
        "options": {
          "systemMessage": "=Dil: {{ $('Edit Fields').first().json.language }}\n- B\u00fct\u00fcn \u00fcretimler belirtilen dilde yap\u0131lacak."
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.7,
      "position": [
        -7056,
        704
      ],
      "id": "acf89da4-e27b-4418-85ae-ebdbde6f02a1",
      "name": "AI Agent3"
    },
    {
      "parameters": {
        "jsCode": "// Gelen ham metni al (agent'\u0131n \u00e7\u0131kt\u0131s\u0131 JSON'da bir alan alt\u0131nda olmal\u0131, \u00f6rne\u011fin 'text')\nconst rawText =$input.first().json.output;\n//$node[\"Synonyms Agent\"].json[\"text\"]; // Agent'\u0131n \u00e7\u0131kt\u0131s\u0131na g\u00f6re alan\u0131 g\u00fcncelle\n\n// Metni sat\u0131rlara b\u00f6l ve temizle\nconst sorularArray = rawText\n  .split(\"\\n\")                // Sat\u0131rlara ay\u0131r\n  .map(line => line.trim())   // Bo\u015fluklar\u0131 temizle\n  .filter(line => line)       // Bo\u015f sat\u0131rlar\u0131 \u00e7\u0131kar\n  .map(line => line.replace(/^-\\s*/, \"\")); // Ba\u015f\u0131ndaki '-' ve bo\u015fluklar\u0131 kald\u0131r\n\n// Konsola yazd\u0131r (test i\u00e7in)\nconsole.log(\"S\u0131k\u00e7a Sorulan Sorular Array: \", sorularArray);\n\n// JSON olarak d\u00f6nd\u00fcr\nreturn [{\n  json: {\n    s\u0131kSorulanSorular: sorularArray\n  }\n}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -6720,
        704
      ],
      "id": "a57a1f0e-3179-4c4b-b00c-94d3b99622fb",
      "name": "Code10"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Dil: {{ $('Edit Fields').first().json.language }}\n- B\u00fct\u00fcn \u00fcretimler belirtilen dilde yap\u0131lacak.\n{{ $json['s\u0131kSorulanSorular'] }} bu sorular\u0131n her biri i\u00e7in {{ $('Edit Fields').first().json.language }} dilince ayr\u0131 ayr\u0131 mant\u0131kl\u0131 ve kritik a\u00e7\u0131klamalar \u00fcretmelisin. \n- \u00dcretilen a\u00e7\u0131klamalar k\u0131sa ama net a\u00e7\u0131klamalar olsun.\n\u00dcretilen a\u00e7\u0131klamalar kesinlikle do\u011fru bilgiler i\u00e7ermeli ve \u00f6zg\u00fcn bir bak\u0131\u015f a\u00e7\u0131s\u0131na sahip olmal\u0131.\nSorular\u0131n hepsi i\u00e7in kesinlikle a\u00e7\u0131klama \u00fcretilemli. \u00c7\u0131kt\u0131 vereden \u00f6nce t\u00fcm sorular\u0131n ele al\u0131nd\u0131\u011f\u0131n\u0131 kontrol et.\n\u00c7\u0131kt\u0131 olarak yaln\u0131zca {{ $json['s\u0131kSorulanSorular'] }} buradaki ilgili soruya ve sorulara ait \u00fcretti\u011fin a\u00e7\u0131klamalar\u0131 ver. Ba\u015fka gereksiz ifadeler kullanma. \u00c7\u0131kt\u0131 yaln\u0131zca soru ve a\u00e7\u0131klamay\u0131 i\u00e7erecek \u015fekilde sade olsun ve \u00e7\u0131kt\u0131da bunlar d\u0131\u015f\u0131nda ba\u015fka hi\u00e7bir ifade yer almas\u0131n.\n\n\u00c7\u0131kt\u0131 format\u0131 \u015fu \u015fekilde olsun:\nsoru\na\u00e7\u0131klama\n\nsoru\na\u00e7\u0131klama\n...\nSoru ve a\u00e7\u0131klama aras\u0131nda bo\u015fuk bulunsun. virg\u00fcl (,) veya ba\u015fka bir noktalama i\u015fareti ya da sembol bulunmas\u0131n.\n\n\n*A\u00e7\u0131klamalar\u0131 \u00fcretirken a\u015fa\u011f\u0131daki okunabilirlik kurallar\u0131n\u0131 kesinlikle uygula:\n1. **Etken \u00c7at\u0131 Kullan\u0131m\u0131:**\n   -Yaln\u0131zca Etken \u00c7at\u0131 Kullan ve -ebilmek, -abilmek ekleri i\u00e7eren fiiilleri kullanma.\n   - T\u00fcm c\u00fcmleler **etken \u00e7at\u0131da** yaz\u0131lacak, edilgen \u00e7at\u0131 kullan\u0131lmayacak.\n   - Edilgen \u00e7at\u0131, fiilin \"-il-\", \"-in-\", \"-\u0131l-\", \"-n-\" ekleriyle pasif hale geldi\u011fi durumdur. \u00d6rne\u011fin: \"yap\u0131l\u0131r\", \"sunulur\", \"dinletilir\", \"sa\u011flan\u0131r\", \"tasarlanm\u0131\u015ft\u0131r\", \"yap\u0131labilir\" gibi fiiller kullan\u0131lmayacak.\n   - Bunun yerine etken \u00e7at\u0131 fiilleri kullan: \"yapar\", \"sunar\", \"dinletir\", \"sa\u011flar\", \"tasarlar\", \"yapar\" gibi.\n   - **\u00d6zel Talimat: -ebilmek, -abilmek Eklerinden Kesinlikle Ka\u00e7\u0131n:**\n     - \"-ebilmek\", \"-abilmek\" ekleriyle biten fiiller (\u00f6rne\u011fin, \"yapabilir\", \"olu\u015fturabilir\", \"kald\u0131rabilir\", \"geli\u015ftirebilir\") kesinlikle kullan\u0131lmayacak. Yoast SEO, bu ekleri yanl\u0131\u015fl\u0131kla edilgen \u00e7at\u0131 olarak alg\u0131lar. Bunun yerine daha do\u011frudan etken \u00e7at\u0131 fiilleri kullan veya c\u00fcmleyi yeniden d\u00fczenle. \u00d6rne\u011fin:\n       - Yanl\u0131\u015f: \"Kullan\u0131c\u0131lar \u015fark\u0131 s\u00f6zlerini yazabilir.\" \u2192 Do\u011fru: \"Kullan\u0131c\u0131lar \u015fark\u0131 s\u00f6zlerini yazar.\"\n       - Yanl\u0131\u015f: \"Kullan\u0131c\u0131lar vokalleri kald\u0131rabilir.\" \u2192 Do\u011fru: \"Kullan\u0131c\u0131lar vokalleri kald\u0131r\u0131r.\"\n       - Yanl\u0131\u015f: \"Kullan\u0131c\u0131lar m\u00fczik teorisini \u00f6\u011frenebilir.\" \u2192 Do\u011fru: \"Kullan\u0131c\u0131lar m\u00fczik teorisini \u00f6\u011frenir.\"\n\n     - E\u011fer \"-ebilmek\", \"-abilmek\" ekini kald\u0131rmak anlam\u0131 de\u011fi\u015ftiriyorsa, c\u00fcmleyi yeniden d\u00fczenleyerek etken \u00e7at\u0131ya uygun hale getir. \u00d6rne\u011fin:\n       - Yanl\u0131\u015f: \"Kullan\u0131c\u0131lar \u015fark\u0131 s\u00f6zlerini yazabilir.\" veya \"Kullan\u0131c\u0131lar \u015fark\u0131 s\u00f6zlerini yazabilmektedir.\" \u2192 Do\u011fru: \"Kullan\u0131c\u0131lar \u015fark\u0131 s\u00f6zlerini yazma imkan\u0131na sahiptir.\" veya \"Kullan\u0131c\u0131lar \u015fark\u0131 s\u00f6zlerini yazmay\u0131 ba\u015far\u0131r.\"\n\n   - Edilgen \u00e7at\u0131 ve etken \u00e7at\u0131 fark\u0131n\u0131 anlaman i\u00e7in a\u015fa\u011f\u0131daki \u00f6rnekleri rehber al ve c\u00fcmlelerini etken \u00e7at\u0131da kur:\n     - Edilgen: \"Bu k\u0131sa s\u00fcrede olu\u015fturulan eserler farkl\u0131 m\u00fczik t\u00fcrlerinde yap\u0131labilir.\" \u2192 Etken: \"Yapay zeka bu k\u0131sa s\u00fcrede olu\u015fturulan eserleri farkl\u0131 m\u00fczik t\u00fcrlerinde yapar.\"\n     - Edilgen: \"Bu ara\u00e7lar \u015fark\u0131lardan vokalleri \u00e7\u0131karmak i\u00e7in tasarlanm\u0131\u015ft\u0131r.\" \u2192 Etken: \"Geli\u015ftiriciler bu ara\u00e7lar\u0131 \u015fark\u0131lardan vokalleri \u00e7\u0131karmak i\u00e7in tasarlar.\"\n     - Edilgen: \"Kullan\u0131\u015fl\u0131 ve etkili bir vokal ay\u0131rma program\u0131 genellikle farkl\u0131 fiyat aral\u0131klar\u0131nda sunulur.\" \u2192 Etken: \"\u015eirket kullan\u0131\u015fl\u0131 ve etkili bir vokal ay\u0131rma program\u0131n\u0131 genellikle farkl\u0131 fiyat aral\u0131klar\u0131nda sunar.\"\n     - Edilgen: \"Bu t\u00fcr uygulamalar ile m\u00fczikseverlere daha iyi deneyimler sa\u011flan\u0131r.\" \u2192 Etken: \"Bu t\u00fcr uygulamalar m\u00fczikseverlere daha iyi deneyimler sa\u011flar.\"\n     - Edilgen: \"\u015eark\u0131lar yapay zeka ile bestelenir.\" \u2192 Etken: \"Yapay zeka \u015fark\u0131lar\u0131 besteler.\"\n     - Edilgen: \"Kullan\u0131c\u0131lar\u0131n performanslar\u0131 yapay zeka taraf\u0131ndan de\u011ferlendirilir.\" \u2192 Etken: \"Yapay zeka kullan\u0131c\u0131lar\u0131n performanslar\u0131n\u0131 de\u011ferlendirir.\"\n   - Dikkat Edilecek Durumlar:\n     - \"-ebilmek\", \"-abilmek\" ekli fiillerden (\u00f6rne\u011fin, \"yapabilir\", \"geli\u015ftirebilir\") kesinlikle ka\u00e7\u0131n. Bu ekleri i\u00e7eren fiilleri c\u00fcmle i\u00e7erisinde kullanma.\n     - \"bulunmaktad\u0131r\", \"sunmaktad\u0131r\" etken \u00e7at\u0131l\u0131d\u0131r ve bu gibi fiiller kullan\u0131labilir; ama \"bulunulmaktad\u0131r\", \"sunulmaktad\u0131r\" edilgen \u00e7at\u0131l\u0131d\u0131r, bu fiiller kullan\u0131lmayacak.\n\n**Nas\u0131l Uygulayacaks\u0131n:\n   - Her c\u00fcmleyi yazarken fiilin etken \u00e7at\u0131da oldu\u011fundan emin ol.\n   - Kesinlikle \"-ebilmek\", \"-abilmek\" ekli fiiller kullanma (\u00f6rne\u011fin, \"yapabilir\" yerine \"yapar\", \"geli\u015ftirebilir\" yerine \"geli\u015ftirir\").\n   - E\u011fer \"-ebilmek\", \"-abilmek\" ekini kullanmadan c\u00fcmle kurmak anlam\u0131 de\u011fi\u015ftiriyorsa, c\u00fcmleyi yeniden d\u00fczenleyerek etken \u00e7at\u0131ya uygun hale getir (\u00f6rne\u011fin, \"yazabilir\" yerine \"yazma imkan\u0131na sahiptir\" veya \"yazmay\u0131 ba\u015far\u0131r\").\n   - Yukar\u0131daki \u00f6rnekleri rehber al, edilgen \u00e7at\u0131 fiili g\u00f6r\u00fcrsen (\u00f6rne\u011fin, \"-il-\", \"-in-\", \"-ul\", \"-\u0131l\" ekleri varsa) c\u00fcmleyi etken \u00e7at\u0131ya \u00e7evir.\n   - Fiilin \u00e7at\u0131s\u0131ndan emin de\u011filsen, k\u00f6k\u00fcn\u00fc ve eklerini kontrol et: \"-il-\", \"-in-\", \"-ul\", \"-\u0131l\" gibi ekler varsa edilgen \u00e7at\u0131l\u0131d\u0131r, kullanma.\n\n2. **Ayn\u0131 Kelimeyle Ba\u015flayan Ard\u0131\u015f\u0131k C\u00fcmleler:**\n   - \u00dcretilen cevaplar\u0131n hi\u00e7biri asla ayn\u0131 kelimeyle ba\u015flamayacak.\n   - Sorunun ba\u015flad\u0131\u011f\u0131 ilk kelime ile cevab\u0131n ba\u015flad\u0131\u011f\u0131 ilk kelime kesinlikle farkl\u0131 olacak.\n   - Her cevap \u00fcretildi\u011finde, bir \u00f6nceki cevab\u0131n ilk kelimesiyle kar\u015f\u0131la\u015ft\u0131r\u0131lacak ve ayn\u0131 kelimeyle ba\u015flamad\u0131\u011f\u0131 kontrol edilecek.\n   - E\u011fer ayn\u0131 kelimeyle ba\u015fl\u0131yorsa, c\u00fcmle yeniden d\u00fczenlenecek veya farkl\u0131 bir kelimeyle ba\u015flat\u0131lacak.\n   - Olu\u015fturuln cevaplar\u0131n her birinin ilk kelimesi kontrol edilecek, \u00fcretilen b\u00fct\u00fcn cevaplar\u0131n ilk kelimesi kesinlikle birbirinden farkl\u0131 olacak.\n   - \u00dcretilen b\u00fct\u00fcn cevaplar\u0131n ilk kelimeleri birbirinden farkl\u0131 olmak zorunda. Hi\u00e7bir cevap ayn\u0131 kelime ile ba\u015flamayacak. \u00d6rne\u011fil ilk sorunun cevab\u0131 \"Kullan\u0131c\u0131 ...\", 'kullan\u0131c\u0131' kelimesi ile ba\u015fl\u0131yor ise ikinci sorunun yan\u0131t\u0131 bu kelimeden farkl\u0131 bir kelime ile ba\u015flayacak.\n   - Ayn\u0131 \u015fekilde belirtilen sorunun ilk kelimesi ile \u00fcretilecek cevab\u0131n ilk kelimesi de birbirinden farkl\u0131 olacak.\u00d6rne\u011fin soru \"Televizyon\" kelimesi ile ba\u015flam\u0131\u015fsa \u00fcretilecek ceavp farkl\u0131 bir kelime ile ba\u015flayacak.\n   - \u00d6rnek:\n     - Yanl\u0131\u015f: \"Yapay zeka harika bir deneyim sunar. Yapay zeka ile \u015fark\u0131 s\u00f6ylemek keyiflidir.\"\n     - Do\u011fru: \"Yapay zeka harika bir deneyim sunar. \u015eark\u0131 s\u00f6ylemek bu teknolojiyle \u00e7ok keyiflidir.\"\n\n3. **C\u00fcmle Uzunlu\u011fu:**\n   - \u00dcretilecek her c\u00fcmle maksimum 15 kelimeden olu\u015facak. 15 kelimeden daha fazla say\u0131da kelime i\u00e7eren c\u00fcmleler asla \u00fcretilmeyecektir.\n\n- {{ $('Edit Fields').first().json.language }} dili dikkate al\u0131narak cevaplar \u00fcretilecek. Yani a\u00e7\u0131klamalar {{ $('Edit Fields').first().json.language }} dilinde \u00fcretilecek. Ve b\u00fct\u00fcn kurallar {{ $('Edit Fields').first().json.language }} dili i\u00e7in uygulanacak.\n",
        "options": {
          "systemMessage": "=Dil: {{ $('Edit Fields').first().json.language }}\n- B\u00fct\u00fcn \u00fcretimler belirtilen dilde yap\u0131lacak."
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.7,
      "position": [
        -6320,
        704
      ],
      "id": "56cb0156-2055-4832-8797-2eef4680ed76",
      "name": "AI Agent5"
    },
    {
      "parameters": {
        "jsCode": "const inputText = $input.first().json.output || '';\nconsole.log('Input Text:', inputText);\n\n// D\u00fczenli ifadeler:\n// 1. Sat\u0131r bazl\u0131: Soru\\nA\u00e7\u0131klama\\n\\n veya Soru\\nA\u00e7\u0131klama\\n\n// 2. Liste tabanl\u0131: Soru1,Soru2,... i\u00e7erisindeki X. soru\\nA\u00e7\u0131klama\n// 3. Basit numaral\u0131: X. Soru\\nA\u00e7\u0131klama\nconst lineBasedRegex = /([^\\n?]+(?:\\?)?)\\s*\\n([^\\n]+)(?=\\n|$)/g;\nconst listQuestionRegex = /((?:[^,\\n]+,)+[^,\\n]+)\\s*i\u00e7erisindeki\\s*(\\d+)\\.\\s*soru\\s*\\n([\\s\\S]*?)(?=(?:(?:[^,\\n]+,)+[^,\\n]+\\s*i\u00e7erisindeki\\s*\\d+\\.\\s*soru\\s*\\n)|$)/g;\nconst simpleQuestionRegex = /(\\d+)\\.\\s*(.*?)\\s*\\n([\\s\\S]*?)(?=(?:\\n\\d+\\.\\s*|$))/g;\n\nconst output = [];\n\n// 1. Sat\u0131r bazl\u0131 format\u0131 dene\nlet matches = [...inputText.matchAll(lineBasedRegex)];\nif (matches.length > 0) {\n  for (const match of matches) {\n    const question = match[1].trim();\n    const explanation = match[2].trim();\n    const cleanQuestion = question.replace(/^\\d+\\.\\s*/, '').trim();\n    const cleanExplanation = explanation.replace(/^\\d+\\.\\s*/, '').trim();\n\n    if (cleanQuestion && cleanExplanation) {\n      output.push({\n        json: {\n          question: cleanQuestion,\n          explanation: cleanExplanation\n        }\n      });\n    }\n  }\n}\n\n// 2. E\u011fer sat\u0131r bazl\u0131 format bulunmad\u0131ysa, liste tabanl\u0131 format\u0131 dene\nif (output.length === 0 && inputText.includes('i\u00e7erisindeki')) {\n  matches = [...inputText.matchAll(listQuestionRegex)];\n  for (const match of matches) {\n    const questionList = match[1].split(',').map(q => q.trim());\n    const questionNumber = parseInt(match[2]);\n    const explanation = match[3].trim();\n    const question = questionList[questionNumber - 1];\n    const cleanQuestion = question.replace(/^\\d+\\.\\s*/, '').trim();\n    const cleanExplanation = explanation.replace(/^\\d+\\.\\s*/, '').trim();\n\n    if (cleanQuestion && cleanExplanation) {\n      output.push({\n        json: {\n          question: cleanQuestion,\n          explanation: cleanExplanation\n        }\n      });\n    }\n  }\n}\n\n// 3. E\u011fer liste tabanl\u0131 format da bulunmad\u0131ysa, basit numaral\u0131 format\u0131 dene\nif (output.length === 0) {\n  matches = [...inputText.matchAll(simpleQuestionRegex)];\n  for (const match of matches) {\n    const question = match[2].trim();\n    const explanation = match[3].trim();\n    const cleanQuestion = question.replace(/^\\d+\\.\\s*/, '').trim();\n    const cleanExplanation = explanation.replace(/^\\d+\\.\\s*/, '').trim();\n\n    if (cleanQuestion && cleanExplanation) {\n      output.push({\n        json: {\n          question: cleanQuestion,\n          explanation: cleanExplanation\n        }\n      });\n    }\n  }\n}\n\n// Hata kontrol\u00fc: E\u011fer hi\u00e7 e\u015fle\u015fme yoksa\nif (output.length === 0) {\n  console.log('No valid questions found.');\n  output.push({\n    json: {\n      error: 'No valid questions found in the input.'\n    }\n  });\n}\n\nconsole.log('Total Matches:', matches.length);\nconsole.log('Output:', output);\nreturn output;"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -6000,
        704
      ],
      "id": "1a450df1-8030-4d13-8a2e-19150d4e1dc8",
      "name": "Sorular Code",
      "alwaysOutputData": false
    },
    {
      "parameters": {
        "amount": 4
      },
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        -6512,
        704
      ],
      "id": "c9ffaf8a-8372-4f0b-9e77-a5b53605881d",
      "name": "Wait"
    },
    {
      "parameters": {
        "amount": 3
      },
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        -7264,
        704
      ],
      "id": "a16516fc-b68f-4dbc-bef7-d71707d5a537",
      "name": "Wait2"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Dil: {{ $('Edit Fields').first().json.language }}\n{{ $('Edit Fields').first().json.topic }} konusu ile ilgili ve {{ $('Aggregate2').first().json.tumicerikarray }} bu i\u00e7eri\u011fe uygun olarak 150 kelimelik k\u0131sa bir makale \u00f6zeti olu\u015ftur.\n- Olu\u015fturulan \u00f6zet 150 kelime i\u00e7ersin.\n- \u00c7\u0131kt\u0131 olarak yaln\u0131zca \"\u00d6zet\" ba\u015fl\u0131\u011f\u0131 alt\u0131nda \u00fcretti\u011fin \u00f6zeti ver. \u00c7\u0131kt\u0131n\u0131 ba\u015f\u0131nda \"\u00d6zet\" kelimesi bulunmas\u0131n.\n- \u00d6zet i\u00e7erisinde \"ancak, fakat, bu do\u011frultuda, dolay\u0131s\u0131yla...\" gibi ge\u00e7i\u015f kelimelerine s\u0131kl\u0131kla yer ver.\n- \u00d6zet i\u00e7erisinde {{ $('Edit Fields').first().json.language }} i\u00e7in edilgen \u00e7at\u0131ya sahip c\u00fcmleleri kesinlikle kullanma. T\u00fcm c\u00fcmleler etken \u00e7at\u0131da kurulsun. \n- \u00d6zet i\u00e7erisinde \"-ebilmek\", \"-abilmek\" ekleri i\u00e7eren fiillere kesinlile yer verilmeyecek. Bu ekleri i\u00e7eren herhangi bir fiil c\u00fcmle i\u00e7erisinde tespit edilir ise bu fiil de\u011fi\u015ftirilecek.\n\n**Etken \u00c7at\u0131 Kullan\u0131m\u0131:**\n   -Yaln\u0131zca Etken \u00c7at\u0131 Kullan ve -ebilmek, -abilmek ekleri i\u00e7eren fiiilleri kullanma.\n   - T\u00fcm c\u00fcmleler **etken \u00e7at\u0131da** yaz\u0131lacak, edilgen \u00e7at\u0131 kullan\u0131lmayacak.\n   - Edilgen \u00e7at\u0131, fiilin \"-il-\", \"-in-\", \"-\u0131l-\", \"-n-\" ekleriyle pasif hale geldi\u011fi durumdur. \u00d6rne\u011fin: \"yap\u0131l\u0131r\", \"sunulur\", \"dinletilir\", \"sa\u011flan\u0131r\", \"tasarlanm\u0131\u015ft\u0131r\", \"yap\u0131labilir\" gibi fiiller kullan\u0131lmayacak.\n   - Bunun yerine etken \u00e7at\u0131 fiilleri kullan: \"yapar\", \"sunar\", \"dinletir\", \"sa\u011flar\", \"tasarlar\", \"yapar\" gibi.\n\n   - **\u00d6zel Talimat: -ebilmek, -abilmek Eklerinden Kesinlikle Ka\u00e7\u0131n:**\n     - \"-ebilmek\", \"-abilmek\" ekleriyle biten fiiller (\u00f6rne\u011fin, \"yapabilir\", \"olu\u015fturabilir\", \"kald\u0131rabilir\", \"geli\u015ftirebilir\") kesinlikle kullan\u0131lmayacak. Yoast SEO, bu ekleri yanl\u0131\u015fl\u0131kla edilgen \u00e7at\u0131 olarak alg\u0131lar. Bunun yerine daha do\u011frudan etken \u00e7at\u0131 fiilleri kullan veya c\u00fcmleyi yeniden d\u00fczenle. \u00d6rne\u011fin:\n       - Yanl\u0131\u015f: \"Kullan\u0131c\u0131lar \u015fark\u0131 s\u00f6zlerini yazabilir.\" \u2192 Do\u011fru: \"Kullan\u0131c\u0131lar \u015fark\u0131 s\u00f6zlerini yazar.\"\n       - Yanl\u0131\u015f: \"Kullan\u0131c\u0131lar vokalleri kald\u0131rabilir.\" \u2192 Do\u011fru: \"Kullan\u0131c\u0131lar vokalleri kald\u0131r\u0131r.\"\n       - Yanl\u0131\u015f: \"Kullan\u0131c\u0131lar m\u00fczik teorisini \u00f6\u011frenebilir.\" \u2192 Do\u011fru: \"Kullan\u0131c\u0131lar m\u00fczik teorisini \u00f6\u011frenir.\"\n\n     - E\u011fer \"-ebilmek\", \"-abilmek\" ekini kald\u0131rmak anlam\u0131 de\u011fi\u015ftiriyorsa, c\u00fcmleyi yeniden d\u00fczenleyerek etken \u00e7at\u0131ya uygun hale getir. \u00d6rne\u011fin:\n       - Yanl\u0131\u015f: \"Kullan\u0131c\u0131lar \u015fark\u0131 s\u00f6zlerini yazabilir.\" veya \"Kullan\u0131c\u0131lar \u015fark\u0131 s\u00f6zlerini yazabilmektedir.\" \u2192 Do\u011fru: \"Kullan\u0131c\u0131lar \u015fark\u0131 s\u00f6zlerini yazma imkan\u0131na sahiptir.\" veya \"Kullan\u0131c\u0131lar \u015fark\u0131 s\u00f6zlerini yazmay\u0131 ba\u015far\u0131r.\"\n\n**Nas\u0131l Uygulayacaks\u0131n:\n   - Her c\u00fcmleyi yazarken fiilin etken \u00e7at\u0131da oldu\u011fundan emin ol.\n   - Kesinlikle \"-ebilmek\", \"-abilmek\" ekli fiiller kullanma (\u00f6rne\u011fin, \"yapabilir\" yerine \"yapar\", \"geli\u015ftirebilir\" yerine \"geli\u015ftirir\").\n   - E\u011fer \"-ebilmek\", \"-abilmek\" ekini kullanmadan c\u00fcmle kurmak anlam\u0131 de\u011fi\u015ftiriyorsa, c\u00fcmleyi yeniden d\u00fczenleyerek etken \u00e7at\u0131ya uygun hale getir (\u00f6rne\u011fin, \"yazabilir\" yerine \"yazma imkan\u0131na sahiptir\" veya \"yazmay\u0131 ba\u015far\u0131r\").\n   - Yukar\u0131daki \u00f6rnekleri rehber al, edilgen \u00e7at\u0131 fiili g\u00f6r\u00fcrsen (\u00f6rne\u011fin, \"-il-\", \"-in-\", \"-ul\", \"-\u0131l\" ekleri varsa) c\u00fcmleyi etken \u00e7at\u0131ya \u00e7evir.\n   - Fiilin \u00e7at\u0131s\u0131ndan emin de\u011filsen, k\u00f6k\u00fcn\u00fc ve eklerini kontrol et: \"-il-\", \"-in-\", \"-ul\", \"-\u0131l\" gibi ekler varsa edilgen \u00e7at\u0131l\u0131d\u0131r, kullanma.\n\n**Ayn\u0131 Kelimeyle Ba\u015flayan Ard\u0131\u015f\u0131k C\u00fcmleler:**\n   - \u00dcretilen i\u00e7erikte ard\u0131\u015f\u0131k c\u00fcmleler **asla ayn\u0131 kelimeyle ba\u015flamayacak**.\n   - Her c\u00fcmle \u00fcretildi\u011finde, bir \u00f6nceki c\u00fcmlenin ilk kelimesiyle kar\u015f\u0131la\u015ft\u0131r\u0131lacak ve ayn\u0131 kelimeyle ba\u015flamad\u0131\u011f\u0131 kontrol edilecek.\n   - E\u011fer ayn\u0131 kelimeyle ba\u015fl\u0131yorsa, c\u00fcmle yeniden d\u00fczenlenecek veya farkl\u0131 bir kelimeyle ba\u015flat\u0131lacak.\n   - \u00d6rnek:\n     - Yanl\u0131\u015f: \"Yapay zeka harika bir deneyim sunar. Yapay zeka ile \u015fark\u0131 s\u00f6ylemek keyiflidir.\"\n     - Do\u011fru: \"Yapay zeka harika bir deneyim sunar. \u015eark\u0131 s\u00f6ylemek bu teknolojiyle \u00e7ok keyiflidir.\"\n\n3. **C\u00fcmle Uzunlu\u011fu:**\n   - \u00dcretilecek her c\u00fcmle maksimum 15 kelimeden olu\u015facak. 15 kelimeden daha fazla say\u0131da kelime i\u00e7eren c\u00fcmleler asla \u00fcretilmeyecektir.\n\n - \u00d6zet {{ $('Edit Fields').first().json.language }} dilinde \u00fcretilecek.\n",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.7,
      "position": [
        -3840,
        80
      ],
      "id": "80029192-785d-4231-bea6-74b3d56618fe",
      "name": "Summary Agent",
      "retryOnFail": true,
      "waitBetweenTries": 100
    },
    {
      "parameters": {
        "jsCode": "// Gelen \u00f6zet metnini al\nconst rawSummary =$input.first().json.output || ''; // \u00d6zetin 'summary' alan\u0131nda oldu\u011funu varsay\u0131yorum\n\n// \"\u00d6zet:\" ifadesini kald\u0131r\nlet summary = rawSummary;\nif (rawSummary.startsWith('\u00d6zet:')) {\n    summary = rawSummary.replace('\u00d6zet:', '').trim();\n}\nif (rawSummary.startsWith('\u00d6zet')) {\n    summary = rawSummary.replace('\u00d6zet', '').trim();\n}\nif (rawSummary.startsWith('### \u00d6zet')) {\n    summary = rawSummary.replace('### \u00d6zet', '').trim();\n}\nif (rawSummary.startsWith('###\u00d6zet')) {\n    summary = rawSummary.replace('###\u00d6zet', '').trim();\n}\nif (rawSummary.startsWith('Summary:')) {\n    summary = rawSummary.replace('Summary:', '').trim();\n}\nif (rawSummary.startsWith('### Summary')) {\n    summary = rawSummary.replace('### Summary', '').trim();\n}\nif (rawSummary.startsWith('### Resumen')) {\n    summary = rawSummary.replace('### Resumen', '').trim();\n}\nif (rawSummary.startsWith('Resumen: ')) {\n    summary = rawSummary.replace('Resumen: ', '').trim();\n}\nif (rawSummary.startsWith('Resumen')) {\n    summary = rawSummary.replace('Resumen', '').trim();\n}\n\n// \u00c7\u0131kt\u0131y\u0131 JSON olarak d\u00f6nd\u00fcr\nreturn [{\n    json: {\n        summary: summary\n    }\n}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -3536,
        80
      ],
      "id": "2ce223f2-ce66-44a5-8608-d0c625e98e10",
      "name": "Code11"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "92e6b6b8-fd0f-41fe-a4cc-26c701ce339f",
              "leftValue": "={{$node[\"Loop Over Items1\"].context[\"currentRunIndex\"];}}",
              "rightValue": "={{ ($('Edit Fields6').item.json.alt_baslik_sayisi)- ($('Edit Fields6').item.json.alt_baslik_sayisi-3 ) }}",
              "operator": {
                "type": "number",
                "operation": "equals"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        -3120,
        1344
      ],
      "id": "153354f1-37c7-4c8f-8624-f36b6cdc0584",
      "name": "If1"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Makale konusu: {{ $('Edit Fields').first().json.topic }}\nSen bir i\u00e7erik \u00fcreticisisin ve {{ $('Edit Fields').first().json.language }} dilinde i\u00e7erik \u00fcretiyorsun. G\u00f6revin, {{ $json.output }} bu alt ba\u015fl\u0131k i\u00e7eri\u011fine uygun, a\u015fa\u011f\u0131da verilen bilimsel \u00e7al\u0131\u015fmadan bahseden bir b\u00f6l\u00fcm\u00fc do\u011fal bir \u015fekilde i\u00e7eri\u011fe entegre etmek. Bilimsel \u00e7al\u0131\u015fma paragraf\u0131, alt ba\u015fl\u0131\u011f\u0131n temas\u0131yla ve \u00f6zellikle makale konusuyla uyumlu olmal\u0131 ve \u00e7al\u0131\u015fman\u0131n ba\u015fl\u0131\u011f\u0131n\u0131 ve yazarlar\u0131n\u0131 do\u011fal bir \u015fekilde i\u00e7ermeli.\n\n**Bilimsel \u00c7al\u0131\u015fma Bilgileri**:\n- Ba\u015fl\u0131k: {{ $('Scholar Set Node').first().json.title }}\n- Yazarlar: {{ $('Scholar Set Node').first().json.author1 }}, {{ $('Scholar Set Node').first().json['author2 '] }}\n- \u00d6zet: {{ $('Scholar Set Node').item.json.summary }}\n\n**Talimatlar**:\n1. Paragraf\u0131n i\u00e7ine, bilimsel \u00e7al\u0131\u015fmadan bahseden 2-3 c\u00fcmlelik bir b\u00f6l\u00fcm\u00fc do\u011fal bir \u015fekilde ekle.\n2. Bilimsel \u00e7al\u0131\u015fman\u0131n ba\u015fl\u0131\u011f\u0131n\u0131 ve yazarlar\u0131n\u0131 metne dahil et.\n3. Bilimsel \u00e7al\u0131\u015fma, makale konusu ve alt ba\u015fl\u0131\u011f\u0131n ba\u011flam\u0131yla do\u011frudan ili\u015fkili olmal\u0131. \u00c7al\u0131\u015fma, alt ba\u015fl\u0131\u011f\u0131n ele ald\u0131\u011f\u0131 ana tema, problem veya \u00e7\u00f6z\u00fcmle (\u00f6rne\u011fin, teknoloji kullan\u0131m\u0131, kullan\u0131c\u0131 deneyimi, e\u011fitim, sa\u011fl\u0131k, veri analizi) ba\u011flant\u0131l\u0131 bir konuda olmal\u0131 ve alt ba\u015fl\u0131\u011f\u0131n tart\u0131\u015ft\u0131\u011f\u0131 konuya katk\u0131 sa\u011flayan bulgular sunmal\u0131.\n4. Bilimsel \u00e7al\u0131\u015fma paragraf\u0131, alt ba\u015fl\u0131\u011f\u0131n i\u00e7eri\u011fiyle uyumlu olmal\u0131 ve \u00e7al\u0131\u015fman\u0131n \u00f6zetinden faydalanarak alt ba\u015fl\u0131\u011f\u0131n ba\u011flam\u0131nda nas\u0131l bir katk\u0131 sa\u011flad\u0131\u011f\u0131n\u0131 a\u00e7\u0131k\u00e7a belirtmeli. \u00c7al\u0131\u015fma, alt ba\u015fl\u0131\u011f\u0131n ana temas\u0131yla ba\u011fda\u015ft\u0131r\u0131lmal\u0131 ve i\u00e7eri\u011fin ak\u0131\u015f\u0131n\u0131 bozmadan, alt ba\u015fl\u0131\u011f\u0131n tart\u0131\u015ft\u0131\u011f\u0131 konuya destek olacak \u015fekilde entegre edilmelidir.\n5. \u00c7al\u0131\u015fman\u0131n makale konusu ve alt ba\u015fl\u0131kla ba\u011flant\u0131s\u0131, \u00e7al\u0131\u015fman\u0131n bulgular\u0131n\u0131n alt ba\u015fl\u0131\u011f\u0131n ele ald\u0131\u011f\u0131 konuya nas\u0131l bir perspektif veya destek sundu\u011fu a\u00e7\u0131klanarak netle\u015ftirilmeli.\n6. \u00c7\u0131kt\u0131y\u0131 d\u00fcz metin olarak d\u00f6nd\u00fcr.\n7. Metin; {{ $('Edit Fields').first().json.language }}, ak\u0131c\u0131 ve okuyucu dostu olmal\u0131.\n8. \u0130\u00e7eri\u011fe yaln\u0131zca bilimsel \u00e7al\u0131\u015fmadan bahseden b\u00f6l\u00fcm entegre edilmeli ve i\u00e7erikte bu alan d\u0131\u015f\u0131nda hi\u00e7bir de\u011fi\u015fiklik yap\u0131lmamal\u0131.\n\n\n**\u00d6rnek \u00c7\u0131kt\u0131 Format\u0131**:\nAlt ba\u015fl\u0131kla ilgili i\u00e7erik... Bu ba\u011flamda, \u201c\u00e7al\u0131\u015fma ba\u015fl\u0131\u011f\u0131\u201d ba\u015fl\u0131kl\u0131 \u00e7al\u0131\u015fma, yazarlar taraf\u0131ndan yap\u0131lm\u0131\u015f ve \u015fu bulgular\u0131 sunuyor: \u00f6zet bilgisi... gibi bilimsel \u00e7al\u0131\u015fmadan bahseden c\u011fmleler kullanmal\u0131s\u0131n ancak ayn\u0131 formatta c\u00fcmlelere ba\u011fl\u0131 kalmamal\u0131s\u0131n. Esnek yap\u0131da bilgilendirme yapmal\u0131s\u0131n.\n\n\nNOT:\n- \u0130\u00e7eri\u011fin yaln\u0131zca bilimsel \u00e7al\u0131\u015fma ile ilgili k\u0131sm\u0131n\u0131 d\u00fczenle. Orijanail i\u00e7eri\u011fin ba\u015fka bir b\u00f6l\u00fcm\u00fcnde herhangi bir de\u011fi\u015fiklik yapma. \n- \u0130\u00e7eri\u011fe gereksiz yere sat\u0131r sonu (/n) karakteri ya da gereksiz yere ** gibi semboller ekleme.\n- Bilimsel \u00e7al\u0131\u015fma ba\u015fl\u0131\u011f\u0131n\u0131 kesinlikle de\u011fi\u015ftirme, tam olarak sana verildi\u011fi gibi i\u00e7erikte kullan.\n- \u00c7\u0131kt\u0131 olarak i\u00e7eri\u011fin ba\u015fl\u0131\u011f\u0131n\u0131 ve bilimsel \u00e7al\u0131\u015fma k\u0131sm\u0131 eklenmi\u015f i\u00e7eri\u011fi ver.",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.7,
      "position": [
        -2912,
        864
      ],
      "id": "39a59aa6-9840-4d6c-8d52-f29df59d3400",
      "name": "AI Agent7"
    },
    {
      "parameters": {
        "jsCode": "// Giri\u015f verisini al\nlet rawData = $input.first().json.output;\n\n// E\u011fer \"output\" anahtar\u0131 yoksa hata f\u0131rlat\nif (!rawData) {\n  throw new Error('\"output\" anahtar\u0131 bulunamad\u0131!');\n}\n\n// E\u011fer veri string format\u0131ndaysa, JSON'a \u00e7evir\nif (typeof rawData === \"string\") {\n  try {\n    // Markdown i\u015faretlerini ve gereksiz sat\u0131r sonlar\u0131n\u0131 temizle (esnek \u015fekilde)\n    rawData = rawData\n      .replace(/```json\\s*/, \"\") // ```json ifadesini kald\u0131r (varsa)\n      .replace(/```/, \"\") // ``` ifadesini kald\u0131r (varsa)\n      .replace(/\\\\n/g, \"\") // \\n karakterlerini kald\u0131r\n      .trim(); // Ba\u015ftaki ve sondaki bo\u015fluklar\u0131 kald\u0131r\n\n    // JSON parse i\u015flemi\n    rawData = JSON.parse(rawData);\n  } catch (error) {\n    throw new Error(`JSON parse hatas\u0131: ${error.message}`);\n  }\n} else if (typeof rawData !== \"object\" || rawData === null) {\n  // E\u011fer rawData string de\u011filse ve bir obje de de\u011filse hata f\u0131rlat\n  throw new Error(\"Veri string veya obje format\u0131nda olmal\u0131!\");\n}\n\n// E\u011fer \"table\" anahtar\u0131 yoksa veya yanl\u0131\u015f formatta geldiyse hata d\u00f6nd\u00fcr\nif (!rawData.table || !Array.isArray(rawData.table)) {\n  throw new Error(\"Tablo verisi istenen formatta de\u011fil!\");\n}\n\n// Tablo verilerinin yap\u0131s\u0131n\u0131 kontrol et\nrawData.table.forEach((row, index) => {\n  if (!row.hasOwnProperty(\"\u00d6zellik\") || !row.hasOwnProperty(\"A\u00e7\u0131klama\")) {\n    throw new Error(`Tablo sat\u0131r\u0131 ${index + 1}: \"\u00d6zellik\" veya \"A\u00e7\u0131klama\" anahtar\u0131 eksik!`);\n  }\n  if (typeof row[\"\u00d6zellik\"] !== \"string\" || typeof row[\"A\u00e7\u0131klama\"] !== \"string\") {\n    throw new Error(`Tablo sat\u0131r\u0131 ${index + 1}: \"\u00d6zellik\" veya \"A\u00e7\u0131klama\" string olmal\u0131!`);\n  }\n});\n\nreturn [{ json: rawData }];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -1792,
        80
      ],
      "id": "89dd90be-ace2-4985-a738-a963850be140",
      "name": "Fix Table"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Makale konusu: {{ $('Edit Fields').first().json.topic }}\nAnahtar kelimeler: {{ $('Edit Fields').first().json.keyword }}, {{ $('Es_anlamilar').first().json.synonyms }}\nDil: {{ $('Edit Fields').first().json.language }}\n\n- Makale konusu ve anahtar kelimeler bilgilerini kullanarak, bu konuya uygun, {{ $('Edit Fields').first().json.language }} dilinde ve mant\u0131kl\u0131 bir tablo verisi olu\u015ftur.\n- Tablo, 3 sat\u0131r ve 2 s\u00fctundan olu\u015fmal\u0131. \u0130lk s\u00fctun \"\u00d6zellik\", ikinci s\u00fctun \"A\u00e7\u0131klama\" olmal\u0131.\n- Tablo verileri, konuya \u00f6zel ve anlaml\u0131 \u00f6zellik-a\u00e7\u0131klama \u00e7iftleri i\u00e7ermeli. \u00d6rne\u011fin, e\u011fer konu \"Ak\u0131ll\u0131 Telefonlar\" ise, \u00f6zellikler \"Ekran Boyutu\", \"Batarya \u00d6mr\u00fc\", \"Kamera Kalitesi\" gibi somut ve mant\u0131kl\u0131 \u015feyler olmal\u0131; \"Konu\" veya \"Anahtar Kelimeler\" gibi genel ifadeler kullan\u0131lmamal\u0131.\n- \u00c7\u0131kt\u0131y\u0131 yaln\u0131zca \u015fu formattta ver:\n  {\n    \"table\": [\n      { \"\u00d6zellik\": \"\", \"A\u00e7\u0131klama\": \"\" },\n      { \"\u00d6zellik\": \"\", \"A\u00e7\u0131klama\": \"\" },\n      { \"\u00d6zellik\": \"\", \"A\u00e7\u0131klama\": \"\" }\n    ]\n  }\n- \u00c7\u0131kt\u0131y\u0131 do\u011frudan d\u00f6nd\u00fcr; string format\u0131nda (\u00f6rne\u011fin, \"\\n\" karakterleriyle veya ```json ``` gibi ifadeler) veya ba\u015fka bir metin format\u0131nda d\u00f6nd\u00fcrme.\n- Tablo verisi d\u0131\u015f\u0131nda hi\u00e7bir ek a\u00e7\u0131klama, metin veya gereksiz ifade ekleme. Yaln\u0131zca yukar\u0131daki formatta tablo verisini d\u00f6nd\u00fcr.\n- Sa\u00e7ma veya mant\u0131ks\u0131z ifadeler kullanma; tablo verileri konuya uygun ve anlaml\u0131 olmal\u0131.",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.7,
      "position": [
        -2096,
        80
      ],
      "id": "e80e9178-ebfb-45ff-8adc-6e00c7f3eee6",
      "name": "Table Agent",
      "retryOnFail": true,
      "waitBetweenTries": 100
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=A\u015fa\u011f\u0131daki konu i\u00e7in tamamen {{ $('Edit Fields').first().json.language }} dilinde bir yazar ismi, uzmanl\u0131k alan\u0131, yazar hakk\u0131nda k\u0131sa bir biyografi (deneyim, uzmanl\u0131k, yetkinlik, g\u00fcvenilirlik) ve konuya uygun 3 referans (linksiz) \u00fcret:\nKonu: {{ $('Edit Fields').item.json.topic }}\n\n- Yazar ismi ger\u00e7ek\u00e7i bir T\u00fcrk\u00e7e isim olsun (\u00f6rne\u011fin, \"Ay\u015fe Y\u0131lmaz\", \"Mehmet Kaya\").\n- Uzmanl\u0131k alan\u0131, konuya uygun ve anlaml\u0131 bir alan olsun.\n- Biyografi 2-3 c\u00fcmlelik, profesyonel ve g\u00fcvenilir bir \u015fekilde yaz\u0131ls\u0131n.\n- Referanslar, konuya uygun, genel ge\u00e7er kaynaklar olsun (\u00f6rne\u011fin, \"Sekt\u00f6rel Raporlar\", \"Akademik \u00c7al\u0131\u015fmalar\").\n- {{ $('Edit Fields').first().json.language }} dilinde \u00fcretim yap\u0131lacak.\n\n\u00c7\u0131kt\u0131y\u0131 \u015fu formatta d\u00f6nd\u00fcr:\n{\n  \"author\": {\n    \"name\": \"Yazar \u0130smi\",\n    \"expertise\": \"Uzmanl\u0131k Alan\u0131\",\n    \"bio\": \"Yazar hakk\u0131nda k\u0131sa biyografi\"\n  },\n  \"references\": [\"Referans 1\", \"Referans 2\", \"Referans 3\"]\n}\n\n- \u00c7\u0131kt\u0131y\u0131 do\u011frudan d\u00f6nd\u00fcr; string format\u0131nda (\u00f6rne\u011fin, \"\\n\" karakterleriyle veya ```json ``` gibi ifadeler) veya ba\u015fka bir metin format\u0131nda d\u00f6nd\u00fcrme.",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.7,
      "position": [
        -1664,
        80
      ],
      "id": "6c35b9b0-8b20-40d3-9920-7d25271cd0b6",
      "name": "Random Yazar Agent",
      "retryOnFail": true
    },
    {
      "parameters": {
        "jsCode": "// Giri\u015f verisini al\nlet rawData =$input.first().json.output; \n\n// E\u011fer \"output\" anahtar\u0131 yoksa hata f\u0131rlat\nif (!rawData) {\n  throw new Error('\"output\" anahtar\u0131 bulunamad\u0131!');\n}\n\n// E\u011fer veri string format\u0131ndaysa, JSON'a \u00e7evir\nif (typeof rawData === \"string\") {\n  try {\n    // Markdown i\u015faretlerini ve gereksiz sat\u0131r sonlar\u0131n\u0131 temizle (esnek \u015fekilde)\n    rawData = rawData\n      .replace(/```json\\s*/, \"\") // ```json ifadesini kald\u0131r (varsa)\n      .replace(/```/, \"\") // ``` ifadesini kald\u0131r (varsa)\n      .replace(/\\\\n/g, \"\") // \\n karakterlerini kald\u0131r\n      .trim(); // Ba\u015ftaki ve sondaki bo\u015fluklar\u0131 kald\u0131r\n\n    // JSON parse i\u015flemi\n    rawData = JSON.parse(rawData);\n  } catch (error) {\n    throw new Error(`JSON parse hatas\u0131: ${error.message}`);\n  }\n} else if (typeof rawData !== \"object\" || rawData === null) {\n  // E\u011fer rawData string de\u011filse ve bir obje de de\u011filse hata f\u0131rlat\n  throw new Error(\"Veri string veya obje format\u0131nda olmal\u0131!\");\n}\n\n// E\u011fer \"author\" anahtar\u0131 yoksa veya bir obje de\u011filse hata d\u00f6nd\u00fcr\nif (!rawData.author || typeof rawData.author !== \"object\" || rawData.author === null) {\n  throw new Error('\"author\" anahtar\u0131 eksik veya ge\u00e7ersiz formatta!');\n}\n\n// E\u011fer \"references\" anahtar\u0131 yoksa veya bir dizi de\u011filse hata d\u00f6nd\u00fcr\nif (!rawData.references || !Array.isArray(rawData.references)) {\n  throw new Error('\"references\" anahtar\u0131 eksik veya bir dizi de\u011fil!');\n}\n\n// Author objesinin yap\u0131s\u0131n\u0131 kontrol et\nif (!rawData.author.hasOwnProperty(\"name\") || typeof rawData.author.name !== \"string\") {\n  throw new Error('\"author.name\" anahtar\u0131 eksik veya string de\u011fil!');\n}\nif (!rawData.author.hasOwnProperty(\"expertise\") || typeof rawData.author.expertise !== \"string\") {\n  throw new Error('\"author.expertise\" anahtar\u0131 eksik veya string de\u011fil!');\n}\nif (!rawData.author.hasOwnProperty(\"bio\") || typeof rawData.author.bio !== \"string\") {\n  throw new Error('\"author.bio\" anahtar\u0131 eksik veya string de\u011fil!');\n}\n\n// References dizisinin yap\u0131s\u0131n\u0131 kontrol et\nrawData.references.forEach((ref, index) => {\n  if (typeof ref !== \"string\") {\n    throw new Error(`References dizisindeki ${index + 1}. eleman string olmal\u0131!`);\n  }\n});\n\nreturn [{ json: rawData }];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -1360,
        80
      ],
      "id": "a7ba98c3-f2d8-4b01-8e32-b89e76a545b6",
      "name": "Yazar_Referans Code"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Dil: {{ $('Edit Fields').first().json.language }}\nSen bir SEO uzman\u0131 olarak g\u00f6rev yapan bir yapay zeka asistan\u0131s\u0131n. G\u00f6revin, verilen makale ba\u015fl\u0131\u011f\u0131 ve anahtar kelimeler dizisi kullanarak, ba\u015fl\u0131k ile uyumlu ve SEO uyumlu bir meta k\u0131sa isim \u00fcretmek. K\u0131sa isim, {{ $('Edit Fields').first().json.language }} dilinde, maksimum 15 karakter (harf say\u0131s\u0131) uzunlu\u011funda olmal\u0131 ve anahtar kelimeleri do\u011fal bir \u015fekilde i\u00e7ermeli. Kullan\u0131c\u0131y\u0131 \u00e7ekecek, a\u00e7\u0131k ve etkili bir dil kullan. \u0130\u015fte detaylar:\n\n- Makale Ba\u015fl\u0131\u011f\u0131:{{ $('Edit Fields').first().json.topic }}\n- Odak Anahtar Kelme: {{ $('Edit Fields').first().json.keyword }}\n- Karakter S\u0131n\u0131r\u0131: Maksimum 15 karakter\n\nA\u015fa\u011f\u0131daki ad\u0131mlar\u0131 izle:\n1. Makale ba\u015fl\u0131\u011f\u0131n\u0131 analiz et ve ana temas\u0131n\u0131 anla.\n3. K\u0131sa isim {{ $('Edit Fields').first().json.keyword }} kelimesi ile ba\u015flas\u0131n ve do\u011fal bir \u015fekilde olu\u015fturulsun. Yani \u00fcretilecek k\u0131sa isim'in ilk kelimesi {{ $('Edit Fields').first().json.keyword }} olmal\u0131 ve mant\u0131kl\u0131 bir c\u00fcmle kurulmal\u0131.\n4. K\u0131sa isim'i 15 karakteri a\u015fmayacak \u015fekilde k\u0131sa, \u00f6z, dikkat \u00e7ekici ve mant\u0131kl\u0131 bir c\u00fcmle yap\u0131s\u0131nda tut.\n5. Olu\u015fturulan k\u0131sa isim'de *^#<>|- _ gibi semboller bulunmas\u0131n.\n6. \u00c7\u0131kt\u0131 olarak yaln\u0131zca k\u0131sa isim metnini d\u00f6nd\u00fcr.",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.7,
      "position": [
        -2400,
        80
      ],
      "id": "b03e185a-3b2f-4fa2-b9ec-31951747e584",
      "name": "K\u0131sa isim",
      "retryOnFail": true,
      "maxTries": 2,
      "waitBetweenTries": 100
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "723aa482-152b-4b16-b21f-7c4e1b866ab0",
              "name": "tumicerik",
              "value": "={{ $json.output }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -3504,
        656
      ],
      "id": "1ad2877c-6da3-4a9b-ae32-10de345ab559",
      "name": "Edit Fields2"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "71843f55-3cd9-4eb2-9984-562221f71493",
              "name": "url",
              "value": "={{ $('OpenAI').item.json.url }}",
              "type": "string"
            },
            {
              "id": "787d2ce8-7f24-4501-a1a9-e6283652425d",
              "name": "giris_metni",
              "value": "={{ $('AI Agent2').item.json.output }}",
              "type": "string"
            },
            {
              "id": "d74fad36-baf3-43f5-ab40-1df66e1cd1d5",
              "name": "meta_title",
              "value": "={{ $('AI Agent4').item.json.output }}",
              "type": "string"
            },
            {
              "id": "1b728d40-2d83-4b90-96d3-ca7929d78ebb",
              "name": "meta_desc",
              "value": "={{ $('Meta Desc Agent').item.json.output }}",
              "type": "string"
            },
            {
              "id": "08f2d3c2-2256-43a4-ac7c-be11b850760e",
              "name": "keyword",
              "value": "={{ $('Edit Fields').item.json.keyword }}",
              "type": "string"
            },
            {
              "id": "95e431f6-1108-4a1c-83eb-f8950a0c14d4",
              "name": "k\u0131sa_isim",
              "value": "={{ $('K\u0131sa isim').item.json.output }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -800,
        80
      ],
      "id": "7c512548-9b09-4837-ac43-f380046c3426",
      "name": "Edit Fields3"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "908c4bea-bf35-4d05-92ee-9f9e93f9c2b9",
              "name": "alt_baslik_sayisi",
              "value": "={{ Math.floor($('Edit Fields').item.json.word_count/200) }}",
              "type": "string"
            },
            {
              "id": "4a783c80-4f16-4747-a326-6d6a1565c6f2",
              "name": "dis_baglanti_sayisi",
              "value": "={{ Math.floor($('Edit Fields').item.json.word_count/1000) }}",
              "type": "string"
            },
            {
              "id": "5cac93ae-d82e-412e-9502-e8da9808ae82",
              "name": "eksik_alt_baslik_sayisi",
              "value": "={{ Math.floor($('Edit Fields').first().json.word_count/200) }}",
              "type": "number"
            },
            {
              "id": "62200a3f-fadc-4396-8412-481e18bf66c4",
              "name": "x",
              "value": 0,
              "type": "number"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -4624,
        1024
      ],
      "id": "28266260-894a-4053-87ac-79a859316117",
      "name": "Edit Fields6"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=A\u015fa\u011f\u0131daki ifadeleri {{ $('Edit Fields').first().json.language }} diline \u00e7evirerek \u00e7\u0131kt\u0131y\u0131 belirtilen formatta d\u00f6nd\u00fcr.\n1. \"\u00d6zet\"\n2. \"Yazar\"\n3. \"Yazar Hakk\u0131nda\"\n4. \"Kaynak\u00e7a ve Referanslar\n5. \"{{ $('Edit Fields').first().json.topic }}\"\n6. \"{{ $('Scholar Set Node').first().json.title }}\"\n7. \"{{ $('Edit Fields').first().json.keyword }}\"\n8. \"S\u0131k\u00e7a Sorulan Sorular\" \n9. \"Uzmanl\u0131k Alan\u0131\"\n\n-\u00c7\u0131kt\u0131 olarak yaln\u0131zca \u00e7evirilen ifadeleri d\u00f6nd\u00fcr. Ba\u015fka gereksiz bir ifadeyi ya da c\u00fcmleyi \u00e7\u0131kt\u0131ya ekleme.",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.7,
      "position": [
        -1216,
        80
      ],
      "id": "4ba85d2c-1445-4a4f-a399-b1a1ea785e77",
      "name": "AI Agent1",
      "retryOnFail": true
    },
    {
      "parameters": {
        "jsCode": "// Girdiyi al\nconst rawInput = $input.first().json.output;\n\n// Sat\u0131rlara ay\u0131r ve temizle\nconst lines = rawInput\n  .split('\\n')                            // Sat\u0131rlar\u0131 ay\u0131r\n // .map(line => line.replace(/^\\d+\\.\\s+\"|\\\"$/g, '').trim()); // Ba\u015f\u0131ndaki numara ve t\u0131rnaklar\u0131 temizle\n // .map(line => line.replace(/^\\d+\\.\\s+\"|\"$/g, '').trim());  //numara ve ifade aras\u0131nda bo\u015fluk oldu\u011fu durum i\u00e7in \n  .map(line => line.replace(/^\\d+\\.\\s*\"?|\"?$/g, '').trim());\n\n// Atamalar\u0131 yap\nconst output = {\n  ozet: lines[0] || null,\n  yazar: lines[1] || null,\n  yazarHakkinda: lines[2] || null,\n  kaynakcaVeReferanslar: lines[3] || null,\n  makaleBasligi: lines[4] || null,\n  bilimselCalismaBasligi: lines[5] || null,\n  odakKelimeCeviri: lines[6] || null,\n  FAQ: lines[7] || null,\n  Uzmanl\u0131kAlan\u0131: lines[8] || null\n};\n\n// \u00c7\u0131kt\u0131y\u0131 d\u00f6nd\u00fcr\nreturn [\n  {\n    json: output\n  }\n];\n"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -944,
        80
      ],
      "id": "66a5e1c6-5246-4e7f-ab76-fc1d660d558e",
      "name": "Ceviriler Code"
    },
    {
      "parameters": {
        "operation": "upload",
        "fileName": "={{ $('Edit Fields7').first().json.filename }}",
        "binaryPropertyName": "image",
        "additionalFields": {
          "acl": "publicReadWrite"
        }
      },
      "type": "n8n-nodes-base.awsS3",
      "typeVersion": 2,
      "position": [
        -2624,
        656
      ],
      "id": "e45d4588-6545-4173-8bbe-873d55e584a4",
      "name": "AWS S3"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "baeebca7-c49b-4978-82c9-239cda46e597",
              "name": "filename",
              "value": "={{ 'image-' + $now.toFormat('yyyyMMdd-HHmmss') + '.png' }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -3040,
        656
      ],
      "id": "95cbc533-d1e1-4609-9ed4-6435aeb9ff41",
      "name": "Edit Fields7"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "e2d2cad5-8845-4727-a0d5-f464e3493a53",
              "name": "amazonimageUrl",
              "value": "={{ 'https://your-bucket-name.s3.eu-central-1.amazonaws.com/' + $('Edit Fields7').item.json.filename}}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -2480,
        656
      ],
      "id": "abae1ae7-69c7-4fe3-b4ac-833aead10f7e",
      "name": "Edit Fields8"
    },
    {
      "parameters": {},
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        -2544,
        80
      ],
      "id": "28dbca2b-c586-4179-a6e3-d8c50016f402",
      "name": "Wait1"
    },
    {
      "parameters": {
        "url": "https://serpapi.com/search?engine=google_scholar",
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "q",
              "value": "={{ $('Edit Fields').first().json.topic }}"
            },
            {
              "name": "hl ",
              "value": "tr"
            },
            {
              "name": "num",
              "value": "1"
            },
            {
              "name": "api_key"
            },
            {
              "name": "as_sdt",
              "value": "0,1"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        -5776,
        704
      ],
      "id": "3991f218-1bbb-4d76-9c04-6edd64d5d2fb",
      "name": "HTTP Request1",
      "executeOnce": true
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "1f069808-34c2-43d8-bf0b-c2d959b287d2",
              "name": "title",
              "value": "={{ $json.organic_results[0].title }}",
              "type": "string"
            },
            {
              "id": "b8e64825-1b77-4ea3-84e3-f2e2bf5d2a6d",
              "name": "link",
              "value": "={{ $json.organic_results[0].link }}",
              "type": "string"
            },
            {
              "id": "68a02bb5-9f60-4bbe-b29b-1cb4aeef95fe",
              "name": "summary",
              "value": "={{ $json.organic_results[0].publication_info.summary }}",
              "type": "string"
            },
            {
              "id": "754f1463-8688-43a7-aa32-31ab9d0f11b7",
              "name": "author1",
              "value": "={{ $json.organic_results[0].publication_info.authors[0].name }}",
              "type": "string"
            },
            {
              "id": "de1c54f1-971e-4bf3-91fb-d57970e9504e",
              "name": "author2 ",
              "value": "={{ $json.organic_results[0].publication_info.authors[1].name }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -5552,
        704
      ],
      "id": "2b21fd8d-da3c-4539-ab6b-3469f0c20b02",
      "name": "Scholar Set Node"
    },
    {
      "parameters": {
        "amount": 3
      },
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        -5344,
        704
      ],
      "id": "db4180be-fd87-4856-9fbb-0ec76affda52",
      "name": "Wait3"
    },
    {
      "parameters": {
        "projectId": {
          "__rl": true,
          "value": "",
          "mode": "id"
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleVertex",
      "typeVersion": 1,
      "position": [
        -7744,
        928
      ],
      "id": "f8e056f4-3fa0-4114-8b13-ba2045cdc89c",
      "name": "Google Vertex Chat Model"
    },
    {
      "parameters": {
        "projectId": {
          "__rl": true,
          "value": "",
          "mode": "id"
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleVertex",
      "typeVersion": 1,
      "position": [
        -7040,
        928
      ],
      "id": "2fc32f11-1df3-4449-8e89-30046213d3d7",
      "name": "Google Vertex Chat Model1"
    },
    {
      "parameters": {
        "projectId": {
          "__rl": true,
          "value": "",
          "mode": "id"
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleVertex",
      "typeVersion": 1,
      "position": [
        -6320,
        864
      ],
      "id": "da5bdff4-9e7a-4bdc-9b0a-bf695b65810b",
      "name": "Google Vertex Chat Model2"
    },
    {
      "parameters": {
        "projectId": {
          "__rl": true,
          "value": "",
          "mode": "id"
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleVertex",
      "typeVersion": 1,
      "position": [
        -4480,
        1264
      ],
      "id": "e1cae0ba-225a-4d12-8b86-6fcc7c6dd9d6",
      "name": "Google Vertex Chat Model3"
    },
    {
      "parameters": {
        "projectId": {
          "__rl": true,
          "value": "",
          "mode": "id"
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleVertex",
      "typeVersion": 1,
      "position": [
        -2912,
        1088
      ],
      "id": "e9e0b070-70e6-4ec0-8f94-5590bded64c2",
      "name": "Google Vertex Chat Model4"
    },
    {
      "parameters": {
        "projectId": {
          "__rl": true,
          "value": "",
          "mode": "id"
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleVertex",
      "typeVersion": 1,
      "position": [
        -2656,
        1280
      ],
      "id": "c350c415-9c47-4107-852d-ecfc65943ef6",
      "name": "Google Vertex Chat Model5"
    },
    {
      "parameters": {
        "projectId": {
          "__rl": true,
          "value": "",
          "mode": "id"
        },
        "modelName": "gemini-2.0-flash-lite",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleVertex",
      "typeVersion": 1,
      "position": [
        -3824,
        288
      ],
      "id": "6a870966-bf70-411d-a391-3fffea129f00",
      "name": "Google Vertex Chat Model6"
    },
    {
      "parameters": {
        "projectId": {
          "__rl": true,
          "value": "",
          "mode": "id"
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleVertex",
      "typeVersion": 1,
      "position": [
        -3072,
        288
      ],
      "id": "3cf6aea4-d8ca-4f06-9e2d-9107d70493dd",
      "name": "Google Vertex Chat Model7"
    },
    {
      "parameters": {
        "projectId": {
          "__rl": true,
          "value": "",
          "mode": "id"
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleVertex",
      "typeVersion": 1,
      "position": [
        -2816,
        288
      ],
      "id": "45581137-4912-49bd-846d-6b9dec431f29",
      "name": "Google Vertex Chat Model9"
    },
    {
      "parameters": {
        "projectId": {
          "__rl": true,
          "value": "",
          "mode": "id"
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleVertex",
      "typeVersion": 1,
      "position": [
        -2400,
        288
      ],
      "id": "f747e5a1-f169-4b79-9746-7d1923e69e66",
      "name": "Google Vertex Chat Model10"
    },
    {
      "parameters": {
        "projectId": {
          "__rl": true,
          "value": "",
          "mode": "id"
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleVertex",
      "typeVersion": 1,
      "position": [
        -2096,
        288
      ],
      "id": "43f999c8-36fa-443a-bc0b-369ce4b6e7b2",
      "name": "Google Vertex Chat Model11"
    },
    {
      "parameters": {
        "projectId": {
          "__rl": true,
          "value": "",
          "mode": "id"
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleVertex",
      "typeVersion": 1,
      "position": [
        -1664,
        288
      ],
      "id": "c5098b08-c393-4929-9402-bbfde294fd8b",
      "name": "Google Vertex Chat Model12"
    },
    {
      "parameters": {
        "projectId": {
          "__rl": true,
          "value": "",
          "mode": "id"
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleVertex",
      "typeVersion": 1,
      "position": [
        -1200,
        256
      ],
      "id": "673cfea1-54f1-43d8-83e2-889627182e3d",
      "name": "Google Vertex Chat Model13"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "04f8b173-70d4-4a07-895f-fa27cf5cb248",
              "name": "content",
              "value": "={{ $('Code1').item.json.result }}",
              "type": "string"
            },
            {
              "id": "7ec9ab9e-0dea-4c60-bcd5-1dd139ba9adc",
              "name": "aa",
              "value": "={{ $('Edit Fields').first().json.language }}",
              "type": "string"
            },
            {
              "id": "97f37e95-0ecd-4e7d-b7e5-2d66ef04d53f",
              "name": "b",
              "value": "={{ $('Meta Desc Agent').item.json.output }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -112,
        -64
      ],
      "id": "09bbab48-4eec-4fd0-a9f4-6823af892776",
      "name": "Edit Fields4"
    }
  ],
  "connections": {
    "Webhook": {
      "main": [
        [
          {
            "node": "Edit Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request": {
      "main": [
        [
          {
            "node": "Split Out",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Out": {
      "main": [
        [
          {
            "node": "Edit Fields1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields1": {
      "main": [
        [
          {
            "node": "Aggregate",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate": {
      "main": [
        [
          {
            "node": "Edit Fields6",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Window Buffer Memory2": {
      "ai_memory": [
        [
          {
            "node": "Alt Baslik Agent",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Code4": {
      "main": [
        [
          {
            "node": "Aggregate1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate1": {
      "main": [
        [
          {
            "node": "Split Out2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items1": {
      "main": [
        [
          {
            "node": "Edit Fields2",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Makale Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Out2": {
      "main": [
        [
          {
            "node": "Loop Over Items1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Replace Me": {
      "main": [
        [
          {
            "node": "Loop Over Items1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Makale Agent": {
      "main": [
        [
          {
            "node": "If1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Alt Baslik Agent": {
      "main": [
        [
          {
            "node": "Code4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Replace Me",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent": {
      "main": [
        [
          {
            "node": "Replace Me",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "Makale Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate2": {
      "main": [
        [
          {
            "node": "Edit Fields7",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code5": {
      "main": [
        [
          {
            "node": "Aggregate2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code1": {
      "main": [
        [
          {
            "node": "Code7",
            "type": "main",
            "index": 0
          },
          {
            "node": "Convert to File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent2": {
      "main": [
        [
          {
            "node": "Meta Desc Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI": {
      "main": [
        [
          {
            "node": "HTTP Request2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent4": {
      "main": [
        [
          {
            "node": "Wait1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Site HTML": {
      "main": [
        [
          {
            "node": "Scrape Internal Links Node",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Scrape Internal Links Node": {
      "main": [
        [
          {
            "node": "Es Anlamli Kelime Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code7": {
      "main": [
        [
          {
            "node": "Wordpress",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Meta Desc Agent": {
      "main": [
        [
          {
            "node": "AI Agent4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent2",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request2": {
      "main": [
        [
          {
            "node": "AWS S3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Es Anlamli Kelime Agent": {
      "main": [
        [
          {
            "node": "Es_anlamilar",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Es_anlamilar": {
      "main": [
        [
          {
            "node": "Wait2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent3": {
      "main": [
        [
          {
            "node": "Code10",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code10": {
      "main": [
        [
          {
            "node": "Wait",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent5": {
      "main": [
        [
          {
            "node": "Sorular Code",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Sorular Code": {
      "main": [
        [
          {
            "node": "HTTP Request1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait": {
      "main": [
        [
          {
            "node": "AI Agent5",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait2": {
      "main": [
        [
          {
            "node": "AI Agent3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Summary Agent": {
      "main": [
        [
          {
            "node": "Code11",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code11": {
      "main": [
        [
          {
            "node": "AI Agent2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If1": {
      "main": [
        [
          {
            "node": "AI Agent7",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "If",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent7": {
      "main": [
        [
          {
            "node": "Replace Me",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fix Table": {
      "main": [
        [
          {
            "node": "Random Yazar Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Table Agent": {
      "main": [
        [
          {
            "node": "Fix Table",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Random Yazar Agent": {
      "main": [
        [
          {
            "node": "Yazar_Referans Code",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Yazar_Referans Code": {
      "main": [
        [
          {
            "node": "AI Agent1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "K\u0131sa isim": {
      "main": [
        [
          {
            "node": "Table Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields": {
      "main": [
        [
          {
            "node": "Fetch Site HTML",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields2": {
      "main": [
        [
          {
            "node": "Code5",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields3": {
      "main": [
        [
          {
            "node": "Code1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields6": {
      "main": [
        [
          {
            "node": "Alt Baslik Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent1": {
      "main": [
        [
          {
            "node": "Ceviriler Code",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Ceviriler Code": {
      "main": [
        [
          {
            "node": "Edit Fields3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields7": {
      "main": [
        [
          {
            "node": "OpenAI",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AWS S3": {
      "main": [
        [
          {
            "node": "Edit Fields8",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields8": {
      "main": [
        [
          {
            "node": "Summary Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait1": {
      "main": [
        [
          {
            "node": "K\u0131sa isim",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request1": {
      "main": [
        [
          {
            "node": "Scholar Set Node",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Scholar Set Node": {
      "main": [
        [
          {
            "node": "Wait3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait3": {
      "main": [
        [
          {
            "node": "HTTP Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Vertex Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Es Anlamli Kelime Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Google Vertex Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent3",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Google Vertex Chat Model2": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent5",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Google Vertex Chat Model3": {
      "ai_languageModel": [
        [
          {
            "node": "Alt Baslik Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Google Vertex Chat Model4": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent7",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Google Vertex Chat Model5": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Google Vertex Chat Model6": {
      "ai_languageModel": [
        [
          {
            "node": "Summary Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Google Vertex Chat Model7": {
      "ai_languageModel": [
        [
          {
            "node": "Meta Desc Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Google Vertex Chat Model9": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent4",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Google Vertex Chat Model10": {
      "ai_languageModel": [
        [
          {
            "node": "K\u0131sa isim",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Google Vertex Chat Model11": {
      "ai_languageModel": [
        [
          {
            "node": "Table Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Google Vertex Chat Model12": {
      "ai_languageModel": [
        [
          {
            "node": "Random Yazar Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Google Vertex Chat Model13": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent1",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Convert to File": {
      "main": [
        [
          {
            "node": "Edit Fields4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1",
    "binaryMode": "separate"
  },
  "versionId": "8e5d66cb-12f6-4cd3-a8d4-5668599898dc",
  "id": "pgH0gCMyIxmRh6oS",
  "tags": []
}