Інтеграція з Agentfy
Прийнятий напрям · API злито · застосунок реалізовано · локальну перевірку у браузері пройдено · 13 жовтня 2026 · спільний контракт інтеграції записано, Shiffty приведено до нього (восьме поле, перемикач чату, оновлення профілю на місці) 15 жовтня 2026 · перевірено на локальній заглушці та локальному Agentfy, нічого не розгорнуто · з 14 жовтня 2026 чат у застосунку було приховано, а локальну заміну Agentfy видалено того ж дня (її таблиці видалено 16 жовтня 2026) · чат знову показується там, де API каже, що асистент доступний, а агента магазину підключають з його сторінки — створено 19 жовтня 2026, перевірено з локальним Agentfy, не розгорнуто · асистент власника — один агент на компанію, вирішено й створено 20 жовтня 2026, перевірено з локальним Agentfy, не розгорнуто · асистента компанії підключають першим, під час схвалення компанії адміністратором платформи, вирішено й створено 23 жовтня 2026, не розгорнуто · асистент власника створює магазин, створено 23 жовтня 2026, перевірено на Agentfy в пам'яті, не розгорнуто · новий профіль сам доходить до агентів кожної компанії, вирішено й створено 23 жовтня 2026, перевірено з локальним Agentfy, не розгорнуто · чому асистент компанії не налаштувався, бачить адміністратор, з «Retry», а власник — короткий текст без кодів, вирішено й створено 28 жовтня 2026, перевірено з Agentfy у пам'яті, не розгорнуто · чат читає нові назви подій відповіді Agentfy (AGNT2-596), створено 28 жовтня 2026, перевірено на Agentfy в пам'яті та з локальним Agentfy, не розгорнуто · тиждень, який змінює картка графіка, поруч із чатом, створено 4 листопада 2026, перевірено з Agentfy в пам'яті, не розгорнуто · описи питають до того, як будується тиждень, в обох асистентах, створено 5 листопада 2026, перевірено з Agentfy в пам'яті, з живим агентом не перевірено, не розгорнуто
Кожен магазин отримав би власного агента на платформі агентів Agentfy; керівник і працівники цього магазину говорили б із ним усередині застосунку Shiffty, кожен від свого імені, і ніколи не бачили б Agentfy. З 20 жовтня 2026 власник компанії має ще одного, власного агента — одразу для всіх магазинів.
Agentfy веде розмову; Shiffty зберігає факти, перевіряє кожен дозвіл і малює чат.
Як Shiffty лягає на Agentfy
В Agentfy три рівні, а не два:
Organization — сам Shiffty як партнер: простір імен, облікові дані
└─ Team — одна компанія Shiffty
└─ Agent × N — по одному на магазин
└─ Agent — агент власника, один на компанію (з 20 жовтня 2026)
ExternalIdentity — працівник або керівник (externalUserId = ідентифікатор зайнятості в Shiffty)
або власник (externalUserId = ідентифікатор користувача власника)
Conversation — одна на пару (агент, людина)- Одна компанія — одна команда; один магазин — один агент.
- Керівник магазину та його працівники говорять з тим самим агентом, кожен зі своєю особою. Працівник або керівник має доступ рівно до одного агента, бо кожна людина належить рівно до одного магазину (11 жовтня 2026; до того керівник мав вести кілька). Власник говорить із власним агентом: див. асистент власника.
- Агента для магазину створював би сам Shiffty, коли створюється магазин, через інтерфейс провіжинінгу Agentfy. Це залежить від оператора Agentfy; див. що має бути правдою спершу. У створеному (19 жовтня 2026) власник або керівники магазину також можуть запустити чи повторити це кнопкою «Connect assistant» на сторінці магазину (Екрани). У створеному API створення активного магазину вже пробує налаштувати його агента, коли Shiffty підключено до Agentfy; якщо спроба не вдалася, більше нічого не ламається, а сторінка магазину показує агента неготовим, з «Retry».
Як це записано на боці Shiffty — на сторінці Структура даних.
Асистент власника
Вирішено власником 20 жовтня 2026; створено того ж дня, перевірено на Agentfy в пам'яті й один раз звірено з локальним Agentfy, не розгорнуто. Це замінює «немає асистента для власника» від 19 жовтня 2026.
- Один агент на компанію, а не на магазин. Він міститься в команді компанії в Agentfy поруч з агентами магазинів. Його зовнішній id — id компанії (команди); він має власний профіль зі своєю ревізією, тож зміна профілю агентів магазинів його ніколи не зачіпає, і навпаки.
- Він створює команду компанії в Agentfy (рішення власника проєкту від 23 жовтня 2026; до того він входив до команди, яку створив агент першого магазину, а підключити його раніше за будь-який магазин було не можна). Agentfy створює команду компанії разом із першим агентом, про якого його просять. Тепер асистента компанії підключають, коли адміністратор платформи схвалює компанію, тож першим агентом стає він, а агент кожного магазину, створеного пізніше, входить до його команди; жоден магазин не мусить бути першим. Схвалення ніколи довго не чекає на Agentfy і не зривається через нього: якщо Shiffty не підключено до Agentfy або налаштування не вдалося, власник бачить у Stores Not connected або Failed з Retry. Компанія, чию команду раніше створив агент магазину, зберігає цю команду: спершу підключається той магазин, а асистент компанії входить до його команди. Перевірено з Agentfy у пам'яті, зокрема з таким, що падає, і з повільним; не розгорнуто.
- Чому він не налаштувався, кажуть (рішення власника проєкту від 28 жовтня 2026; створено того ж дня, перевірено лише з Agentfy у пам'яті, не розгорнуто). Невдале налаштування зберігає, що відповів Agentfy, — його код і HTTP-статус, ніколи не його текст — як коротку причину, яка каже, що робити, наприклад «Agentfy rejected Shiffty's key for this organization (CREDENTIAL_REJECTED, 401)» або що Agentfy не відповів вчасно, і API пише про це один рядок у журнал. Адміністратор платформи бачить її одразу після «Approve» і на картці компанії в «Requests», з «Retry», який продовжує те саме налаштування й ніколи не створює другого агента; компанію, чий асистент так і не був створений, показано як не налаштовану, з «Retry». Власник натомість бачить короткий текст — «The company assistant could not be set up. We have been notified; press Retry later.» — без кодів і без того, що може зробити лише адміністратор, у «Stores» і на своїй вкладці Assistant, теж з «Retry»; повна причина лишається збереженою для адміністратора. До того причина була загальною («could not be confirmed»), а адміністратор бачив лише «approved».
- Власник говорить із ним від свого імені, зі своєю особою — id користувача власника — і роллю, яку Agentfy називає owner. Shiffty ніколи не повідомляє Agentfy, що власник пішов: тоді Agentfy назавжди відібрав би власність на команду. Доступ колишнього власника просто спливає протягом хвилин, і Shiffty його відхиляє.
- З правами власника, на всі магазини. Кожен інструмент магазину приймає магазин, з яким працює; власник називає будь-який магазин компанії, а на невказаний магазин відповідають списком магазинів. Права й далі беруться з дозволу розмови, ніколи не від моделі; магазин поза компанією не знаходиться. Кожна зміна — картка, яку власник підтверджує в застосунку, і підтвердження знову перевіряє правила. Публікація тижня є лише тут, як картка (інструменти).
- Підключається як асистент магазину. Власник підключає його вгорі «Stores» (Company assistant: Not connected, Setting up, Ready або Failed, з «Connect assistant» або «Retry»), а локальний запуск підключає його першим (до 23 жовтня 2026 — після магазинів). Коли скинута база втратила його ключ доступу, він так і каже, і «Retry» видає тому самому агентові новий ключ, як для магазину. Власник також може вивести його з роботи; агенти магазинів лишаються.
- Кожен агент бачить лише свої інструменти. Агент магазину й далі виявляє рівно ті інструменти й аргументи, що в нього були; агент власника виявляє інструменти власника.
- Він може створити магазин (23 жовтня 2026, створено й перевірено на Agentfy в пам'яті, з локальним Agentfy не звірено, не розгорнуто). Підтвердження картки створює магазин і потім підключає асистента магазину, як під час створення в застосунку; асистента магазину підключають лише після збереження магазину, бо Agentfy перевіряє його інструменти ключем, який Shiffty для нього зберіг. Обидва профілі того дня отримали нову ревізію (власника — 5, магазинів — 9): нові інструменти, продукт називається Shiffty, і проста відповідь з місцем у Shiffty, коли жоден інструмент не робить того, про що просять. Скидання локальної бази після цієї зміни відхиляє агентів, створених до неї, як описано нижче.
- Обидва асистенти питають відсутні описи, перш ніж будувати тиждень (прохання власника від 5 листопада 2026; створено того ж дня, перевірено з Agentfy в пам'яті, з живим агентом не перевірено, не розгорнуто). Якщо в магазину, посади чи людини, яку тиждень запланував би, немає опису, інструмент розв'язувача нічого не планує й каже, чого бракує; асистент повідомляє це людині, питає те, що потрібно тижню, записує відповідь в описи карткою й будує тиждень, коли її підтвердять, — або, лише коли людина каже будувати без цього, будує й каже, чого не було. В асистента власника є картка й для опису посади. Обидва профілі отримали нову ревізію (магазинів 15, власника 11). Як це працює — на сторінці Інструменти агента.
Перевірено 20 жовтня 2026 в робочій копії з локальним Agentfy, від імені власника демо-компанії: на «чого бракує наступного тижня по магазинах?» відповідь прийшла з огляду компанії; прохання спланувати чорновий тиждень Harbor Street дало картку розв'язувача, яка спланувала й зміни керівника магазину і, підтверджена через маршрут застосунку, записала 11 змін і прибрала 6 у чернетці, не опублікувавши її; зміна посади й годин за договором керівника та опис керівника стали картками, підтвердженими. Знайдено й того ж дня виправлено одну ваду: інструмент магазину, викликаний без свого магазину, валив увесь хід; тепер він відповідає списком магазинів. Картки підтверджувалися через маршрут підтвердження, а не натисканням у браузері. Потім копія вивела з роботи своїх п'ятьох агентів.
Два шляхи і чому віджет не підходить
| Шлях | Що агент знає про людину | Інструменти | Висновок |
|---|---|---|---|
| Вбудований віджет — готовий чат Agentfy, розміщений на сторінці | Нічого: відвідувач для агента анонімний | Немає | Не використовується |
| Партнерський серверний чат — API Shiffty говорить з Agentfy від імені людини | Стала особа в кожної людини | Довірений сервер інструментів, який запускає Shiffty, отримує контекст людини під час кожного виклику | Обрано |
Асистент, який не відрізняє Анну від Бена, не може подивитися зміни Анни чи подати її запит, тому віджет не підходить.
З партнерським серверним чатом розмову малює застосунок Shiffty, а з Agentfy говорить API Shiffty. По черзі: повідомити Agentfy, що людина входить до команди компанії → відкрити розмову з агентом магазину → прикріпити до неї контекст людини → надіслати повідомлення → читати відповідь у міру її появи.
Як дозволяється виклик інструмента
Агентові ніколи не вірили б на слово, від чийого імені він діє.
- Відкриваючи розмову, Shiffty виписує грант: яка зайнятість, який магазин, яка роль і до якого часу. Він прив'язує грант до цієї розмови.
- Agentfy повертає грант під час кожного виклику інструмента — у заголовку
X-SD-Context, разом з ідентифікаторами агента, розмови та ходу. - Сервер інструментів Shiffty перевіряє три речі, перш ніж щось робити: грант іще чинний, магазин у ньому збігається з агентом, який викликає, і роль у ньому дозволяє цей інструмент.
Один агент на магазин обслуговує обидві ролі. Які інструменти дозволено, вирішує грант, а не агент: розмова працівника не може дотягнутися до інструмента керівника.
Сервер інструментів — це MCP-сервер; MCP — відкритий стандарт під'єднання агентів до зовнішніх систем. Це закриває питання на сторінці Агент і розв'язувач: інструменти доходять до агента через один MCP-сервер, який запускає Shiffty, а розв'язувач лишається звичайним сервісом за ним.
Інструменти, які отримає агент
| Інструмент | Для кого | Що він робитиме |
|---|---|---|
| Прочитати мої зміни | Працівник, керівник | Зміни людини в опублікованому графіку |
| Перевірити зміну | Працівник, керівник | Чи порушує конкретний обмін або вихідний якесь правило |
| Знайти заміну | Працівник, керівник | Хто може взяти зміну, не порушуючи правил, і чого це коштуватиме |
| Пояснити відмову | Працівник, керівник | Чому щось неможливо і що це виправить |
| Подати запит на зміну | Працівник | Передати підготовлену зміну колезі, а потім керівникові |
Створено в API, не розгорнуто, як сім інструментів: my_shifts, check_change, find_cover, explain_refusal, submit_change_request і request_status для керівників і працівників та team_week — тиждень магазину — лише для керівників. submit_change_request — єдиний, що веде до зміни, і зміна стає запитом, лише коли людина підтверджує її картку в чаті; щодо запиту все одно потрібне рішення. Жоден із них не складає й не змінює графік. З 19 жовтня 2026 року вони — частина одного каталогу разом із дев'ятьма новими інструментами читання — день із покриттям, місяць, години без чергового керівника, тиждень однієї людини, магазин, його люди, запити на рішення, один запит, «Чекає на вас» — і плану, за яким асистент крок за кроком зможе робити те, що людина може в застосунку, окрім рішень щодо запитів і публікації тижнів: див. Інструменти агента.
«Побудувати графік» — кнопка в застосунку, а не інструмент агента. Виклик інструмента в Agentfy має коротку межу часу (нижче), і побудова графіка для справжнього магазину може в неї не вкластися. Розподіл прав між ролями в таблиці — пропозиція. Що робить розв'язувач за цими інструментами — на сторінці Агент і розв'язувач.
Чого Agentfy сьогодні не робить і що через це лишається за Shiffty
Обмеження нижче прочитано в репозиторії Agentfy 5 жовтня 2026. Контракт вбудованого профілю повторно перевірено 13 жовтня (AGNT2-476). Того дня SHIF-19 перевірив локальний ланцюжок провіжинінг → ready → чат → виклик MCP-інструмента → done; розміщені та production-оточення не перевірялися. Див. злиту реалізацію API.
| Обмеження Agentfy (5 жовтня; профіль і локальну перевірку оновлено 13 жовтня 2026) | Що з цього випливає для Shiffty |
|---|---|
| Партнерський серверний чат завершив розмову з викликом інструмента на локальному Agentfy 13 жовтня. | API злито. Чат застосунку реалізовано в гілці SHIF-20, з 14 жовтня 2026 його було приховано, а з 19 жовтня 2026 він знову показується (нижче). Роботу з розміщеними та production-оточеннями ще не перевірено. |
| Провіжинінг для організації вмикається лише в базі даних Agentfy, його оператором. | Оператор має ввімкнути його для організації Shiffty, перш ніж магазин зможе автоматично отримати агента. |
| Agentfy приймає профіль агента безпосередньо в запиті в межах політики організації, схваленої оператором (AGNT2-476); шаблонів агентів більше немає. | Shiffty версіонує ім’я, інструкції, skill та обов’язкові інструменти в коді як profileRevision і передає їх у agent.profile. Політика обмежує моделі, MCP-хости, довірений контекст, worker-інструменти та вихідні з’єднання. |
| Агент не може почати повідомлення першим: вихідних сповіщень немає. | Повідомляти людині, що на неї щось чекає, — справа Shiffty: список «Чекає на вас» на сторінці Екрани. |
| Виклик інструмента має 15 секунд. | Інструменти мають відповідати швидко; побудова графіка лишається кнопкою в застосунку. |
| За один хід — не більше 3 викликів інструментів, що змінюють дані. | Одне прохання працівника має вкластися в кілька кроків; інструменти Shiffty робляться під це. |
| Рівно один довірений MCP-сервер на розмову. | Усі інструменти Shiffty стоять за одним сервером. |
| У партнерських ходах немає пам'яті про людину між розмовами. | Стан зберігає Shiffty і щоразу передає агентові факти. |
| Оплата використання коштом організації не готова до експлуатації. | Як Shiffty платив би за розмови своїх магазинів, не визначено. |
Чат у застосунку
Знову показується з 19 жовтня 2026 (рішення власника, назавжди), коли API каже, що він доступний; створено, перевірено лише з локальним Agentfy, не розгорнуто. Застосунок питає API під час входу й відкриття вкладки: GET /v1/me відповідає assistant з available, причиною словами (reason) і кодом (code) — not_connected (у Shiffty немає підключення до Agentfy в «Settings» застосунку адміністратора), chat_off (немає ключа серверного чату), agent_not_ready (агент цього магазину не готовий) або, з 20 жовтня 2026, owner_agent_not_ready (власний агент власника не підключений або не готовий; до того код owner казав, що власник його не має), і без коду, коли він доступний. Якщо доступний, вкладка Assistant кожної ролі — чат нижче, і посилання «Ask the assistant» в інших місцях показано. Якщо недоступний, вкладка каже звичайними словами чому й хто може це виправити — адміністратор платформи в «Settings» або керівник магазину чи власник на сторінці магазину, — а посилання приховано. Коли асистент власника не готовий, вкладка власника так і каже й з 28 жовтня 2026 показує самого асистента компанії — його стан, чому налаштування не вдалося, і «Connect assistant» або «Retry» (вище); до того вона вела на «Stores». Агента магазину показують і підключають на сторінці магазину: GET /v1/stores/:id/agent дає Not connected, Setting up, Ready або Failed з безпечною причиною та profileUpdateError, коли агент ще працює на старому профілі; «Connect assistant» або «Retry» викликає POST /v1/stores/:id/agent (власник і керівники цього магазину). Налаштування просувається лише з POST, тому, доки воно триває, сторінка надсилає його знову кожні 3 секунди, не більше 20 разів. З 19 жовтня 2026 агент вважається готовим, лише поки Shiffty зберігає ключ доступу, який видав цьому агентові: після скидання локальної бази (ті самі id магазинів, агент в Agentfy живий) магазин показує Failed з цією причиною замість Ready, а «Connect assistant» або «Retry» видає тому самому агентові новий ключ; перевірено лише з локальним Agentfy. Теж з 19 жовтня 2026 після локального перезаповнення нічого натискати не треба: щойно локальний API відповідає, запуск у розробника входить як власник демо-компанії, так само підключає кожен активний магазин, завжди в одному порядку, і друкує по рядку на магазин — Ready або Failed з причиною; перевірено лише з локальним Agentfy. Чого це поки не вміє: якщо профіль агента змінився між його створенням і скиданням, Agentfy відмовляє в новому запиті (він зберігає початковий і не дає знайти агента за id Shiffty), такий магазин показує Failed з цією причиною, і агента доводиться вивести з роботи в Agentfy, втративши його розмови, перш ніж підключити знову. Див. Екрани.
З 14 по 19 жовтня 2026 вкладка Assistant кожної ролі казала «Assistant · In development» і що, доки він не готовий, усе робиться вручну на інших вкладках, — за константою в застосунку; посилання, які відкрили б асистента, було приховано. Цієї константи більше немає. Демо за сценарієм (11 жовтня 2026), яке відповідало на кілька фіксованих запитань заготовленими відповідями, видалено з коду, і запасного варіанта за сценарієм немає: коли API відповідає, що Agentfy не налаштовано, застосунок знову питає GET /v1/me і показує панель.
Того ж дня з API прибрано локальну заміну Agentfy — режим (AGENTFY_INTEGRATION_MODE=fake), у якому API сам грав Agentfy, з коротким сценарієм замість моделі, і зберігав свої розмови в п'яти власних таблицях; міграція 20261016T1038_drop_fake_agentfy (Prisma 8, 16 жовтня 2026) видаляє ці таблиці. Локальні запуски тепер ідуть із вимкненою інтеграцією. Залишений fake — у змінних середовища чи в збереженому рядку Settings — вважається вимкненим, з причиною в Settings і попередженням у журналі API, і Settings його більше не приймають. Справжній режим організації, MCP-сервер із його сімома інструментами, дозволи, журнал аудиту й картки підтвердження не змінилися. Автотести API перевіряють їх у режимі організації із заміною Agentfy в пам'яті, яка живе лише в тестах: модель грає сам тест, викликаючи MCP-сервер із дозволом, який Shiffty прив'язав до розмови.
Нижче описано чат, яким його було реалізовано в гілці SHIF-20 і перевірено у браузері з локальним Agentfy 13 жовтня 2026, і перевірено знову в браузері з локальним Agentfy 19 жовтня 2026. Керівник і працівники бачать агента магазину, коли API повідомляє про його доступність; з 20 жовтня 2026 власник так само бачить власного агента.
Розмова завантажується зі збереженої історії. Застосунок показує отриманий текст і стани інструментів без вигаданого прогресу. Якщо з'єднання обривається, відповідь залишається непідтвердженою; її можна відновити з тим самим повідомленням. Графіки й запити залишаються доступними.
26 жовтня 2026 Agentfy перейменував події відповіді (AGNT2-596): текст тепер надходить шматками під новими назвами, початок і кінець роботи інструмента називаються інакше, а останнього повідомлення з повним текстом більше немає. Shiffty нових назв не знав, тож від того дня кожна відповідь закінчувалася словами «The run could not be confirmed», хоча Agentfy її завершив. З 28 жовтня 2026 API читає і старі, і нові назви, збирає повний текст зі шматків, пропускає незнайому подію замість помилки й пише в журнал один рядок, без змісту розмови, коли потік відповіді обривається. Створено, перевірено на Agentfy в пам'яті, що говорить обома варіантами, і з локальним Agentfy 28 жовтня 2026 (відповідь працівникові й картка магазину у власника); не розгорнуто. Назви — в api/AGENTFY.md.
Перевірена зміна з'являється карткою з описом від сервера. Send request надсилає запит колезі й тому, хто ухвалює рішення, але не змінює графік. Картки зберігаються після перезавантаження; повтор підтвердження відновлює той самий запит. No зберігає відмову для цієї картки. З 4 листопада 2026 картка, що змінює тиждень (create_week, change_week, solve_week), має Show week: тиждень відкривається поруч із чатом зі змінами картки — їх пробують з усіма правилами й відкидають, тож це те, що запише підтвердження, — а після підтвердження тиждень показано збереженим (екран 13).
Налаштування оператора
Зроблено в гілці SHIF-23, 14 жовтня 2026; восьме поле додано 15 жовтня 2026; перевірено на локальній заглушці, не на розміщеному Agentfy і не розгорнуто. Підключення більше не живе у змінних середовища, а в одному рядку Setting (agent/agentfy), який адміністратор платформи редагує в розділі Settings адмін-застосунку — окремого застосунку поруч з API та застосунком з 18 жовтня 2026 (SHIF-36), створеного й не розгорнутого; до того Settings були розділом застосунку. Поля в порядку, спільному для всіх проєктів з Agentfy: режим (off, fake, organization), URL API, ідентифікатор організації, середовище (test або production), ключ provisioning, ключ server chat, URL MCP, модель. Точні назви, типи та змінні середовища — у контракті нижче. Обидва ключі зберігаються запечатаними (AES-256-GCM під ключем поза базою) і більше не показуються — читання повідомляє лише, чи задано ключ, а порожнє поле при збереженні його зберігає. Збереження атомарне і відхиляється, якщо хтось зберіг раніше; зміна організації, середовища, origin чи режиму потребує явного перепідключення, яке відкидає агентів, команди й розмови попереднього підключення, щоб їхні ідентифікатори не використовувалися повторно. «Test connection» перевіряє API, обидва права й URL MCP окремо і не видає це за наскрізний сценарій — його доводить лише підготовлена крамниця. Хто які поля змінював, записується за назвами, ніколи за значеннями. Кожен працюючий API підхоплює зміну не пізніше ніж за 15 секунд. Імпорт старих змінних середовища — явна дія. Механізм описано в api/AGENTFY.md у репозиторії.
Контракт інтеграції з Agentfy
Чотири продукти підключаються до Agentfy однаково — Bonsite, Securify, Shiffty і Store Deputy, — і Shiffty є еталоном, до якого приводять решту три. Цей розділ — спільний контракт, записаний так, щоб на нього міг посилатися тікет будь-якого з чотирьох. Де цей текст і код Shiffty розходяться, правий текст, а Shiffty виправляється (SHIF-24 зробив це 15 жовтня 2026); решта йдуть слідом у своїх тікетах тієї ж серії.
Одна група налаштувань з одними восьма полями, один рушій налаштувань, один спосіб читати з'єднання, один каркас MCP, один формат профілю. Продукт може відрізнятися лише інструментами, текстом свого агента та власними екранами провіжинінгу й чату.
Вісім полів agent/agentfy
Рівно ці, у цьому порядку, з цими назвами, типами та змінними середовища. Формат визначення — як у api/src/slices/setup/agentfy/setting/agentfySetting.ts Shiffty: поле має name, label, type (string, url, enum або secret), options, default, required, placeholder, help, env; група — title, description, fields, reconnectFields (mode, apiUrl, organizationId, environment), validate(data, {production}), що повертає {field: problem}, і fromEnv(env).
| # | Поле | Тип | За замовчуванням | Змінна середовища | Правило |
|---|---|---|---|---|---|
| 1 | mode | enum off · organization | off | AGENTFY_INTEGRATION_MODE | Shiffty: залишений fake вимкнено, і його не можна зберегти (з 14 жовтня 2026) |
| 2 | apiUrl | url | — | AGENTFY_URL | лише origin — без шляху, query, fragment і облікових даних; HTTPS, простий HTTP лише для loopback поза production |
| 3 | organizationId | string | — | AGENTFY_ORG_ID | A-Za-z0-9._:-, від 1 до 128 символів |
| 4 | environment | enum test · production | test | AGENTFY_ORG_ENVIRONMENT | має збігатися із середовищем ключів |
| 5 | provisioningKey | secret | — | AGENTFY_ORG_KEY | orgk_… |
| 6 | serverChatKey | secret | — | AGENTFY_CHAT_KEY | orgk_…, відрізняється від provisioningKey; задано — чат увімкнено, порожньо — чат вимкнено; в organization не обов'язковий |
| 7 | mcpUrl | url | — | MCP_PUBLIC_URL | точна публічна адреса POST /mcp цього API; обов'язковий в organization |
| 8 | modelId | string | порожньо | AGENTFY_MODEL_ID | порожньо — перша модель, дозволена політикою організації; передається в profile.modelId під час провіжинінгу |
validate усюди одна: в organization обов'язкові apiUrl, mcpUrl, organizationId, environment і provisioningKey, serverChatKey необов'язковий, але якщо задано — orgk_… і не дорівнює provisioningKey; apiUrl без шляху, query, fragment і облікових даних. Старі назви — AGENTFY_MODE, AGENTFY_API_URL, AGENTFY_ENVIRONMENT, AGENTFY_PROVISIONING_KEY, AGENTFY_SERVER_CHAT_KEY, AGENTFY_MCP_URL, AGENTFY_CHAT_ENABLED, AGENTFY_TEMPLATE_* і режими legacy/live — не читаються нічим, а .env.example і документація більше не згадують їх як чинні. До 14 жовтня 2026 у контракті був і режим fake (заміна Agentfy всередині API для розробки, заборонена в production, якій потрібен був лише mcpUrl); Shiffty прибрав його за рішенням власника, а чи приберуть його три інші продукти — вирішують їхні власні тікети.
Рушій налаштувань
Один слайс, setup/setting, як у Shiffty, який нічого не знає про Agentfy. Рядок Setting зберігає scope, scopeKey, group, code, version, data, source (database або env), enabled, lastCheck, lastCheckAt, updatedAt, updatedBy. Секрети запечатано під SETTINGS_KEY (secret box; перезапечатуються на старті після ротації з SETTINGS_KEY_PREVIOUS), збереження атомарні під optimistic version, кожну зміну записано в аудит за актором, дією та назвами полів, а API читає типізований знімок. Визначення груп підключаються через SettingModule.forRoot([...]).
Одне місце, де читають з'єднання
setup/agentfy/connection.ts експортує тип IAgentfyConnection — mode, source (database, env або none), reason, refused, apiUrl, organizationId, environment, provisioningKey, serverChatKey, mcpUrl, modelId — і функцію currentConnection(). Більше ніхто не читає process.env.AGENTFY_* і не тримає власної копії: ні обгорток над сховищем запиту, ні впроваджених знімків, ні settingValue(). Усе через currentConnection().
REST для адміністраторів
Для адміністратора платформи, не власника команди; generic за group і code:
| Маршрут | Що робить |
|---|---|
GET /settings | усі групи з полями (секрет показує лише hasValue), source, version, enabled, state, lastCheck, importable |
GET /settings/:group/:code | одна група в тій самій формі |
PUT /settings/:group/:code | тіло {version, data: {field: string | {op: 'keep' | 'replace' | 'clear', value?}}, source?, enabled?, reconnect?}; 400 з fields при відмові, 409 SETTING_VERSION_CONFLICT або SETTING_RECONNECT_REQUIRED, 503 SETTINGS_KEY_MISSING |
POST /settings/:group/:code/import | тіло {version}: імпорт змінних середовища, значення не повертаються |
POST /settings/:group/:code/test | результат перевірки нижче; агентів не створює і модель не запускає, якщо для цього немає окремої явної кнопки |
POST /settings/:group/:code/reconnect | {removed, setting} |
GET /settings/:group/:code/audit | хто які поля змінював, ніколи значення |
POST /settings/rotate | необов'язковий, єдиний маршрут поза group/code: перезапечатати всі секрети поточним SETTINGS_KEY після ротації; якщо у продукту він є — саме такий |
Типи відповідей — admin/slices/setting/domain/setting.types.ts Shiffty: ISetting, ISettingField, ISettingCheck, ISaveSetting і SecretOperation з ключем op.
Форма результату перевірки
{
"at": "2026-10-15T09:00:00.000Z",
"mode": "organization",
"ok": true,
"checks": {
"api": { "status": "ok", "detail": "…" },
"provisioning": { "status": "ok", "detail": "…" },
"chat": { "status": "skipped", "detail": "…" },
"mcp": { "status": "ok", "detail": "…" },
"mcpEndToEnd": { "status": "skipped", "detail": "…" }
},
"note": "…"
}Кожна перевірка — ok, failed або skipped зі зрозумілим людині detail. П'ять аспектів розрізняються й ніколи не видають мережеву відповідь за весь сценарій: MCP end to end доводить лише підготовлена крамниця.
Адміністративний інтерфейс
Один слайс setting: store з fetchSettings, saveSetting, importSetting, testSetting, reconnectSetting, fetchAudit; одна generic-картка групи, що рендерить поля з реєстру (admin/slices/setting/components/setting/group/Card.vue Shiffty); CHECK_LABELS для п'яти аспектів. Жодних захардкоджених шляхів на одну групу і жодного власного логіну в store.
Один каркас MCP
POST /mcp, Streamable HTTP, stateless. Bearer — credential агента; грант розмови надходить у заголовку X-SD-Context. Без облікових даних або з хибними: 401 з WWW-Authenticate: Bearer. Будь-який інший метод: 405. JSON-RPC batch: 400. Слайси — mcp/server, mcp/policy, mcp/grant і mcp/credential. Між продуктами відрізняються лише таблиця інструментів і політика виклику. Режим fake живе в setup/agentfy/fake і ходить у той самий /mcp.
Профіль агента
Один тип, IAgentfyProfile: {name, instructions, skill: {name, description, body}, modelId?, mcp: {url, requiredTools, trustedContext: true}}, у файлі agent/<product>Provision/domain/<product>Profile.ts поруч із PROFILE_REVISION і REQUIRED_TOOLS (у Shiffty: agent/orgProvision/domain/storeAgentProfile.ts). Провіжинінг заморожує профіль в intent. Коли PROFILE_REVISION підвищують, профіль оновлюється на місці через PUT /v1/orgs/{org}/operations/{operationId}/profile {expectedVersion, profile} Agentfy (AGNT2-477), без перестворення агента; profileRevision зберігається в intent, а невдале оновлення GET /stores/:id/agent показує як profileUpdateError, поки агент працює далі на попередньому профілі. modelId береться з налаштування.
Агенти кожної компанії, а не лише демо (рішення власника, 23 жовтня 2026). Досі агент отримував новий профіль лише тоді, коли хтось запускав його провіжинінг, і компанія, якої ніхто не торкався, лишалася на старому (23 жовтня 2026 асистент реальної компанії лишився на ревізії власника 4 після виходу ревізії 5 і далі казав, що не може створити магазин). Тепер API Shiffty розгортає профіль сам: приблизно за 10 секунд після старту, а далі щогодини він знаходить кожного готового агента зі старою ревізією — у схваленій і активній компанії та в активному магазині — і оновлює його на місці, по одному, під тією ж орендою компанії, що й кнопка підключення в людини. Він ніколи не створює, не підхоплює й не виводить агентів з роботи. Відхилене оновлення записується в profileUpdateError і повторюється під час наступного запуску; агент працює далі на старому профілі. В адмінці у схваленої компанії в розділі Requests видно її асистентів із ревізією профілю відносно поточної, останню помилку та кнопку Update now. Локальна робоча копія робить це лише з AGENTS_CONNECT=1, як і підключення агентів демо. Перевірено на Agentfy в пам'яті й один раз із локальним; не розгорнуто.
Що може відрізнятися між продуктами
Лише це: набір MCP-інструментів і політика їх виклику; текст профілю агента (name, instructions, skill); провіжинінг і чат як продуктові слайси. Усе інше вище однакове.
Що означає «готово»
Тікет цієї серії готовий, коли: реєстр містить вісім полів із назвами та змінними середовища з таблиці, буквально; пошук за старими назвами нічого не знаходить; GET /settings віддає agent/agentfy в описаній формі; адмін-форма зберігає, імпортує та перевіряє через generic-маршрути; POST /mcp відповідає як описано; провіжинінг і чат проходять end-to-end локально в режимі fake; а в режимі organization проти локального Agentfy провіжинінг доходить до ready і асистент відповідає в чаті. Звіт відкривається поясненням для того, хто не відкривав репозиторій, перелічує виконані перевірки з результатами й каже, що не перевірено.
Не вирішено
- Яку мовну модель використовувати в production. Налаштування
modelId(за замовчуванням порожнє) називає одну в межах схваленої політики; порожнє залишає вибір першій дозволеній моделі Agentfy. Shiffty залишає його порожнім. - Що агентові повідомляють про магазин на початку розмови, а що він мусить щоразу запитувати.
- Чи використовує Agentfy демо, заплановане на 18 жовтня. Ця сторінка не змінює план.
Куди далі
- Інструменти агента: каталог, його рівні та план.
- Агент і розв'язувач: що рахує графік за інструментами.
- Структура даних: де записано агента, розмови та гранти.
- Екрани: два екрани асистента, 13 і 16, і що вкладка Assistant показує сьогодні.
- Відкриті питання: що вирішено, а що ні.