Хтось передає вам шаблон Word і дедлайн. Які дані він потребує? Звичайна відповідь — відкрити його, прокрутити, вгадати, запустити, прочитати помилку і запустити знову. За допомогою GroupDocs.Assembly.Mcp, що працює локально (dnx GroupDocs.Assembly.Mcp --yes), Claude Desktop, Cursor або Copilot запитують шаблон безпосередньо: get_template_fields повертає всі теги, назви даних, які він використовує, і JSON‑скелет для заповнення, без запуску движка, а коли запуск не вдається, помилка підказує, що змінити:

Які дані потрібні файлу order-lines.docx? Якщо він не генерується, скажи, чому, і як виправити шаблон.

Покрокова версія з налаштуваннями та усуненням проблем знаходиться в документації: Як дізнатися, які дані потрібні шаблону і чому він не спрацював.

Чому варто перевіряти перед заповненням?

Тому що проби і помилки — дорогий спосіб вивчити схему. Агент, який вгадує назви полів за видимим текстом документа, вгадає CustomerName, коли шаблон містить customer.Name, і кожна помилкова здогадка коштує додаткового запиту та заплутаної помилки. Шаблон — це не проза; це програма з контрактом даних, і цей контракт можна прочитати.

Ось усе, що робить get_template_fields. Він аналізує теги <<…>>, визначає назви та створює скелет:

-> get_template_fields {"template":{"filePath":"order-lines.docx"}}
<- { "tagCount": 3,
     "dataSourceNames": [ "lines" ],
     "fields": [ "lines[].Title", "lines[].Quantity" ],
     "dataSkeleton": { "lines": [ { "Title": "", "Quantity": "" } ] },
     "notes": [ "fields and dataSkeleton are inferred from the tags,
       not from the engine; values computed by Select/GroupBy
       projections are not followed." ] }

Примітка чесно описує метод: це статична інспекція. Поле, створене всередині проекції Select, не відстежується. Для звичайного контракту, листа чи шаблону рахунку скелет точно відповідає тому, що потрібно заповнити.

Скелет також змінює діалог з вами. Замість «Я спробував згенерувати замовлення, і воно не вдалось», агент може сказати «цей шаблон потребує список рядків, кожен з назвою та кількістю; я знайшов три у вашому листі, ось вони», і лише потім генерувати. Інспекція недорога, не потребує даних і не змінює нічого, тому це правильний перший крок для будь‑якого шаблону, який агент ще не бачив, і правильний крок знову, коли хтось відредагував шаблон.

Три помилки, три відповіді

проблема шаблону          що каже сервер                виправлення
------------------------  ----------------------------  -------------------
{{name}} заповнювачі      "2 '{{...}}' заповнювач(і).  write <<[name]>>
                          ... не обробляє цей синтаксис" 
<<foreach>> не закрито    "Unexpected end of template.  add <</foreach>>
                          Тег блоку не закрито"
дані не містять поля      "The template reads 'Email',  add it, or
                          which the data does not have" allowMissingMembers

Неправильний синтаксис. Багато шаблонів у реальному світі написані для інших движків і використовують {{name}}. GroupDocs.Assembly залишає їх як текст, і інспекція повідомляє про це, перш ніж хтось витратить запуск:

-> get_template_fields {"template":{"filePath":"shipping-notice.docx"}}
<- { "tagCount": 0, "notes": [ "No <<…>> tags were found: ...",
     "The template contains 2 '{{…}}' placeholder(s). GroupDocs.Assembly
      does not process that syntax and leaves it as text; write
      <<[name]>> instead." ] }

Незакритий блок. Наш order-lines.docx відкриває <<foreach>> і ніколи його не закриває. Інспекція з радістю перераховує теги; генерація — ні:

-> assemble_document {"template":{"filePath":"order-lines.docx"},
     "dataJson":"{\"lines\":[{\"Title\":\"Cable\",\"Quantity\":2}]}"}
<- Document assembly failed for 'order-lines.docx': ...
   Unexpected end of template. A block tag is not closed: every
   <<foreach>> needs <</foreach>> and every <<if>> needs <</if>>.

Відсутнє поле. Коли дані не містять того, що читає шаблон, помилка називає поле, зазначає, що імена чутливі до регістру, і пропонує перемикач: allowMissingMembers: true не виводить нічого для відсутніх членів і порожні списки замість помилки.

Коли шаблон сповнений помилок

Деякі шаблони мають кілька помилок, і виправляти їх по одній невдалій спробі за раз повільно. inlineErrors: true перетворює шаблон у власний звіт про помилки: документ генерується, і кожен неправильний тег отримує повідомлення, записане поруч. На прикладі шаблону з прикладів GroupDocs.Assembly:

-> assemble_document {"template":{"filePath":"inline-error.docx"},
     "dataJson":"{\"name\":\"x\"}","inlineErrors":true}
<- Assembled 'inline-error.docx' ... The template has errors: each one
   is written into the output next to its tag, starting with 'Error!'

Вивід містить << var [name] Error! An assignment operator is expected. >> у місці документа, де розташований тег. Відкрийте файл, виправте кожен позначений тег, запустіть знову без прапорця.

Чого інспекція не бачить

Бінарні шаблони Outlook — виняток. Теги файлу .msg не можна прочитати без його генерації, і сервер повідомляє про це, а не повертає порожній список, який виглядає як «немає полів»:

-> get_template_fields {"template":{"filePath":"contracts-table.msg"}}
<- { "readable": false, "notes": [ "Tags cannot be read from a .msg
     template without generating it. Save the template as DOCX, XLSX,
     PPTX or EML to inspect it, or generate it with assemble_document
     and inlineErrors=true to see which fields fail." ] }

Ще одна пастка, яку ми виявили: список, який порожній у даних, не має типів елементів. Наш шаблон контракту множить item.Quantity * item.UnitPrice; при "items": [] і allowMissingMembers: true генерація все одно завершилася помилкою “Can not apply operator ‘’ to operands of type ‘System.Object’ and ‘System.Object’”*. Нехай агент перевіряє, що список не порожній перед генерацією, і запитає вас, яким має виглядати порожній контракт.

Чесні обмеження

  • Інспекція статична: проекції Select та GroupBy не відстежуються, і шаблони .msg не можна прочитати.
  • Шаблони — довірений вхід; теги зображень та документів завантажують шляхи та URL‑и, які повертають їх вирази.
  • Режим оцінки: кожен вихід починається з “Evaluation Only. Created with GroupDocs.Assembly 26.7…”.
  • Дати: передайте 2026-11-12T00:00:00 і форматуйте у шаблоні за допомогою :"d MMMM yyyy"; рядок лише з датою зміщувався на день на машині UTC+2, і "12.11.2026" читалося як 11 грудня.

Питання та відповіді

Як я можу дізнатися, які поля потрібні шаблону Word?
Попросіть агента викликати get_template_fields для нього. Ви отримаєте теги, назви даних та JSON‑скелет локально, без генерації.

Чому мій шаблон виводить {{name}} замість значення?
Тому що теги GroupDocs.Assembly — це <<[name]>>. Інспекція сервера позначає заповнювачі {{…}} і підказує, що написати замість них.

Чи може Markdown бути шаблоном?
Так. Наш product-readme.md з тегами <<[product]>> та <<[description]>> був інспектований як файл Word і згенерований безпосередньо у DOCX.

Поглиблене вивчення