Попросіть AI‑агента «написати договір про обслуговування для Contoso», і він зробить це своїми словами, зі своїми заголовками та підрахує суму в голові. Це неправильний розподіл праці.

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

Створіть договір про обслуговування для цього замовлення, використовуючи contract-template.docx, і збережіть його у форматі PDF: Contoso Pharma, Keizersgracht 210 Amsterdam, контакт Dr. Lena Brandt; 12 місяців керованого хостингу за 4 800 EUR, 12 місяців підтримки за 1 200 EUR, один воркшоп з впровадження за 3 500 EUR; знижка 5 відсотків.

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

Чому модель не повинна писати документ?

Тому що згенерований документ містить помилки, які важко помітити. Макет відхиляється від затвердженого юридичним відділом. Пункт перефразовується у щось, що звучить добре, але означає інше. Сума отримується за допомогою передбачення наступного токену, а не множення. І кожен запуск трохи відрізняється, тому огляд минулого місяця нічого не каже про контракт цього місяця.

Шаблон змінює це. Юридичний відділ володіє contract-template.docx зі своїми заголовками, блоком підпису та тегами <<[customer.Name]>>. Завдання моделі зводиться до того, у чому вона сильна: читати електронний лист або набір нотаток і перетворювати їх у структуровані значення. Движок робить решту, завжди однаково.

Як агент знає, що заповнювати?

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

-> get_template_fields {"template":{"filePath":"contract-template.docx"}}
<- { "tagCount": 17,
     "dataSourceNames": [ "contract", "customer", "items" ],
     "dataSkeleton": {
       "contract": { "Number": "", "Date": "", "Discount": "" },
       "customer": { "Name": "", "Address": "", "Contact": "",
                     "Email": "" },
       "items": [ { "Title": "", "Quantity": 0, "UnitPrice": 0 } ] } }

Цей скелет — це договір між моделлю та документом. Агент заповнює його з тексту замовлення і передає назад як dataJson.

Що трапляється, коли агент пропускає поле?

Його точно повідомляють. У нашому тесті перша спроба агента пропустила електронну адресу клієнта. Сервер відхилив запит і вказав на прогалину:

-> assemble_document {"template":{...},"dataJson":"{... no Email ...}"}
<- Document assembly failed for 'contract-template.docx': ...
   Can not get the value of member 'Email' on type ''. The template
   reads 'Email', which the data does not have. Check the spelling
   (names are case-sensitive) with get_template_fields and add it to
   the data. ... pass allowMissingMembers=true to output nothing for
   missing members and empty lists.

Модель, що писала б вільний текст, тихо залишила б цей рядок порожнім. Тут агент може запитати вас про адресу або разом з вами вирішити, що поле може залишитися порожнім.

Повний обмін

user            agent                       Assembly MCP server
 | "Make the contract for this order: ..."                      |
 |-------------->|                                              |
 |               |-- get_template_fields {"template":          |
 |               |     "contract-template.docx"} ------------->|
 |               |<- dataSkeleton: contract, customer, items --|
 |               |   (fills the skeleton from the order text)  |
 |               |-- assemble_document {"dataJson":"{...}",    |
 |               |     "format":"pdf"} ----------------------->|
 |               |<- Saved to: .../contract-template_          |
 |               |   assembled.pdf ----------------------------|
 |<- "Contract ready: 3 items, total 75500 EUR, 5% discount."  |
   layout, table and arithmetic come from the template

Після додавання електронної пошти другий виклик успішно завершився:

-> assemble_document {"template":{"filePath":"contract-template.docx"},
     "dataJson":"{...}","format":"pdf"}
<- Assembled 'contract-template.docx' with inline JSON (JSON object)
   as PDF
   Saved to: .../contract-template_assembled.pdf

Документ містить трирядкову таблицю зборів, створену за допомогою <<foreach>> у рядку таблиці, суми обчислені шаблоном (<<[item.Quantity * item.UnitPrice]>>), загальна сума 75500 EUR з items.Sum(...) і рядок «Застосовується знижка 5 відсотків», який існує лише тому, що тег <<if>> знайшов знижку в даних. Модель нічого не обчислювала.

Чи це краще, ніж сервіс шаблонів у хмарі?

Це інша торгівля. Сервіси шаблонів у хмарі беруть ваш шаблон і дані через HTTPS, рендерять їх у своїй хмарі та стягують плату за документ або за кредит. Тут шаблон, дані та результат залишаються у папці на вашому комп’ютері; движок — це GroupDocs.Assembly, що працює в процесі, і нічого не слухає на порту. Те, що надходить до вашого постачальника моделі, — це текст замовлення, який ви вставляєте, і скелет, який заповнює агент, а не готовий контракт. Архітектура описана у пості сімейства про обробка AI‑документів на місці.

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

  • Режим оцінки: кожен згенерований документ починається рядком «Evaluation Only. Created with GroupDocs.Assembly 26.7…», збережені робочі книги отримують додатковий лист, а шаблони електронних листів залишають лише їхнє просте текстове тіло. Файл ліцензії або лічильні ключі видаляють усі три.
  • Синтаксис шаблону — <<[name]>>. Заповнювачі {{name}} залишаються як текст; get_template_fields повідомляє про це.
  • Шаблони — це довірений вхід: теги зображень та документів завантажують будь‑який шлях або URL, який повертає їх вираз. Підключіть одну папку для сервера.
  • Дати: записуйте їх у форматі 2026-11-12T00:00:00 і форматувати у шаблоні (<<[contract.Date]:"d MMMM yyyy">>). Дата лише "2026-11-12" виводиться як 11 листопада на машині UTC+2 у нашому тесті.
  • Агент є джерелом даних. Попросіть його перерахувати значення, які він витягнув, перед рендерингом, і перегляньте їх.

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

Чи може AI‑агент заповнити мій шаблон Word без його завантаження?
Так. Сервер працює локально через stdio і читає шаблон з папки, яку ви налаштували; результат записується поруч.

Які формати можуть бути у шаблону?
Word, Excel, PowerPoint, Markdown, HTML, текстові та шаблони електронних листів; кожен можна зберегти у власному форматі або у PDF та інші. get_supported_formats перераховує їх для кожного шаблону.

Що робити, якщо шаблон підтримує інша особа?
У цьому і суть. Той, хто володіє шаблоном, змінює пункти та макет; агент продовжує заповнювати той самий скелет, і get_template_fields показує йому будь‑яке нове поле під час наступного запиту.

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