AutomationFlowsAI & RAG › Tp - Step 4: Plan Document

Tp - Step 4: Plan Document

TP - Step 4: Plan Document. Uses agent, lmChatOpenRouter, toolCode. Webhook trigger; 7 nodes.

Webhook trigger★★★★☆ complexityAI-powered7 nodesAgentOpenRouter ChatTool Code
AI & RAG Trigger: Webhook Nodes: 7 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow follows the Agent → OpenRouter Chat recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "name": "TP - Step 4: Plan Document",
  "nodes": [
    {
      "id": "webhook",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        0,
        300
      ],
      "parameters": {
        "httpMethod": "POST",
        "path": "tp-step-04-plan",
        "responseMode": "responseNode",
        "options": {}
      },
      "typeVersion": 2
    },
    {
      "id": "prep",
      "name": "Prepare Plan Prompt",
      "type": "n8n-nodes-base.code",
      "position": [
        260,
        300
      ],
      "parameters": {
        "jsCode": "var body = $json.body || $json;\nvar reqs = body.requirements || {};\nvar reqType = reqs.procurement_type || '\u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d';\nvar extractionFailed = body.requirementsExtractionFailed === true;\nvar hasReqs = reqs.requirements && Array.isArray(reqs.requirements) && reqs.requirements.length > 0;\nif (!hasReqs && Array.isArray(reqs) && reqs.length > 0) hasReqs = true;\nvar reqStr = JSON.stringify(reqs, null, 2);\nif (reqStr.length > 40000) reqStr = reqStr.substring(0, 40000);\nvar specData = body.specData || {};\nvar ciStr = JSON.stringify(body.contractorInfo || {}, null, 2);\nvar docText = (body.documentationText || '').substring(0, 40000);\nvar targetPages = parseInt(body.targetPages) || 250;\n\n// Store FULL spec data in workflow static data for the Code Tool\nvar sd = $getWorkflowStaticData('global');\nsd._specData = specData;\nsd._requirements = reqs;\n\n// Build spec SUMMARY for the prompt (instead of full dump)\nvar specSummary = '';\nvar specKeys = Object.keys(specData);\nif (specKeys.length > 0) {\n  specSummary += '\u0421\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0442\u0430 \u0441\u044a\u0434\u044a\u0440\u0436\u0430 ' + specKeys.length + ' \u043e\u0441\u043d\u043e\u0432\u043d\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0430:\\n';\n  for (var k = 0; k < specKeys.length; k++) {\n    var key = specKeys[k];\n    var val = specData[key];\n    if (Array.isArray(val)) {\n      specSummary += '- ' + key + ': \u043c\u0430\u0441\u0438\u0432 \u0441 ' + val.length + ' \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0430';\n      if (val.length > 0 && typeof val[0] === 'object') {\n        specSummary += ' (\u043f\u043e\u043b\u0435\u0442\u0430: ' + Object.keys(val[0]).slice(0, 8).join(', ') + ')';\n      }\n      specSummary += '\\n';\n    } else if (typeof val === 'object' && val !== null) {\n      specSummary += '- ' + key + ': \u043e\u0431\u0435\u043a\u0442 \u0441 \u043f\u043e\u043b\u0435\u0442\u0430: ' + Object.keys(val).slice(0, 10).join(', ') + '\\n';\n    } else {\n      specSummary += '- ' + key + ': ' + String(val).substring(0, 200) + '\\n';\n    }\n  }\n  // Add first 3 items as examples for the most populated array\n  var biggestArr = '';\n  var biggestLen = 0;\n  for (var k = 0; k < specKeys.length; k++) {\n    if (Array.isArray(specData[specKeys[k]]) && specData[specKeys[k]].length > biggestLen) {\n      biggestLen = specData[specKeys[k]].length;\n      biggestArr = specKeys[k];\n    }\n  }\n  if (biggestArr && biggestLen > 0) {\n    specSummary += '\\n\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u0438 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0438 \u043e\u0442 \"' + biggestArr + '\":\\n';\n    var examples = specData[biggestArr].slice(0, 3);\n    for (var e = 0; e < examples.length; e++) {\n      specSummary += JSON.stringify(examples[e]).substring(0, 400) + '\\n';\n    }\n    if (biggestLen > 3) specSummary += '... \u0438 \u043e\u0449\u0435 ' + (biggestLen - 3) + ' \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0430\\n';\n  }\n} else {\n  specSummary = '\u0421\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0442\u0430 \u0435 \u043f\u0440\u0430\u0437\u043d\u0430 \u0438\u043b\u0438 \u043d\u0435 \u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0435\u043d\u0430.';\n}\n\nvar p = '';\n\np += '# \u0417\u0410\u0414\u0410\u0427\u0410\\n';\np += '\u0421\u044a\u0437\u0434\u0430\u0439 \u0414\u0415\u0422\u0410\u0419\u041b\u0415\u041d \u041f\u041b\u0410\u041d \u0437\u0430 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043a\u0430\u0442\u043e \u0420\u0410\u0417\u041b\u041e\u0416\u0418\u0428 \u0438\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0438\u044f\u0442\u0430 \u0418\u0417\u0420\u0415\u0427\u0415\u041d\u0418\u0415 \u041f\u041e \u0418\u0417\u0420\u0415\u0427\u0415\u041d\u0418\u0415.\\n\\n';\np += '\u0422\u0418\u041f \u041f\u041e\u0420\u042a\u0427\u041a\u0410: ' + reqType + '\\n\\n';\n\nif (extractionFailed || !hasReqs) {\n  p += '## \u0412\u0410\u0416\u041d\u041e: \u0410\u0412\u0422\u041e\u041c\u0410\u0422\u0418\u0427\u041d\u041e\u0422\u041e \u0418\u0417\u0412\u041b\u0418\u0427\u0410\u041d\u0415 \u041d\u0410 \u0418\u0417\u0418\u0421\u041a\u0412\u0410\u041d\u0418\u042f \u041d\u0415 \u0423\u0421\u041f\u042f\\n';\n  p += '\u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u044f\u043c\u0435 \u0442\u0438 \u0421\u0423\u0420\u041e\u0412\u0418\u042f \u0422\u0415\u041a\u0421\u0422 \u043d\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f\u0442\u0430. \u0417\u0410\u0414\u042a\u041b\u0416\u0418\u0422\u0415\u041b\u041d\u041e:\\n';\n  p += '1. \u041f\u0420\u041e\u0427\u0415\u0422\u0418 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u043d\u043e \u0446\u0435\u043b\u0438\u044f \u0442\u0435\u043a\u0441\u0442.\\n';\n  p += '2. \u041d\u0410\u041c\u0415\u0420\u0418 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435 \u0437\u0430 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435/\u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0437\u0430 \u043e\u0446\u0435\u043d\u043a\u0430/\u043c\u0435\u0442\u043e\u0434\u0438\u043a\u0430 \u0437\u0430 \u043e\u0446\u0435\u043d\u043a\u0430.\\n';\n  p += '3. \u0418\u0417\u0412\u041b\u0415\u0427\u0418 \u0432\u0441\u044f\u043a\u043e \u043d\u043e\u043c\u0435\u0440\u0438\u0440\u0430\u043d\u043e \u0438\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0435 \u0441 \u0414\u041e\u0421\u041b\u041e\u0412\u041d\u0418\u042f \u043c\u0443 \u0442\u0435\u043a\u0441\u0442.\\n';\n  p += '4. \u0418\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0439 \u0418\u0417\u0412\u041b\u0415\u0427\u0415\u041d\u0418\u0422\u0415 \u0438\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0438\u044f \u0437\u0430 \u043e\u0441\u043d\u043e\u0432\u0430 \u043d\u0430 \u043f\u043b\u0430\u043d\u0430.\\n\\n';\n  if (docText.length > 0) {\n    p += '## \u0421\u0423\u0420\u041e\u0412 \u0422\u0415\u041a\u0421\u0422 \u041d\u0410 \u0414\u041e\u041a\u0423\u041c\u0415\u041d\u0422\u0410\u0426\u0418\u042f\u0422\u0410\\n' + docText + '\\n\\n';\n  }\n  if (reqStr !== '{}' && reqStr !== '[]') {\n    p += '## \u0427\u0410\u0421\u0422\u0418\u0427\u041d\u041e \u0418\u0417\u0412\u041b\u0415\u0427\u0415\u041d\u0418 \u0418\u0417\u0418\u0421\u041a\u0412\u0410\u041d\u0418\u042f (\u043c\u043e\u0436\u0435 \u0434\u0430 \u0441\u0430 \u043d\u0435\u043f\u044a\u043b\u043d\u0438)\\n' + reqStr + '\\n\\n';\n  }\n} else {\n  p += '## \u0418\u0417\u0412\u041b\u0415\u0427\u0415\u041d\u0418 \u0418\u0417\u0418\u0421\u041a\u0412\u0410\u041d\u0418\u042f\\n' + reqStr + '\\n\\n';\n}\n\np += '## \u041e\u0411\u0417\u041e\u0420 \u041d\u0410 \u0421\u041f\u0415\u0426\u0418\u0424\u0418\u041a\u0410\u0426\u0418\u042f\u0422\u0410\\n' + specSummary + '\\n\\n';\np += '\u26a0\ufe0f \u0418\u0417\u041f\u041e\u041b\u0417\u0412\u0410\u0419 \u0418\u041d\u0421\u0422\u0420\u0423\u041c\u0415\u041d\u0422\u0410 analyze_spec \u0437\u0430 \u0434\u0430 \u043f\u0440\u043e\u0443\u0447\u0438\u0448 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0442\u0430 \u0432 \u0434\u0435\u0442\u0430\u0439\u043b\u0438!\\n';\np += '\u0417\u0430\u0434\u044a\u043b\u0436\u0438\u0442\u0435\u043b\u043d\u043e \u0438\u0437\u0432\u0438\u043a\u0430\u0439 analyze_spec \u041f\u0420\u0415\u0414\u0418 \u0434\u0430 \u0441\u044a\u0437\u0434\u0430\u0434\u0435\u0448 \u043f\u043b\u0430\u043d\u0430.\\n\\n';\n\np += '## \u0418\u041d\u0424\u041e\u0420\u041c\u0410\u0426\u0418\u042f \u0417\u0410 \u0418\u0417\u041f\u042a\u041b\u041d\u0418\u0422\u0415\u041b\u042f\\n' + ciStr + '\\n\\n';\n\np += '## \u041c\u0415\u0422\u041e\u0414 \u041d\u0410 \u0420\u0410\u0411\u041e\u0422\u0410\\n\\n';\n\np += '### \u0421\u0422\u042a\u041f\u041a\u0410 0: \u041f\u0420\u041e\u0423\u0427\u0418 \u0421\u041f\u0415\u0426\u0418\u0424\u0418\u041a\u0410\u0426\u0418\u042f\u0422\u0410 (\u0437\u0430\u0434\u044a\u043b\u0436\u0438\u0442\u0435\u043b\u043d\u0430)\\n';\np += '\u0418\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 analyze_spec \u0437\u0430 \u0434\u0430:\\n';\np += '1. \u0418\u0437\u0432\u0438\u043a\u0430\u0439 {\"action\": \"structure\"} \u2014 \u0432\u0438\u0436 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u0442\u0430 \u043d\u0430 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0442\u0430\\n';\np += '2. \u0418\u0437\u0432\u0438\u043a\u0430\u0439 {\"action\": \"get\", \"param\": \"field_name\"} \u0437\u0430 \u0432\u0441\u044f\u043a\u043e \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u043e \u043f\u043e\u043b\u0435\\n';\np += '3. \u0418\u0437\u0432\u0438\u043a\u0430\u0439 {\"action\": \"search\", \"param\": \"\u043a\u043b\u044e\u0447\u043e\u0432\u0430 \u0434\u0443\u043c\u0430\"} \u0437\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0438 \u0434\u0430\u043d\u043d\u0438\\n';\np += '\u0426\u0435\u043b\u0442\u0430 \u0435 \u0434\u0430 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u0448 \u041f\u042a\u041b\u041d\u0410\u0422\u0410 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u0440\u0435\u0434\u0438 \u0434\u0430 \u043f\u0440\u0430\u0432\u0438\u0448 \u043f\u043b\u0430\u043d.\\n\\n';\n\np += '### \u0421\u0422\u042a\u041f\u041a\u0410 1: \u0420\u0410\u0417\u041b\u0410\u0413\u0410\u041d\u0415 \u041d\u0410 \u0418\u0417\u0418\u0421\u041a\u0412\u0410\u041d\u0418\u042f (\u0437\u0430\u0434\u044a\u043b\u0436\u0438\u0442\u0435\u043b\u043d\u0430)\\n';\np += '\u041f\u0440\u0435\u0434\u0438 \u0434\u0430 \u043f\u0440\u0430\u0432\u0438\u0448 \u043f\u043b\u0430\u043d, \u0420\u0410\u0417\u041b\u041e\u0416\u0418 \u0432\u0441\u044f\u043a\u043e \u0438\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0435 \u0418\u0417\u0420\u0415\u0427\u0415\u041d\u0418\u0415 \u041f\u041e \u0418\u0417\u0420\u0415\u0427\u0415\u041d\u0418\u0415:\\n';\np += '1. \u041f\u0440\u043e\u0447\u0435\u0442\u0438 full_text \u043d\u0430 \u0412\u0421\u042f\u041a\u041e \u0438\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0435.\\n';\np += '2. \u0412\u0441\u044f\u043a\u043e \u043e\u0442\u0434\u0435\u043b\u043d\u043e \u0438\u0437\u0440\u0435\u0447\u0435\u043d\u0438\u0435/\u0444\u0440\u0430\u0437\u0430 \u043e\u043f\u0438\u0441\u0432\u0430 \u041e\u0422\u0414\u0415\u041b\u0415\u041d \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435\u043d \u0435\u043b\u0435\u043c\u0435\u043d\u0442 \u2014 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0430\u0439 \u0433\u043e.\\n';\np += '3. \u041f\u0440\u0438\u043c\u0435\u0440: \"\u041f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430 \u0438\u0437\u043f\u044a\u043b\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u043d\u0438\u0442\u0435 \u0435\u0442\u0430\u043f\u0438. \u0421\u043b\u0435\u0434\u0432\u0430 \u0434\u0430 \u0431\u044a\u0434\u0430\u0442 \u043e\u0431\u0445\u0432\u0430\u043d\u0430\u0442\u0438 \u0432\u0441\u0438\u0447\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u043d\u0438 \u0438 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u043d\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0438\" \u2192 \u0422\u0420\u0418 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0430:\\n';\np += '   \u0430) \"\u0435\u0442\u0430\u043f\u0438 \u043d\u0430 \u0438\u0437\u043f\u044a\u043b\u043d\u0435\u043d\u0438\u0435\" \u2192 \u0441\u0435\u043a\u0446\u0438\u044f \u0441 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f \u0437\u0430 \u0412\u0421\u0415\u041a\u0418 \u043e\u0442\u0434\u0435\u043b\u0435\u043d \u0435\u0442\u0430\u043f \u043e\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0442\u0430\\n';\np += '   \u0431) \"\u0440\u0430\u0431\u043e\u0442\u043d\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0438\" \u2192 \u0441\u0435\u043a\u0446\u0438\u044f \u0441 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f \u0437\u0430 \u0412\u0421\u0415\u041a\u0418 \u0440\u0430\u0431\u043e\u0442\u0435\u043d \u043f\u0440\u043e\u0446\u0435\u0441\\n';\np += '   \u0432) \"\u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u043d\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0438\" \u2192 \u0441\u0435\u043a\u0446\u0438\u044f \u0441 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f \u0437\u0430 \u0412\u0421\u0415\u041a\u0418 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u043d \u043f\u0440\u043e\u0446\u0435\u0441\\n';\np += '4. \u041a\u043e\u0433\u0430\u0442\u043e \u0438\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0435 \u043a\u0430\u0437\u0432\u0430 \"\u043c\u0438\u043d\u0438\u043c\u0443\u043c N \u043c\u0435\u0440\u043a\u0438/\u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0430\" \u2192 \u0441\u044a\u0437\u0434\u0430\u0439 \u0422\u041e\u0427\u041d\u041e N (\u0438\u043b\u0438 \u043f\u043e\u0432\u0435\u0447\u0435) \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438.\\n';\np += '5. sub_requirements \u0417\u0410\u0414\u042a\u041b\u0416\u0418\u0422\u0415\u041b\u041d\u041e \u0441\u0442\u0430\u0432\u0430\u0442 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438.\\n';\np += '6. \u0424\u0440\u0430\u0437\u0438 \u043a\u0430\u0442\u043e \"\u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u043d\u043e\", \"\u0432 \u0442\u043e\u0432\u0430 \u0447\u0438\u0441\u043b\u043e\", \"\u043a\u0430\u0442\u043e \u043e\u0431\u0445\u0432\u0430\u0449\u0430\" \u2192 \u0412\u0421\u042f\u041a\u041e \u0438\u0437\u0431\u0440\u043e\u0435\u043d\u043e \u043d\u0435\u0449\u043e = \u043e\u0442\u0434\u0435\u043b\u0435\u043d \u0435\u043b\u0435\u043c\u0435\u043d\u0442.\\n\\n';\n\np += '### \u0421\u0422\u042a\u041f\u041a\u0410 2: \u0418\u0417\u0412\u041b\u0418\u0427\u0410\u041d\u0415 \u041d\u0410 \u041f\u0420\u0410\u0412\u0418\u041b\u0410 \u0417\u0410 \u041f\u0418\u0421\u0410\u041d\u0415\\n';\np += '\u0418\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0438\u044f\u0442\u0430 \u0441\u044a\u0434\u044a\u0440\u0436\u0430\u0442 \u0414\u0412\u0410 \u0442\u0438\u043f\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f:\\n';\np += '\u0410) \u0421\u042a\u0414\u042a\u0420\u0416\u0410\u0422\u0415\u041b\u041d\u0418 \u2014 \u043a\u0430\u043a\u0432\u043e \u0442\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u043f\u0440\u0438\u0441\u044a\u0441\u0442\u0432\u0430 \u2192 \u0441\u0442\u0430\u0432\u0430\u0442 \u0441\u0435\u043a\u0446\u0438\u0438 \u0438 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438 \u043d\u0430 \u043f\u043b\u0430\u043d\u0430\\n';\np += '\u0411) \u041a\u0410\u0427\u0415\u0421\u0422\u0412\u0415\u041d\u0418 \u2014 \u043a\u0430\u043a \u0442\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u2192 \u0441\u0442\u0430\u0432\u0430\u0442 writing_rules\\n';\np += '\u041f\u0440\u0438\u043c\u0435\u0440\u0438 \u0437\u0430 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u0438:\\n';\np += '- \"\u0438\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0442\u043e \u0434\u0430 \u043d\u0435 \u0435 \u0444\u043e\u0440\u043c\u0430\u043b\u043d\u043e\" \u2192 writing_rule\\n';\np += '- \"\u0434\u0430 \u043e\u0442\u0447\u0438\u0442\u0430 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u043c\u0435\u0442\" \u2192 writing_rule\\n';\np += '- \"\u043f\u043e \u0441\u0432\u043e\u044f\u0442\u0430 \u0441\u044a\u0449\u043d\u043e\u0441\u0442 \u0434\u0430 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0441\u0435 \u0441\u044a\u043e\u0442\u043d\u0435\u0441\u0435 \u043a\u044a\u043c \u0441\u044a\u043e\u0442\u0432\u0435\u0442\u043d\u0438\u044f \u0435\u043b\u0435\u043c\u0435\u043d\u0442\" \u2192 writing_rule\\n';\np += '- \u0410\u043a\u043e \u0434\u0435\u0444\u0438\u043d\u0438\u0440\u0430\u0442 \u043a\u0430\u043a\u0432\u043e \u0435 \"\u0444\u043e\u0440\u043c\u0430\u043b\u043d\u043e\" \u2192 \u0432\u043a\u043b\u044e\u0447\u0438 \u0434\u0435\u0444\u0438\u043d\u0438\u0446\u0438\u044f\u0442\u0430 \u0414\u041e\u0421\u041b\u041e\u0412\u041d\u041e \u0432 source_text \u043d\u0430 writing_rule\\n\\n';\n\np += '### \u0421\u0422\u042a\u041f\u041a\u0410 3: \u0421\u042a\u0417\u0414\u0410\u0412\u0410\u041d\u0415 \u041d\u0410 \u041f\u041b\u0410\u041d\\n\\n';\n\np += '#### \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\\n';\np += '- \u0421\u0435\u043a\u0446\u0438\u0438 = requirement IDs (1.1, 1.2, ...) \u0441 \u0422\u041e\u0427\u041d\u0418\u0422\u0415 \u0437\u0430\u0433\u043b\u0430\u0432\u0438\u044f \u043e\u0442 \u0438\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0438\u044f\u0442\u0430\\n';\np += '- \u041d\u0415 \u0434\u043e\u0431\u0430\u0432\u044f\u0439 \u0441\u0435\u043a\u0446\u0438\u0438 \u043d\u0435\u043f\u043e\u0438\u0441\u043a\u0430\u043d\u0438 \u043e\u0442 \u0432\u044a\u0437\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044f\\n';\np += '- \u041d\u0415 \u043f\u0440\u0435\u0438\u043c\u0435\u043d\u0443\u0432\u0430\u0439 \u0441\u0435\u043a\u0446\u0438\u0438\u0442\u0435\\n';\np += '- \u0412\u0441\u044f\u043a\u0430 \u0413\u041b\u0410\u0412\u041d\u0410 \u0441\u0435\u043a\u0446\u0438\u044f \u2192 \u041c\u0418\u041d\u0418\u041c\u0423\u041c 3 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438\\n';\np += '- \u0412\u0441\u044f\u043a\u0430 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f \u2192 \u041c\u0418\u041d\u0418\u041c\u0423\u041c 3 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0432 content_guidance\\n';\np += '- \u041f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f \u043c\u043e\u0436\u0435 \u0434\u0430 \u0438\u043c\u0430 \u0441\u0432\u043e\u0438 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438 (\u0434\u043e 4 \u043d\u0438\u0432\u0430 \u0434\u044a\u043b\u0431\u043e\u0447\u0438\u043d\u0430)\\n';\nvar maxSubPages = targetPages > 100 ? 10 : (targetPages > 50 ? 8 : 5);\np += '- \u041c\u0430\u043a\u0441\u0438\u043c\u0443\u043c ' + maxSubPages + ' \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0438 \u043d\u0430 \u043d\u0430\u0439-\u0434\u043e\u043b\u043d\u0430 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f\\n';\np += '- \u0418\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0438\u044f \u043e\u0442 \u043e\u0431\u0449 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440 (\u0441\u0440\u043e\u043a, \u0433\u0430\u0440\u0430\u043d\u0446\u0438\u0438) \u041d\u0415 \u0441\u0442\u0430\u0432\u0430\u0442 \u043e\u0442\u0434\u0435\u043b\u043d\u0438 \u0441\u0435\u043a\u0446\u0438\u0438 \u2014 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0430\u0442 \u0441\u0435 \u0432 \u0441\u044a\u043e\u0442\u0432\u0435\u0442\u043d\u0438\u0442\u0435\\n';\np += '- \u041b\u0438\u043d\u0435\u0435\u043d \u0433\u0440\u0430\u0444\u0438\u043a \u0417\u0410\u0414\u042a\u041b\u0416\u0418\u0422\u0415\u041b\u041d\u041e \u0435 \u041e\u0422\u0414\u0415\u041b\u041d\u0410 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f \u0441 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u0430 \u0444\u043e\u0440\u043c\u0430\\n\\n';\n\np += '#### \u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u0437\u0430 \u043c\u0435\u0440\u043a\u0438\\n';\np += '\u041a\u043e\u0433\u0430\u0442\u043e \u0438\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0435 \u0438\u0437\u0438\u0441\u043a\u0432\u0430 \u041c\u042f\u0420\u041a\u0410:\\n';\np += '- \u0412\u0441\u044f\u043a\u0430 \u043c\u044f\u0440\u043a\u0430 = \u041e\u0422\u0414\u0415\u041b\u041d\u0410 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f\\n';\np += '- content_guidance \u0437\u0430 \u043c\u044f\u0440\u043a\u0430 \u0417\u0410\u0414\u042a\u041b\u0416\u0418\u0422\u0415\u041b\u041d\u041e \u0441\u044a\u0434\u044a\u0440\u0436\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0437\u0430 7 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0430:\\n';\np += '  1. \u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u043c\u044f\u0440\u043a\u0430\u0442\u0430\\n';\np += '  2. \u0421\u044a\u0449\u043d\u043e\u0441\u0442 \u2014 \u043a\u0430\u043a\u0432\u043e \u043f\u043e\u0441\u0442\u0438\u0433\u0430\\n';\np += '  3. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0438 \u0434\u0435\u0439\u043d\u043e\u0441\u0442\u0438 \u0437\u0430 \u0438\u0437\u043f\u044a\u043b\u043d\u0435\u043d\u0438\u0435\\n';\np += '  4. \u0412\u0440\u0435\u043c\u0435\u0432\u0438 \u043f\u043b\u0430\u043d \u0437\u0430 \u043f\u0440\u0438\u043b\u0430\u0433\u0430\u043d\u0435\\n';\np += '  5. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u0435\u043d \u0435\u043a\u0441\u043f\u0435\u0440\u0442 + \u0437\u0430\u0434\u044a\u043b\u0436\u0435\u043d\u0438\u044f\\n';\np += '  6. \u041a\u043e\u043d\u0442\u0440\u043e\u043b \u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 (\u0447\u0435\u0441\u0442\u043e\u0442\u0430, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u0440\u0438 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f, \u043e\u0442\u0433\u043e\u0432\u043e\u0440\u043d\u0438 \u043b\u0438\u0446\u0430)\\n';\np += '  7. \u041e\u0447\u0430\u043a\u0432\u0430\u043d \u0435\u0444\u0435\u043a\u0442 \u043e\u0442 \u043c\u044f\u0440\u043a\u0430\u0442\u0430\\n';\np += '- \u0417\u0410\u0411\u0420\u0410\u041d\u0415\u041d\u041e \u0435 \u043e\u0431\u0435\u0434\u0438\u043d\u044f\u0432\u0430\u043d\u0435 \u043d\u0430 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0438 \u043e\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u0438 \u043c\u0435\u0440\u043a\u0438!\\n\\n';\n\np += '#### \u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u0437\u0430 content_guidance\\n';\np += 'content_guidance \u041d\u0415 \u0422\u0420\u042f\u0411\u0412\u0410 \u0434\u0430 \u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e! \u0417\u0430 \u0432\u0441\u044f\u043a\u0430 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f:\\n';\np += '- \u0412\u043a\u043b\u044e\u0447\u0438 \u041a\u041e\u041d\u041a\u0420\u0415\u0422\u041d\u0418 \u0434\u0430\u043d\u043d\u0438 \u043e\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0442\u0430 (\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430, \u0430\u0440\u0442\u0438\u043a\u0443\u043b\u0438, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438, \u043b\u043e\u043a\u0430\u0446\u0438\u0438)\\n';\np += '- \u0414\u0430\u0439 \u041a\u041e\u041d\u041a\u0420\u0415\u0422\u041d\u0410 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f: \"\u041e\u043f\u0438\u0448\u0438 \u0435\u0442\u0430\u043f\u0430 \u043d\u0430 \u0434\u0435\u043c\u043e\u043d\u0442\u0430\u0436 \u043d\u0430 350 \u043c2 \u0441\u0442\u0430\u0440\u0438 \u043f\u043e\u0434\u043e\u0432\u0438 \u043d\u0430\u0441\u0442\u0438\u043b\u043a\u0438 \u0432 \u0441\u0433\u0440\u0430\u0434\u0430 A, \u0431\u043b. 3\"\\n';\np += '- \u041d\u0415 \u043f\u0438\u0448\u0438: \"\u041e\u043f\u0438\u0448\u0438 \u0435\u0442\u0430\u043f\u0430 \u043d\u0430 \u0434\u0435\u043c\u043e\u043d\u0442\u0430\u0436\" \u0431\u0435\u0437 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u0438\u043a\u0430\\n';\np += '- \u041f\u043e\u0441\u043e\u0447\u0438 \u043a\u043e\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0438 \u0434\u0430 \u0441\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0442 \u0441 \u041a\u041e\u041d\u041a\u0420\u0415\u0422\u041d\u0418 \u043a\u043e\u043b\u043e\u043d\u0438 \u0438 \u0434\u0430\u043d\u043d\u0438\\n';\np += '- \u0412\u0441\u044f\u043a\u0430 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f \u0449\u0435 \u0431\u044a\u0434\u0435 \u043f\u0438\u0441\u0430\u043d\u0430 \u043e\u0442 \u041e\u0422\u0414\u0415\u041b\u0415\u041d AI \u0430\u0433\u0435\u043d\u0442 \u2014 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f\u0442\u0430 \u0422\u0420\u042f\u0411\u0412\u0410 \u0434\u0430 \u0441\u0430 \u0421\u0410\u041c\u041e\u0414\u041e\u0421\u0422\u0410\u0422\u042a\u0427\u041d\u0418\\n';\np += '- \u0410\u043a\u043e \u0432 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0442\u0430 \u0438\u043c\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0438 \u0441\u0442\u043e\u0439\u043d\u043e\u0441\u0442\u0438 \u2014 \u0426\u0418\u0422\u0418\u0420\u0410\u0419 \u0433\u0438 \u0432 content_guidance\\n\\n';\n\np += '## \u0424\u041e\u0420\u041c\u0410\u0422\\n';\np += '\u0412\u044a\u0440\u043d\u0438 \u0421\u0410\u041c\u041e \u0432\u0430\u043b\u0438\u0434\u0435\u043d JSON (\u0411\u0415\u0417 markdown \u0431\u043b\u043e\u043a\u043e\u0432\u0435):\\n';\np += '{\\n';\np += '  \"document_title\": \"\u041f\u0420\u0415\u0414\u041b\u041e\u0416\u0415\u041d\u0418\u0415 \u0417\u0410 \u0418\u0417\u041f\u042a\u041b\u041d\u0415\u041d\u0418\u0415 \u043d\u0430 [\u0442\u043e\u0447\u043d\u043e \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u043f\u043e\u0440\u044a\u0447\u043a\u0430\u0442\u0430]\",\\n';\np += '  \"procurement_type\": \"' + reqType + '\",\\n';\np += '  \"total_estimated_pages\": ' + targetPages + ',\\n';\np += '  \"writing_rules\": [\\n';\np += '    {\\n';\np += '      \"rule_id\": \"WR1\",\\n';\np += '      \"rule\": \"\u041a\u0440\u0430\u0442\u043a\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u043e\u0442\u043e\",\\n';\np += '      \"source_text\": \"\u0414\u041e\u0421\u041b\u041e\u0412\u0415\u041d \u0446\u0438\u0442\u0430\u0442 \u043e\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f\u0442\u0430 \u043d\u0430 \u0432\u044a\u0437\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044f\",\\n';\np += '      \"instruction_for_writer\": \"\u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043a\u0430\u043a\u0432\u043e \u0434\u0430 \u043f\u0440\u0430\u0432\u0438 writer-\u044a\u0442\",\\n';\np += '      \"instruction_for_validator\": \"\u041a\u0430\u043a validator-\u044a\u0442 \u0434\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0432\u0430 \u0441\u043f\u0430\u0437\u0432\u0430\u043d\u0435\u0442\u043e\",\\n';\np += '      \"violation_consequence\": \"\u043e\u0442\u0441\u0442\u0440\u0430\u043d\u044f\u0432\u0430\u043d\u0435 | \u043d\u0430\u043c\u0430\u043b\u0435\u043d\u0438 \u0442\u043e\u0447\u043a\u0438 | \u0437\u0430\u0431\u0435\u043b\u0435\u0436\u043a\u0430\"\\n';\np += '    }\\n';\np += '  ],\\n';\np += '  \"sections\": [\\n';\np += '    {\\n';\np += '      \"id\": \"1.1\",\\n';\np += '      \"title\": \"\u0422\u041e\u0427\u041d\u041e \u0437\u0430\u0433\u043b\u0430\u0432\u0438\u0435\u0442\u043e \u043e\u0442 \u0438\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0435\u0442\u043e\",\\n';\np += '      \"requirement_id\": \"1.1\",\\n';\np += '      \"source_decomposition\": [\\n';\np += '        {\"source_phrase\": \"\u0438\u0437\u0440\u0435\u0447\u0435\u043d\u0438\u0435\u0442\u043e \u043e\u0442 \u043a\u043e\u0435\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043b\u0438\u0437\u0430\", \"structural_type\": \"etap|process|measure|table|timeline\"}\\n';\np += '      ],\\n';\np += '      \"subsections\": [\\n';\np += '        {\\n';\np += '          \"id\": \"1.1.1\",\\n';\np += '          \"title\": \"\u041f\u043e\u0434\u0437\u0430\u0433\u043b\u0430\u0432\u0438\u0435\",\\n';\np += '          \"estimated_pages\": 4,\\n';\np += '          \"content_guidance\": [\\n';\np += '            \"\u041a\u041e\u041d\u041a\u0420\u0415\u0422\u041d\u0410 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f 1 \u0441 \u0434\u0430\u043d\u043d\u0438 \u043e\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0442\u0430\",\\n';\np += '            \"\u041a\u041e\u041d\u041a\u0420\u0415\u0422\u041d\u0410 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f 2...\",\\n';\np += '            \"\u041a\u041e\u041d\u041a\u0420\u0415\u0422\u041d\u0410 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f 3...\"\\n';\np += '          ],\\n';\np += '          \"spec_data_to_use\": [\"key_quantities\", \"technical_parameters\"],\\n';\np += '          \"tables_needed\": [{\"title\": \"\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435\", \"columns\": [\"\u041a\u043e\u043b1\", \"\u041a\u043e\u043b2\"]}],\\n';\np += '          \"subsections\": []\\n';\np += '        }\\n';\np += '      ]\\n';\np += '    }\\n';\np += '  ],\\n';\np += '  \"appendices\": []\\n';\np += '}\\n\\n';\n\np += '## \u26a0\ufe0f \u0426\u0415\u041b\u0415\u0412\u0418 \u041e\u0411\u0415\u041c: ' + targetPages + ' \u0421\u0422\u0420\u0410\u041d\u0418\u0426\u0418 (\u0417\u0410\u0414\u042a\u041b\u0416\u0418\u0422\u0415\u041b\u041d\u041e!)\\n';\np += '\u0426\u0435\u043b\u0435\u0432\u0438\u044f\u0442 \u043e\u0431\u0435\u043c \u043d\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0435 \u0422\u041e\u0427\u041d\u041e ' + targetPages + ' \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0438.\\n';\np += '\u0421\u0423\u041c\u0410\u0422\u0410 \u043d\u0430 estimated_pages \u043d\u0430 \u0412\u0421\u0418\u0427\u041a\u0418 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438 \u0422\u0420\u042f\u0411\u0412\u0410 \u0434\u0430 \u0435 = ' + targetPages + ' (\u00b110%).\\n';\np += '\u0420\u0430\u0437\u043f\u0440\u0435\u0434\u0435\u043b\u0438 estimated_pages \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u043d\u043e: \u043f\u043e-\u043e\u0431\u0435\u043c\u043d\u0438 \u0442\u0435\u043c\u0438 \u2192 \u043f\u043e\u0432\u0435\u0447\u0435 \u0441\u0442\u0440., \u043f\u043e-\u043f\u0440\u043e\u0441\u0442\u0438 \u2192 \u043f\u043e-\u043c\u0430\u043b\u043a\u043e.\\n';\np += '\u041c\u0430\u043a\u0441 ' + maxSubPages + ' \u0441\u0442\u0440. \u043d\u0430 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f. \u0410\u043a\u043e \u0442\u0435\u043c\u0430 \u0438\u0441\u043a\u0430 \u043f\u043e\u0432\u0435\u0447\u0435 \u2192 \u0440\u0430\u0437\u0434\u0435\u043b\u0438 \u043d\u0430 2+ \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438.\\n';\np += '\u041f\u0420\u0415\u0414\u0418 \u0414\u0410 \u0424\u0418\u041d\u0410\u041b\u0418\u0417\u0418\u0420\u0410\u0428: \u0441\u044a\u0431\u0435\u0440\u0438 estimated_pages \u043d\u0430 \u0432\u0441\u0438\u0447\u043a\u0438 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438. \u0410\u043a\u043e \u0441\u0443\u043c\u0430\u0442\u0430 \u0435 < ' + Math.round(targetPages * 0.9) + ' \u2192 \u0434\u043e\u0431\u0430\u0432\u0438 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438 pages.\\n\\n';\n\np += '## \u041a\u0420\u0418\u0422\u0418\u0427\u041d\u0418 \u041f\u0420\u0410\u0412\u0418\u041b\u0410\\n';\np += '1. \u0421\u0435\u043a\u0446\u0438\u0438\u0442\u0435 = requirement IDs. \u041d\u0415 \u0438\u0437\u043c\u0438\u0441\u043b\u044f\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430!\\n';\np += '2. \u041c\u0418\u041d\u0418\u041c\u0423\u041c 3 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438 \u043d\u0430 \u0441\u0435\u043a\u0446\u0438\u044f, \u041c\u0418\u041d\u0418\u041c\u0423\u041c 3 content_guidance \u043d\u0430 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f.\\n';\np += '3. \u0412\u0441\u044f\u043a\u0430 \u043c\u044f\u0440\u043a\u0430 = \u041e\u0422\u0414\u0415\u041b\u041d\u0410 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0437\u0430 7 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\\n';\np += '4. content_guidance \u0432\u043a\u043b\u044e\u0447\u0432\u0430 \u041a\u041e\u041d\u041a\u0420\u0415\u0422\u041d\u0418 \u0414\u0410\u041d\u041d\u0418 \u043e\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0442\u0430!\\n';\np += '5. \u0420\u0430\u0437\u043b\u043e\u0436\u0438 \u0438\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0438\u044f\u0442\u0430 \u0418\u0417\u0420\u0415\u0427\u0415\u041d\u0418\u0415 \u041f\u041e \u0418\u0417\u0420\u0415\u0427\u0415\u041d\u0418\u0415 \u2014 \u0432\u0441\u044f\u043a\u043e \u0438\u0437\u0440\u0435\u0447\u0435\u043d\u0438\u0435 = \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435\u043d \u0435\u043b\u0435\u043c\u0435\u043d\u0442.\\n';\np += '6. writing_rules = \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u0438\u0442\u0435 \u0438\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0438\u044f \u043e\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f\u0442\u0430.\\n';\np += '7. \u0421\u0410\u041c\u041e JSON, \u0431\u0435\u0437 \u0434\u0440\u0443\u0433 \u0442\u0435\u043a\u0441\u0442.\\n';\np += '\u26a0\ufe0f \u041a\u0420\u0418\u0422\u0418\u0427\u041d\u041e: \u0412\u044a\u0442\u0440\u0435 \u0432 JSON \u0441\u0442\u0440\u0438\u043d\u0433\u043e\u0432\u0435 \u041d\u0418\u041a\u041e\u0413\u0410 \u043d\u0435 \u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0439 \u0434\u0432\u043e\u0439\u043d\u0438 \u043a\u0430\u0432\u0438\u0447\u043a\u0438! \u0417\u0430 \u0438\u043c\u0435\u043d\u0430 \u043d\u0430 \u043e\u0431\u0435\u043a\u0442\u0438 \u043f\u0438\u0448\u0438 \u0427\u0415\u041f\u0415\u041b\u0410\u0420\u0415 \u0438\u043b\u0438 \\'\u0427\u0415\u041f\u0415\u041b\u0410\u0420\u0415\\', \u041d\u0415 \"\u0427\u0415\u041f\u0415\u041b\u0410\u0420\u0415\".\\n';\np += '8. \u0412 content_guidance: \u0417\u0410\u0411\u0420\u0410\u041d\u0415\u041d\u041e \u0435 \u0434\u0430 \u0441\u0435 \u0437\u0430\u0434\u0430\u0432\u0430\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0438 \u0438\u043c\u0435\u043d\u0430 \u043d\u0430 \u0445\u043e\u0440\u0430. \u0412\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0432\u0430 \u043f\u0438\u0448\u0435\u0442\u0435: [\u26a0\ufe0f \u041f\u041e\u041f\u042a\u041b\u041d\u0415\u0422\u0415: \u0438\u043c\u0435 \u043d\u0430 \u0440\u044a\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b \u043e\u0431\u0435\u043a\u0442], [\u26a0\ufe0f \u041f\u041e\u041f\u042a\u041b\u041d\u0415\u0422\u0415: \u0438\u043c\u0435 \u043d\u0430 \u0435\u043a\u0441\u043f\u0435\u0440\u0442 \u043f\u043e \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e] \u0438 \u0442.\u043d.';\n\nreturn [{ json: { prompt: p } }];"
      },
      "typeVersion": 2
    },
    {
      "id": "llm",
      "name": "Plan Document",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        520,
        300
      ],
      "parameters": {
        "text": "={{ $json.prompt }}",
        "promptType": "define",
        "options": {
          "systemMessage": "# \u0420\u041e\u041b\u042f \u0418 \u0426\u0415\u041b\n\u0422\u0438 \u0441\u0438 \u0435\u043a\u0441\u043f\u0435\u0440\u0442 \u043f\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0437\u0430 \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u0438 \u043f\u043e\u0440\u044a\u0447\u043a\u0438 \u0432 \u0420\u0435\u043f\u0443\u0431\u043b\u0438\u043a\u0430 \u0411\u044a\u043b\u0433\u0430\u0440\u0438\u044f. \u0421\u044a\u0437\u0434\u0430\u0432\u0430\u0448 \u0414\u0415\u0422\u0410\u0419\u041b\u041d\u0418 \u043f\u043b\u0430\u043d\u043e\u0432\u0435, \u0440\u0430\u0437\u043b\u0430\u0433\u0430\u0439\u043a\u0438 \u0438\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0438\u044f\u0442\u0430 \u043d\u0430 \u0432\u044a\u0437\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044f \u0418\u0417\u0420\u0415\u0427\u0415\u041d\u0418\u0415 \u041f\u041e \u0418\u0417\u0420\u0415\u0427\u0415\u041d\u0418\u0415.\n\n# \u0418\u041d\u0421\u0422\u0420\u0423\u041c\u0415\u041d\u0422\u0418\n\u0418\u043c\u0430\u0448 \u0434\u043e\u0441\u0442\u044a\u043f \u0434\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 analyze_spec \u0437\u0430 \u043f\u0440\u043e\u0443\u0447\u0432\u0430\u043d\u0435 \u043d\u0430 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0442\u0430. \u0417\u0410\u0414\u042a\u041b\u0416\u0418\u0422\u0415\u041b\u041d\u041e \u0433\u043e \u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0439 \u041f\u0420\u0415\u0414\u0418 \u0434\u0430 \u0441\u044a\u0437\u0434\u0430\u0434\u0435\u0448 \u043f\u043b\u0430\u043d\u0430:\n1. \u041f\u044a\u0440\u0432\u043e \u0438\u0437\u0432\u0438\u043a\u0430\u0439 {\"action\": \"structure\"} \u2014 \u0432\u0438\u0436 \u043a\u0430\u043a\u0432\u0438 \u0434\u0430\u043d\u043d\u0438 \u0438\u043c\u0430 \u0432 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0442\u0430\n2. \u041f\u043e\u0441\u043b\u0435 \u0438\u0437\u0432\u0438\u043a\u0430\u0439 {\"action\": \"get\", \"param\": \"\u0438\u043c\u0435_\u043d\u0430_\u043f\u043e\u043b\u0435\"} \u0437\u0430 \u0432\u0441\u044f\u043a\u043e \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043b\u0435\n3. \u0418\u0437\u0432\u0438\u043a\u0430\u0439 {\"action\": \"search\", \"param\": \"\u043a\u043b\u044e\u0447\u043e\u0432\u0430 \u0434\u0443\u043c\u0430\"} \u0437\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0438 \u0434\u0430\u043d\u043d\u0438 (\u043d\u0430\u043f\u0440. \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430, \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438, \u0441\u0433\u0440\u0430\u0434\u0438)\n\u0426\u0435\u043b\u0442\u0430: \u0421\u042a\u0411\u0415\u0420\u0418 \u041c\u0410\u041a\u0421\u0418\u041c\u0410\u041b\u041d\u041e \u041a\u041e\u041d\u041a\u0420\u0415\u0422\u041d\u0418 \u0414\u0410\u041d\u041d\u0418 \u043e\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0442\u0430 \u0437\u0430 content_guidance \u043d\u0430 \u0432\u0441\u044f\u043a\u0430 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f.\n\n# \u041c\u0415\u0422\u041e\u0414 \u041d\u0410 \u0420\u0410\u0411\u041e\u0422\u0410 \u2014 \u0420\u0410\u0417\u041b\u0410\u0413\u0410\u041d\u0415 \u041d\u0410 \u0418\u0417\u0418\u0421\u041a\u0412\u0410\u041d\u0418\u042f\n\u041f\u0440\u0435\u0434\u0438 \u0434\u0430 \u0441\u044a\u0437\u0434\u0430\u0434\u0435\u0448 \u043f\u043b\u0430\u043d, \u0417\u0410\u0414\u042a\u041b\u0416\u0418\u0422\u0415\u041b\u041d\u041e \u0440\u0430\u0437\u043b\u043e\u0436\u0438 \u0412\u0421\u042f\u041a\u041e \u0438\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0435:\n1. \u041f\u0440\u043e\u0447\u0435\u0442\u0438 full_text \u043d\u0430 \u0438\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0435\u0442\u043e \u0418\u0417\u0420\u0415\u0427\u0415\u041d\u0418\u0415 \u041f\u041e \u0418\u0417\u0420\u0415\u0427\u0415\u041d\u0418\u0415\n2. \u0412\u0441\u044f\u043a\u043e \u0438\u0437\u0440\u0435\u0447\u0435\u043d\u0438\u0435/\u0444\u0440\u0430\u0437\u0430 \u043e\u043f\u0438\u0441\u0432\u0430 \u041e\u0422\u0414\u0415\u041b\u0415\u041d \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435\u043d \u0435\u043b\u0435\u043c\u0435\u043d\u0442 \u2192 \u0441\u0442\u0430\u0432\u0430 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f\n3. \"\u043c\u0438\u043d\u0438\u043c\u0443\u043c N \u043c\u0435\u0440\u043a\u0438\" \u2192 \u0422\u041e\u0427\u041d\u041e N \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438 \u0437\u0430 \u043c\u0435\u0440\u043a\u0438\n4. \"\u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u043d\u043e A, B, C\" \u2192 \u0422\u0420\u0418 \u043e\u0442\u0434\u0435\u043b\u043d\u0438 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438\n5. Sub-requirements \u2192 \u0417\u0410\u0414\u042a\u041b\u0416\u0418\u0422\u0415\u041b\u041d\u0418 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438\n6. \u041a\u0440\u044a\u0441\u0442\u043e\u0441\u0430\u043d\u0438 \u043f\u0440\u0435\u043f\u0440\u0430\u0442\u043a\u0438 (\"\u0441\u044a\u0433\u043b\u0430\u0441\u043d\u043e \u0422\u0421\") \u2192 \u0437\u0430\u043f\u0438\u0448\u0438 \u0433\u0438 \u0437\u0430 writer-\u0430\n\n# \u0421\u0422\u0420\u0423\u041a\u0422\u0423\u0420\u041d\u0418 \u0418\u0417\u0418\u0421\u041a\u0412\u0410\u041d\u0418\u042f\n- \u0421\u0435\u043a\u0446\u0438\u0438 = requirement IDs \u0441 \u0422\u041e\u0427\u041d\u0418\u0422\u0415 \u0437\u0430\u0433\u043b\u0430\u0432\u0438\u044f \u043e\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f\u0442\u0430\n- \u041c\u0418\u041d\u0418\u041c\u0423\u041c 3 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438 \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u0430 \u0441\u0435\u043a\u0446\u0438\u044f\n- \u041c\u0418\u041d\u0418\u041c\u0423\u041c 3 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0430 content_guidance \u043d\u0430 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f\n- \u041f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438 \u043c\u043e\u0433\u0430\u0442 \u0434\u0430 \u0438\u043c\u0430\u0442 \u0441\u0432\u043e\u0438 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438 (\u0434\u043e 4 \u043d\u0438\u0432\u0430 \u0434\u044a\u043b\u0431\u043e\u0447\u0438\u043d\u0430)\n- \u041c\u0430\u043a\u0441\u0438\u043c\u0443\u043c N \u0441\u0442\u0440. \u043d\u0430 \u043d\u0430\u0439-\u0434\u043e\u043b\u043d\u0430 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f (N \u0437\u0430\u0432\u0438\u0441\u0438 \u043e\u0442 \u0446\u0435\u043b\u0435\u0432\u0438\u044f \u043e\u0431\u0435\u043c)\n- \u041b\u0438\u043d\u0435\u0435\u043d \u0433\u0440\u0430\u0444\u0438\u043a = \u041e\u0422\u0414\u0415\u041b\u041d\u0410 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f \u0441 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u0430 \u0444\u043e\u0440\u043c\u0430\n\n# \u041a\u0410\u0427\u0415\u0421\u0422\u0412\u0415\u041d\u0418 \u041f\u0420\u0410\u0412\u0418\u041b\u0410 (writing_rules)\n\u0418\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0438\u044f\u0442\u0430 \u0441\u044a\u0434\u044a\u0440\u0436\u0430\u0442 \u0414\u0412\u0410 \u0442\u0438\u043f\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f:\n- \u0421\u042a\u0414\u042a\u0420\u0416\u0410\u0422\u0415\u041b\u041d\u0418 (\u043a\u0430\u043a\u0432\u043e \u0442\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u043f\u0440\u0438\u0441\u044a\u0441\u0442\u0432\u0430) \u2192 \u0441\u0442\u0430\u0432\u0430\u0442 \u0441\u0435\u043a\u0446\u0438\u0438/\u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438\n- \u041a\u0410\u0427\u0415\u0421\u0422\u0412\u0415\u041d\u0418 (\u043a\u0430\u043a \u0442\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e) \u2192 \u0441\u0442\u0430\u0432\u0430\u0442 writing_rules\n\u0418\u0437\u0432\u043b\u0435\u0447\u0438 \u0412\u0421\u0418\u0427\u041a\u0418 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u0438 \u0438\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0438\u044f \u0432 writing_rules. \u0412\u043a\u043b\u044e\u0447\u0438:\n- \u0414\u043e\u0441\u043b\u043e\u0432\u0435\u043d \u0446\u0438\u0442\u0430\u0442 \u043e\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f\u0442\u0430\n- \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0437\u0430 writer-\u0430\n- \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0437\u0430 validator-\u0430\n- \u041f\u043e\u0441\u043b\u0435\u0434\u0438\u0446\u0430 \u043f\u0440\u0438 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435\n\n# \u26a0\ufe0f \u041a\u0420\u0418\u0422\u0418\u0427\u041d\u041e \u0417\u0410 JSON \u0424\u041e\u0420\u041c\u0410\u0422\u0410\n\u0412\u044a\u0442\u0440\u0435 \u0432 JSON \u0441\u0442\u0440\u0438\u043d\u0433\u043e\u0432\u0435 \u041d\u0418\u041a\u041e\u0413\u0410 \u041d\u0415 \u0418\u0417\u041f\u041e\u041b\u0417\u0412\u0410\u0419 \u0434\u0432\u043e\u0439\u043d\u0438 \u043a\u0430\u0432\u0438\u0447\u043a\u0438 (\").\n\u0417\u0430 \u0446\u0438\u0442\u0430\u0442\u0438 \u0438 \u0438\u043c\u0435\u043d\u0430 \u043d\u0430 \u043e\u0431\u0435\u043a\u0442\u0438 \u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0439 \u0415\u0414\u0418\u041d\u0418\u0427\u041d\u0418 \u041a\u0410\u0412\u0418\u0427\u041a\u0418 (') \u0438\u043b\u0438 \u0431\u0435\u0437 \u043a\u0430\u0432\u0438\u0447\u043a\u0438.\n\u041d\u0430\u0440\u0443\u0448\u0430\u0432\u0430\u043d\u0435\u0442\u043e \u043d\u0430 \u0442\u043e\u0432\u0430 \u0427\u0423\u041f\u0418 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0442\u0430!\n\n# \u0424\u041e\u0420\u041c\u0410\u0422 \u041d\u0410 \u041c\u0415\u0420\u041a\u0418\n\u0412\u0441\u044f\u043a\u0430 \u043c\u044f\u0440\u043a\u0430 = \u041e\u0422\u0414\u0415\u041b\u041d\u0410 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f \u0441 7 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 content_guidance:\n\u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435, \u0441\u044a\u0449\u043d\u043e\u0441\u0442, \u0434\u0435\u0439\u043d\u043e\u0441\u0442\u0438, \u0432\u0440\u0435\u043c\u0435\u0432\u0438 \u043f\u043b\u0430\u043d, \u0435\u043a\u0441\u043f\u0435\u0440\u0442+\u0437\u0430\u0434\u044a\u043b\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u043d\u0442\u0440\u043e\u043b+\u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433, \u043e\u0447\u0430\u043a\u0432\u0430\u043d \u0435\u0444\u0435\u043a\u0442.\n\u0417\u0410\u0411\u0420\u0410\u041d\u0415\u041d\u041e: \u043e\u0431\u0435\u0434\u0438\u043d\u044f\u0432\u0430\u043d\u0435 \u043d\u0430 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0438 \u043e\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u0438 \u043c\u0435\u0440\u043a\u0438.\n\n# content_guidance \u2014 \u041d\u0415 \u0410\u0411\u0421\u0422\u0420\u0410\u041a\u0422\u041d\u041e!\n\u0412\u0441\u044f\u043a\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u0422\u0420\u042f\u0411\u0412\u0410 \u0434\u0430 \u0435 \u041a\u041e\u041d\u041a\u0420\u0415\u0422\u041d\u041e \u0441 \u0434\u0430\u043d\u043d\u0438 \u043e\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0442\u0430:\n\u0414\u041e\u0411\u0420\u041e: \"\u041e\u043f\u0438\u0448\u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0430\u0442\u0430 \u043d\u0430 15 \u0431\u0440. \u043a\u043b\u0438\u043c\u0430\u0442\u0438\u0446\u0438 \u0437\u0430 \u0441\u0433\u0440\u0430\u0434\u0430 X \u2014 \u043c\u043e\u0434\u0435\u043b\u0438, \u043c\u043e\u043d\u0442\u0430\u0436, \u0438\u0437\u043f\u0438\u0442\u0432\u0430\u043d\u0438\u044f\"\n\u041b\u041e\u0428\u041e: \"\u041e\u043f\u0438\u0448\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0430 \u043d\u0430 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0430\"\n\u0412\u0441\u044f\u043a\u0430 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f \u0449\u0435 \u0441\u0435 \u043f\u0438\u0448\u0435 \u043e\u0442 \u041e\u0422\u0414\u0415\u041b\u0415\u041d AI \u0430\u0433\u0435\u043d\u0442 \u2192 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f\u0442\u0430 \u0422\u0420\u042f\u0411\u0412\u0410 \u0434\u0430 \u0441\u0430 \u0421\u0410\u041c\u041e\u0414\u041e\u0421\u0422\u0410\u0422\u042a\u0427\u041d\u0418.\n\n# \u0421\u0422\u042a\u041f\u041a\u0418\n1. \u0418\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0439 analyze_spec \u0437\u0430 \u0434\u0430 \u043f\u0440\u043e\u0443\u0447\u0438\u0448 \u0426\u042f\u041b\u0410\u0422\u0410 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u2014 \u0432\u0438\u0434\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430\n2. \u0417\u0430 \u0432\u0441\u044f\u043a\u043e \u0438\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0435: \u0440\u0430\u0437\u043b\u043e\u0436\u0438 full_text \u0438\u0437\u0440\u0435\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0438\u0437\u0440\u0435\u0447\u0435\u043d\u0438\u0435 \u2192 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0430\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u0438\u0442\u0435 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0438\n3. \u0420\u0430\u0437\u0434\u0435\u043b\u0438 \u043d\u0430 \u0441\u044a\u0434\u044a\u0440\u0436\u0430\u0442\u0435\u043b\u043d\u0438 (\u2192 \u0441\u0435\u043a\u0446\u0438\u0438) \u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u0438 (\u2192 writing_rules)\n4. \u0417\u0430 \u0432\u0441\u0435\u043a\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435\u043d \u0435\u043b\u0435\u043c\u0435\u043d\u0442 \u2192 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438 (\u043c\u0438\u043d. 3 \u043d\u0430 \u0441\u0435\u043a\u0446\u0438\u044f)\n5. \u0417\u0430 \u0432\u0441\u044f\u043a\u0430 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f \u2192 \u043d\u0430\u043f\u0438\u0448\u0438 \u041a\u041e\u041d\u041a\u0420\u0415\u0422\u041d\u0418 content_guidance \u0441 \u0434\u0430\u043d\u043d\u0438 \u043e\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0442\u0430 (\u043c\u0438\u043d. 3)\n6. \u041c\u0435\u0440\u043a\u0438 \u2192 \u043e\u0442\u0434\u0435\u043b\u043d\u0438 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438 \u0441 \u043f\u044a\u043b\u0435\u043d 7-\u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0435\u043d \u0444\u043e\u0440\u043c\u0430\u0442\n7. \u041f\u0440\u043e\u0432\u0435\u0440\u0438: \u043f\u043e\u043a\u0440\u0438\u0442\u0438 \u043b\u0438 \u0441\u0430 \u0412\u0421\u0418\u0427\u041a\u0418 \u0438\u0437\u0440\u0435\u0447\u0435\u043d\u0438\u044f \u043e\u0442 \u0412\u0421\u042f\u041a\u041e \u0438\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0435?\n8. \u041f\u0440\u043e\u0432\u0435\u0440\u0438: \u0438\u043c\u0430 \u043b\u0438 \u043f\u043e\u043d\u0435 3 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438 \u043d\u0430 \u0441\u0435\u043a\u0446\u0438\u044f? \u041f\u043e\u043d\u0435 3 content_guidance \u043d\u0430 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f?\n\n# \u26a0\ufe0f \u041a\u0420\u0418\u0422\u0418\u0427\u041d\u041e \u0417\u0410 JSON \u0424\u041e\u0420\u041c\u0410\u0422\u0410\n\u0412\u044a\u0442\u0440\u0435 \u0432 JSON \u0441\u0442\u0440\u0438\u043d\u0433\u043e\u0432\u0435 \u041d\u0418\u041a\u041e\u0413\u0410 \u041d\u0415 \u0418\u0417\u041f\u041e\u041b\u0417\u0412\u0410\u0419 \u0434\u0432\u043e\u0439\u043d\u0438 \u043a\u0430\u0432\u0438\u0447\u043a\u0438 (\").\n\u0417\u0430 \u0446\u0438\u0442\u0430\u0442\u0438 \u0438 \u0438\u043c\u0435\u043d\u0430 \u043d\u0430 \u043e\u0431\u0435\u043a\u0442\u0438 \u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0439 \u0415\u0414\u0418\u041d\u0418\u0427\u041d\u0418 \u041a\u0410\u0412\u0418\u0427\u041a\u0418 (') \u0438\u043b\u0438 \u0431\u0435\u0437 \u043a\u0430\u0432\u0438\u0447\u043a\u0438.\n\u041d\u0430\u0440\u0443\u0448\u0430\u0432\u0430\u043d\u0435\u0442\u043e \u043d\u0430 \u0442\u043e\u0432\u0430 \u0427\u0423\u041f\u0418 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0442\u0430!\n\n# \u0424\u041e\u0420\u041c\u0410\u0422\n\u0418\u0437\u0445\u043e\u0434: \u0421\u0410\u041c\u041e \u0432\u0430\u043b\u0438\u0434\u0435\u043d JSON. \u0411\u0435\u0437 markdown \u0431\u043b\u043e\u043a\u043e\u0432\u0435, \u0431\u0435\u0437 \u043e\u0431\u044f\u0441\u043d\u0435\u043d\u0438\u044f. \u0415\u0437\u0438\u043a: \u0431\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438.",
          "maxIterations": 15
        }
      },
      "typeVersion": 1.6
    },
    {
      "id": "model",
      "name": "Claude Sonnet",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "position": [
        440,
        520
      ],
      "parameters": {
        "model": "anthropic/claude-sonnet-4",
        "options": {
          "maxTokens": 24000,
          "temperature": 0.2
        }
      },
      "credentials": {
        "openRouterApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "parse",
      "name": "Parse Plan",
      "type": "n8n-nodes-base.code",
      "position": [
        780,
        300
      ],
      "parameters": {
        "jsCode": "var raw = ($json.output || $json.text || $json.response || '').trim();\nvar result = null;\nvar parseMethod = 'none';\n\nfunction sanitize(s) {\n  return s.replace(/[\\u201C\\u201D\\u201E\\u201F\\u00AB\\u00BB\\u2018\\u2019\\u2032\\u2033]/g, \"'\")\n          .replace(/^\\uFEFF/, '');\n}\n\nfunction tryParse(s) {\n  try { return JSON.parse(s); } catch(e) { return null; }\n}\n\nfunction extractJson(s) {\n  var m = s.match(/```(?:json)?\\s*([\\s\\S]*?)```/);\n  var c = m ? m[1].trim() : s;\n  var start = c.indexOf('{');\n  var end = c.lastIndexOf('}');\n  if (start === -1 || end === -1) return s;\n  return c.substring(start, end + 1);\n}\n\nfunction fixCommon(s) {\n  return s.replace(/,\\s*([\\]\\}])/g, '$1');\n}\n\nfunction nextNonWS(s, pos) {\n  for (var j = pos; j < s.length; j++) {\n    var c = s.charCodeAt(j);\n    if (c !== 32 && c !== 9 && c !== 10 && c !== 13) return s[j];\n  }\n  return '';\n}\n\nfunction fixQuotes(s) {\n  var out = '';\n  var inStr = false;\n  var escaped = false;\n  var len = s.length;\n  for (var i = 0; i < len; i++) {\n    var ch = s[i];\n    if (escaped) { out += ch; escaped = false; continue; }\n    if (ch === '\\\\') { out += ch; escaped = true; continue; }\n    if (ch === '\"') {\n      if (!inStr) {\n        inStr = true;\n        out += ch;\n      } else {\n        var next = nextNonWS(s, i + 1);\n        if (next === ':' || next === ',' || next === '}' || next === ']' || next === '') {\n          inStr = false;\n          out += ch;\n        } else {\n          out += '\\\\\"';\n        }\n      }\n    } else {\n      out += ch;\n    }\n  }\n  return out;\n}\n\nfunction fixNewlines(s) {\n  var out = '';\n  var inStr = false;\n  var escaped = false;\n  var len = s.length;\n  for (var i = 0; i < len; i++) {\n    var ch = s[i];\n    if (escaped) { out += ch; escaped = false; continue; }\n    if (ch === '\\\\') { out += ch; escaped = true; continue; }\n    if (ch === '\"') { inStr = !inStr; out += ch; continue; }\n    if (inStr && ch === '\\n') { out += '\\\\n'; continue; }\n    if (inStr && ch === '\\r') { continue; }\n    if (inStr && ch === '\\t') { out += '\\\\t'; continue; }\n    out += ch;\n  }\n  return out;\n}\n\nfunction repairTruncated(s) {\n  var stack = [];\n  var inStr = false;\n  var escaped = false;\n  for (var i = 0; i < s.length; i++) {\n    var ch = s[i];\n    if (escaped) { escaped = false; continue; }\n    if (ch === '\\\\') { escaped = true; continue; }\n    if (ch === '\"') { inStr = !inStr; continue; }\n    if (inStr) continue;\n    if (ch === '{') stack.push('}');\n    else if (ch === '[') stack.push(']');\n    else if (ch === '}' || ch === ']') { if (stack.length > 0) stack.pop(); }\n  }\n  if (inStr) s += '\"';\n  s = s.replace(/,\\s*$/, '');\n  while (stack.length > 0) s += stack.pop();\n  return s;\n}\n\nraw = sanitize(raw);\n\nresult = tryParse(raw);\nif (result) parseMethod = 'direct';\n\nif (!result) {\n  var clean = fixCommon(extractJson(raw));\n  result = tryParse(clean);\n  if (result) parseMethod = 'extractJson';\n}\n\nif (!result) {\n  var clean = fixQuotes(fixCommon(extractJson(raw)));\n  result = tryParse(clean);\n  if (result) parseMethod = 'fixQuotes';\n}\n\nif (!result) {\n  var clean = fixNewlines(fixQuotes(fixCommon(extractJson(raw))));\n  result = tryParse(clean);\n  if (result) parseMethod = 'fixQuotes+fixNewlines';\n}\n\nif (!result) {\n  var clean = fixQuotes(fixNewlines(fixCommon(extractJson(raw))));\n  result = tryParse(clean);\n  if (result) parseMethod = 'fixNewlines+fixQuotes';\n}\n\nif (!result) {\n  var clean = fixNewlines(fixQuotes(fixCommon(extractJson(raw))));\n  var repaired = repairTruncated(clean);\n  result = tryParse(repaired);\n  if (result) parseMethod = 'repairTruncated';\n}\n\nif (!result) {\n  var clean = fixNewlines(fixQuotes(fixCommon(raw)));\n  result = tryParse(clean);\n  if (!result) {\n    var repaired = repairTruncated(clean);\n    result = tryParse(repaired);\n  }\n  if (result) parseMethod = 'rawRepair';\n}\n\nif (!result) {\n  result = { document_title: 'Parse error', sections: [], _raw: raw.substring(0, 20000), _parse_error: true };\n  parseMethod = 'FAILED';\n}\n\nresult._parseMethod = parseMethod;\nreturn [{ json: { documentPlan: result } }];"
      },
      "typeVersion": 2
    },
    {
      "id": "respond",
      "name": "Respond",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        1040,
        300
      ],
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify($json) }}"
      },
      "typeVersion": 1.1
    },
    {
      "id": "tool_spec",
      "name": "Analyze Spec Tool",
      "type": "@n8n/n8n-nodes-langchain.toolCode",
      "position": [
        600,
        520
      ],
      "parameters": {
        "name": "analyze_spec",
        "description": "\u0410\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0430\u0439 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0442\u0430 \u043d\u0430 \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u0430\u0442\u0430 \u043f\u043e\u0440\u044a\u0447\u043a\u0430. \u0418\u0437\u043f\u0440\u0430\u0449\u0430\u0439 JSON \u043a\u043e\u043c\u0430\u043d\u0434\u0438:\n\n- {\"action\": \"structure\"} \u2014 \u043f\u043e\u043a\u0430\u0436\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u0442\u0430 (\u043f\u043e\u043b\u0435\u0442\u0430, \u043c\u0430\u0441\u0438\u0432\u0438, \u0440\u0430\u0437\u043c\u0435\u0440\u0438)\n- {\"action\": \"summary\"} \u2014 \u043a\u0440\u0430\u0442\u043a\u043e \u043e\u0431\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u0438 \u0434\u0430\u043d\u043d\u0438\n- {\"action\": \"get\", \"param\": \"field_name\"} \u2014 \u0432\u0437\u0435\u043c\u0438 \u0441\u044a\u0434\u044a\u0440\u0436\u0430\u043d\u0438\u0435\u0442\u043e \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u043f\u043e\u043b\u0435 (\u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0439 \u0442\u043e\u0447\u043d\u0438\u0442\u0435 \u0438\u043c\u0435\u043d\u0430 \u043e\u0442 structure)\n- {\"action\": \"search\", \"param\": \"\u043a\u043b\u044e\u0447\u043e\u0432\u0430 \u0434\u0443\u043c\u0430\"} \u2014 \u0442\u044a\u0440\u0441\u0438 \u043d\u0430\u0432\u0441\u044f\u043a\u044a\u0434\u0435 \u0432 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0442\u0430 (\u043d\u0430\u043f\u0440. \"\u043f\u043e\u0434\u043e\u0432\u0430 \u043d\u0430\u0441\u0442\u0438\u043b\u043a\u0430\", \"\u043a\u043b\u0438\u043c\u0430\u0442\u0438\u043a\", \"\u0441\u0433\u0440\u0430\u0434\u0430 \u0410\")\n- {\"action\": \"group\", \"param\": \"field_name\"} \u2014 \u0433\u0440\u0443\u043f\u0438\u0440\u0430\u0439 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0438 \u043f\u043e \u043f\u043e\u043b\u0435 (\u043d\u0430\u043f\u0440. \"category\", \"section\", \"building\")\n- {\"action\": \"count\"} \u2014 \u043e\u0431\u0449 \u0431\u0440\u043e\u0439 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0438 \u0438 \u0438\u043c\u0435\u043d\u0430 \u043d\u0430 \u043f\u043e\u043b\u0435\u0442\u0430\n\n\u041c\u043e\u0436\u0435\u0448 \u0434\u0430 \u0438\u0437\u043f\u0440\u0430\u0442\u0438\u0448 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0435\u043a\u0441\u0442 \u2014 \u0449\u0435 \u0441\u0435 \u0442\u044a\u0440\u0441\u0438 \u043a\u0430\u0442\u043e \u043a\u043b\u044e\u0447\u043e\u0432\u0430 \u0434\u0443\u043c\u0430.\n\u0412\u0410\u0416\u041d\u041e: \u0418\u0437\u0432\u0438\u043a\u0430\u0439 structure/summary \u041f\u042a\u0420\u0412\u041e, \u043f\u043e\u0441\u043b\u0435 get/search \u0437\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0438 \u0434\u0430\u043d\u043d\u0438.",
        "language": "javaScript",
        "jsCode": "// Tool inp

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

TP - Step 4: Plan Document. Uses agent, lmChatOpenRouter, toolCode. Webhook trigger; 7 nodes.

Source: https://github.com/Georgi-Piskov/tehnichesko-predlozhenie/blob/c8bab3fa6db2fa4a422b22b92a54c98d12b3d9dc/n8n/workflows/04-plan-document.json — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

🧪 LABR - nuevo asistente (REPARADO). Uses httpRequest, postgres, postgresTool, toolCalculator. Webhook trigger; 63 nodes.

HTTP Request, Postgres, Postgres Tool +9
AI & RAG

This n8n workflow orchestrates a powerful suite of AI Agents and automations to manage and optimize various aspects of an e-commerce operation, particularly for platforms like Shopify. It leverages La

Google Sheets, HTTP Request, Slack +10
AI & RAG

Lead Pipeline v3.0. Uses httpRequest, agent, lmChatAnthropic, toolThink. Webhook trigger; 77 nodes.

HTTP Request, Agent, Anthropic Chat +4
AI & RAG

This workflow integrates multiple productivity tools into a single AI-powered assistant using n8n, acting as a centralized control hub to receive and execute tasks across Google Calendar, Gmail, Googl

Agent, Discord, OpenAI Chat +12
AI & RAG

leads. Uses supabase, gmail, formTrigger, httpRequest. Webhook trigger; 62 nodes.

Supabase, Gmail, Form Trigger +13