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 →
{
"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.
openRouterApi
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 →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
🧪 LABR - nuevo asistente (REPARADO). Uses httpRequest, postgres, postgresTool, toolCalculator. Webhook trigger; 63 nodes.
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
Lead Pipeline v3.0. Uses httpRequest, agent, lmChatAnthropic, toolThink. Webhook trigger; 77 nodes.
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
leads. Uses supabase, gmail, formTrigger, httpRequest. Webhook trigger; 62 nodes.