Налаштування Cordis
Вбудований рушій Cordis/DSH налаштовується двома документами та змінними середовища. Типово документи лежать поруч із backend; LIBRE_CORDIS_CONFIG та LIBRE_CORDIS_SETTINGS змінюють їхнє розташування.
| Документ | Власник | Структура | Призначення |
|---|---|---|---|
cordis.patch.yml | Cordis Loader | YAML-масив верхнього рівня | Рядки плагінів, що монтують рушій |
cordis.config.yml | Хост Libre WebUI | YAML-мапа | Провайдер, джерело облікових даних, перемикачі можливостей |
Потрібні два документи, бо носій дерева Cordis Include читає саму композицію й відхиляє файли, що не є масивом верхнього рівня. Налаштування хоста не можуть бути в тому самому файлі.
Увімкнення
Адміністратор вмикає рушій у Налаштування → Керування користувачами → Доступ і політики → Рушій Cordis. Зміна діє відразу: увімкнення запускає рушій під час наступного запиту, вимкнення звільняє його. Перезапуск не потрібен.
Два джерела рівня розгортання можуть зафіксувати значення. Вони блокують перемикач, а не дозволяють непомітно його перевизначити:
| Джерело | Дія |
|---|---|
Змінна LIBRE_CORDIS_ENABLED | true/false фіксує стан у розгортанні |
features.enabled у cordis.config.yml | Явне значення фіксує стан; без ключа рішення приймає адміністратор |
Рушію також потрібна композиція. Почніть із комплектних прикладів:
cd backend
cp cordis.patch.example.yml cordis.patch.yml
cp cordis.config.example.yml cordis.config.yml
Хост читає cordis.patch.yml, додає власні типові значення до рядка моста й записує результат у <DATA_DIR>/cordis-runtime/cordis.composed.yml. Цей згенерований файл можна відтворити й не слід редагувати. Джерелом істини є операторський cordis.patch.yml.
cordis.config.yml
trace: false
model:
provider: libre-webui
# Empty selects the authenticated caller's configured default/fallback route.
model: ''
features:
# Omit enabled to let the administrator use the Settings toggle.
streaming: true
tools: true
persistence: true
# Optional absolute paths; defaults live under Libre WebUI's data directory.
# workspacePath: /absolute/path/to/workspace
# sessionStorePath: /absolute/path/to/sessions
Ключі верхнього рівня
| Ключ | Тип | Типово | Значення |
|---|---|---|---|
trace | логічний | false | Записувати кожен перехід активації Cordis |
model | мапа | – | Вибір адаптера моделі; дивіться нижче |
features | мапа | – | Перемикачі можливостей; дивіться нижче |
features
| Ключ | Тип | Типово | Значення |
|---|---|---|---|
enabled | логічний | false | Монтувати рушій. За false кожен маршрут повертає 503 |
streaming | логічний | true | Приймати ходи з потоковою відповіддю моделі |
tools | логічний | true | Дозволити інструменти рушія та показувати їхній реєстр |
persistence | логічний | true | Увімкнути JSONL-збереження й вимагати його сервіс, щоб сеанси переживали перезапуск |
features.enabled є єдиним перемикачем, потрібним для ввімкнення моста. Ключ enabled на верхньому рівні не читається. Усі перемикачі зібрані в features, щоб стан можливостей можна було перевірити в одному місці.
model
| Ключ | Тип | Типово | Значення |
|---|---|---|---|
provider | рядок | libre-webui | libre-webui, deepseek, pi-ai або none |
apiKeyEnv | рядок | OPENAI_API_KEY | Назва змінної середовища з ключем |
route | рядок | libre-webui | Маршрут провайдера, який рушій указує в запитах |
model | рядок | '' | ID потрібної моделі. Для ручного маршруту обов’язково задайте |
baseUrl | рядок | '' | Перевизначення endpoint; порожнє значення використовує типовий endpoint адаптера |
providers | мапа | {} | Ручні маршрути провайдерів, індексовані за назвою |
Звідки рушій отримує моделі
Рушій не має власних налаштувань провайдерів. Він звертається до наявних провайдерів Libre WebUI через маршрут libre-webui, зареєстрований рядком libre-webui-llm-adapter. Усе, з чим можна спілкуватися в UI, доступне рушію: завантажте модель через інтерфейс, і рушій побачить її з уже налаштованими ключами та endpoint.
Для цього задайте model.provider: libre-webui. Це комплектне типове значення; облікові дані та endpoints залишаються в наявних налаштуваннях Libre WebUI.
model указує потрібну модель. Порожнє значення означає типову модель застосунку. Якщо її немає, рушій бере першу модель чату від шару провайдерів, надаючи перевагу доступним локальним моделям. Моделі embeddings виключено. Внутрішній маршрут зберігає і провайдера, і модель: lwui:ollama:<encoded-model> або lwui:plugin:<encoded-provider>:<encoded-model>. Це не дозволяє збігу назв чи збою Ollama перенаправити локальний запит до віддаленого провайдера. Явно вибраний недоступний провайдер спричиняє помилку без мовчазної заміни.
Порожній model безпечний лише для libre-webui. Маршрут пакета провайдера потребує явного вибору: dsh-llm-pi-ai читає каталог для запитів списку, але не обирає перший запис автоматично. Тому ручний маршрут без model не обслуговує жодного ходу й повертає:
provider "<route>" resolves no models; the installed catalog does not describe
this route, so its models must be listed in configuration
Задайте model як ID зі списку models цього маршруту. Комплектний приклад поєднує route: ollama з model: llama3.2, що відповідає оголошеному llama3.2.
provider вибирає пакет адаптера для монтування:
libre-webuiобслуговує рушій власним шаром провайдерів розгортання. Це підтримуваний і типовий режим.noneзапускає рушій без моделей. Список інструментів і сеанси працюють, але відповідей на ходи немає; це зручно для перевірки композиції.deepseekтаpi-aiмонтують пакет провайдера безпосередньо. Ці пакети не є залежностями backend: усі SDK разом додавали 59 транзитивних пакетів, включно із застарілими для можливостей, яких рушій не використовує. Встановіть потрібний пакет і додайте його рядок у композицію. Якщо пакета бракує, хост назве його.
Маршрут провайдера описується так:
| Поле | Значення |
|---|---|
displayName | Зрозуміла людині назва |
api | Протокол обміну, наприклад openai-completions |
baseURL | Базовий endpoint |
apiKeyEnv | Змінна середовища з ключем |
models | Список моделей; кожен запис має id, name, contextWindow, maxTokens |
Облікові дані ніколи не записуються в ці документи. apiKeyEnv називає змінну середовища, яку адаптер читає для кожного запиту, тож ротація ключа не потребує перезапуску.
cordis.patch.yml
Масив записів Cordis Loader верхнього рівня. Комплектний приклад монтує дев’ять рядків і є рекомендованим початком.
- id: llm
name: '@deepseek-ai/dsh-llm'
- id: session
name: '@deepseek-ai/dsh-session'
- id: session-projection
name: '@deepseek-ai/dsh-session-projection'
- id: session-persistence
name: '@deepseek-ai/dsh-session-persistence-jsonl'
config:
# The host supplies the resolved sessionStorePath.
- id: system-prompt
name: '@deepseek-ai/dsh-system-prompt'
config:
personaPrefix: ''
- id: tools
name: '@deepseek-ai/dsh-tools'
- id: agent
name: '@deepseek-ai/dsh-agent'
- id: agent-loop
name: '@deepseek-ai/dsh-agent-loop'
config:
agents: []
- id: libre-webui-bridge
name: './dist/cordis/dsh/engine-plugin.js'
Поля записів
| Поле | Обов’язкове | Значення |
|---|---|---|
id | ні | Сталий ID для адресації рядка; без нього використовується name |
name | так | Специфікатор модуля для імпорту; має бути рядковим літералом |
config | ні | Налаштування плагіна; дозволені вирази !!js |
disabled | ні | Пропустити рядок без видалення; дозволено !!js |
inject | ні | Додаткові обов’язкові сервіси або налаштування перехоплення рядка |
Loader безпосередньо імпортує name і ніколи його не обчислює, тому !!js тут не допускається. Значення config можуть використовувати !!js: вони обчислюються пізніше у файбері рядка з доступом до контексту Loader. process.env та ctx.get(...) працюють, import.meta ні.
Відносні специфікатори обчислюються від каталогу самого файла композиції. Специфікатори пакетів вирішуються через backend, тому @deepseek-ai/dsh-tools знаходить копію в backend/node_modules.
Порядок рядків не визначає порядок завантаження. Cordis активує рядок після появи оголошених сервісів; наведене групування потрібне лише для читання.
Обов’язкові рядки
Щоб відповідати в чаті, рушію потрібні всі ці записи:
| Рядок | Надає | Потрібний для |
|---|---|---|
dsh-llm | llm | циклу агента |
dsh-session | sessions | циклу агента, моста |
dsh-session-projection | sessionProjections | циклу агента |
dsh-system-prompt | systemPrompt | інструментів, циклу агента |
dsh-tools | tools | циклу агента, моста |
dsh-agent | agents | моста |
dsh-agent-loop | драйвер агента | відповідей на ходи |
| рядок моста | libreDshEngine | кожного маршруту |
Щоб GET /api/cordis/tools щось повертав, змонтуйте також плагіни інструментів, наприклад @deepseek-ai/dsh-fs-sandbox та @deepseek-ai/dsh-tool-fs. Реєстр без плагінів інструментів закономірно порожній.
Змінні середовища
Кожне налаштування має перевизначення через середовище. Змінна має перевагу над документом, а документ над вбудованим значенням.
| Змінна | Перевизначає | Типово |
|---|---|---|
LIBRE_CORDIS_ENABLED | features.enabled | false |
LIBRE_CORDIS_STREAMING | features.streaming | true |
LIBRE_CORDIS_TOOLS | features.tools | true |
LIBRE_CORDIS_PERSISTENCE | features.persistence | true |
LIBRE_CORDIS_TRACE | trace | false |
LIBRE_CORDIS_MODEL_PROVIDER | model.provider | libre-webui |
LIBRE_CORDIS_MODEL_ROUTE | model.route | libre-webui |
LIBRE_CORDIS_MODEL | model.model | '' |
LIBRE_CORDIS_API_KEY_ENV | model.apiKeyEnv | OPENAI_API_KEY |
LIBRE_CORDIS_BASE_URL | model.baseUrl | '' |
LIBRE_CORDIS_CONFIG | Шлях документа композиції | <cwd>/cordis.patch.yml |
LIBRE_CORDIS_SETTINGS | Шлях документа налаштувань | поруч із документом композиції |
LIBRE_CORDIS_WORKSPACE | Типовий робочий простір рушія | <DATA_DIR>/cordis-workspace |
LIBRE_CORDIS_SESSION_STORE | Каталог збережених сеансів | <DATA_DIR>/cordis-sessions |
Логічні змінні приймають 1/true/yes/on і 0/false/no/off. Нерозпізнане значення повертає вибір до документа без вгадування.
LIBRE_CORDIS_SESSION_STORE та LIBRE_CORDIS_WORKSPACE також читаються у виразах !!js комплектної композиції, тому хост експортує їх перед монтуванням дерева.
Приклади налаштування
Локальний Ollama, повністю офлайн
features:
enabled: true
model:
provider: pi-ai
route: ollama
model: llama3.2
apiKeyEnv: OLLAMA_API_KEY
providers:
ollama:
api: openai-completions
baseURL: http://127.0.0.1:11434/v1
apiKeyEnv: OLLAMA_API_KEY
models:
- id: llama3.2
contextWindow: 131072
maxTokens: 4096
Ollama ігнорує ключ, але клієнт OpenAI вимагає його наявності. Експортуйте OLLAMA_API_KEY=ollama, щоб задовольнити вимогу без створення секрету. Ніщо не залишає комп’ютер.
Шлюз, сумісний з OpenAI
features:
enabled: true
model:
provider: pi-ai
route: gateway
model: acme-large
apiKeyEnv: ACME_GATEWAY_API_KEY
providers:
gateway:
displayName: Acme Gateway
api: openai-completions
baseURL: https://gateway.acme.example/v1
apiKeyEnv: ACME_GATEWAY_API_KEY
models:
- id: acme-large
contextWindow: 65536
maxTokens: 4096
Офіційний DeepSeek
features:
enabled: true
model:
provider: deepseek
route: deepseek
apiKeyEnv: DEEPSEEK_API_KEY
Задайте DEEPSEEK_API_KEY у середовищі backend.
Без провайдера, лише інструменти
features:
enabled: true
model:
provider: none
Рушій запускається, можна створювати сеанси, а GET /api/cordis/tools перелічує налаштовані плагіни. Надсилання повідомлення завершується помилкою, бо жоден адаптер не може обробити запит.
Примітки щодо міграції
Міст Cordis є додатковою функцією. Типово його вимкнено, і в цьому стані наявна поведінка не змінюється.
Оновлення наявного розгортання. Нічого робити не потрібно. Приклади постачаються як cordis.patch.example.yml та cordis.config.example.yml й не читаються, доки ви їх не скопіюєте та не ввімкнете функцію. Міграції не запускаються, таблиці не створюються, наявний каталог даних не змінюється.
Перше ввімкнення. Скопіюйте обидва приклади й задайте features.enabled: true. Додаткові пакети не потрібні: рушій уже є залежністю backend. Перший запит створює <DATA_DIR>/cordis-workspace, <DATA_DIR>/cordis-sessions та <DATA_DIR>/cordis-runtime. Усі три лежать у наявному каталозі даних, тож його резервне копіювання та відновлення охоплюють їх також.
Оновлення рушія. Точні версії записані в package-lock.json, а backend/package.json задає alpha-сумісні діапазони. Оновлюйте свідомо й перевіряйте контракти провайдера та сеансів після npm install. Нову peer-залежність npm повідомляє під час встановлення, а не монтування. Формати моделей і сеансів належать DSH; їх зміни описуються в релізі DSH, а не в міграції Libre WebUI.
Відкат. Задайте features.enabled: false і перезапустіть або видаліть рядок моста з cordis.patch.yml. Сервіс libreDshEngine вилучається, обробник звільняється, створені агенти знищуються. Файли сеансів лишаються даними на диску; видаліть каталог sessionStorePath, щоб звільнити місце. Видаляти пакети необов’язково, інші можливості Libre WebUI від цього не залежать.
Наявні Chat і Work. Chat отримує адміністративний вибір DeepSeek Harness із тимчасовими сеансами рушія й наявною історією Chat. Work отримує окремий рушій DeepSeek Harness з ізольованим драйвером і поточними пісочницею та погодженнями. Раніше вибрані моделі працюють як завжди.
Зі стандартним адаптером libre-webui вибір агентів Chat містить явні пари провайдера й моделі DSH та базовий профіль. Явний вибір зберігає уточнену ідентичність провайдера, а базовий використовує типову модель працюючої композиції. Заголовки й підсумки міркувань звертаються прямо до провайдера без інструментів агента. Користувацький адаптер залишає лише базовий пункт Chat і потребує окремої моделі Ollama чи плагіна для цих допоміжних запитів.
DSH поважає перемикач Ollama адміністратора. Якщо Ollama вимкнено, моделі не перелічуються й не перевіряються, а явний вибір Ollama завершується помилкою без заміни. Неуточнені назви, зафіксовані оператором, також потребують каталогу Ollama для безпечного визначення. Для розгортання лише з плагінами використовуйте lwui:plugin:<plugin>:<model>.
Операційні межі
- Хостовий рушій і Chat доступні лише адміністраторам у solo. Сторінка рушія є спільною консоллю з локальним JSONL; вона не монтується в team. Work у пісочниці використовує наявні SQL-репозиторії.
- Модель викликається від імені автентифікованого користувача. Інтерактивні ходи використовують його облікові дані та типову модель. Довірена неінтерактивна композиція може явно задати ID активного адміністратора в
LIBRE_CORDIS_USER. Прихованого вибору найстарішого адміністратора немає. - Файлові інструменти хоста обмежені робочим простором. Читання й запис перевіряють канонічний шлях; сеанс не може обрати каталог поза коренем. Нативні обмеження змін DSH зберігаються. Додаткові операторські плагіни є довіреним кодом сервера.
- Хостові інструменти використовують політики DSH. Сторінка надає режими читання й запису для кожного сеансу та картки разового погодження, які не обходять межу простору. Chat без інтерфейсу відхиляє погодження, які не може показати. Драйвер Work використовує його погодження й контейнерну ізоляцію без файлових інструментів хоста.
- Потоки містять живий текст і відкрите міркування. Збережені повідомлення утримують завершену розмову, не надсилаючи клієнту другу копію тексту.
- Перезапуск і видалення працюють зі збереженими сеансами. Порожні та завершені сеанси переживають перезапуски. Видалення JSONL-сеансу, створеного мостом, зупиняє його запис і прибирає файл. Іншим реалізаціям потрібний відповідний адаптер видалення.
- Старі некоректні журнали потребують явного виправлення. Раніше повідомлення записувалися без обов’язкових ID. Суворий читач відхиляє журнал, а не викидає його. Процедуру наведено в Усуненні несправностей.
- Заголовки утворюються локально. Огляд сеансу використовує перше повідомлення людини як коротку назву; порожній сеанс її не має.
Підключення моделей із працюючого інстансу DSH
Необов’язковий плагін dsh-native-provider надає моделі та провайдерські з’єднання, уже налаштовані в іншому DSH, наприклад локальному вебзастосунку на порту 3080. Встановіть його в наявний профіль цього інстансу. Він викликає лише ctx.llm: ключі лишаються в DSH, а створення сеансів, запуск агентів, читання нативних вкладень та виконання нативних інструментів недоступні.
Обидва процеси мають працювати на одному Unix-хості під тим самим користувачем ОС. Використовується явно налаштований Unix-сокет із фізичним каталогом, що належить цій особі та має режим 0700; сокет має режим 0600. TCP-порт не відкривається, браузерна автентифікація DSH не перевикористовується й не послаблюється. Windows та віддалені хости DSH не підтримуються.
Межею локального доступу є користувач ОС: інші його процеси теж можуть використовувати сокет. З’єднання не створює окремих нативних облікових даних чи ізоляції між застосунками одного користувача.
Встановлення незалежного плагіна
У DSH → Plugins → Add plugin вставте публічну URL-адресу в Package name or address і натисніть Install:
https://github.com/libre-webui/dsh-native-provider
Увімкніть компонент, коли DSH запропонує. Публічний пакет має версію 0.1.1, ліцензію Apache-2.0 і містить готовий runtime та patch bundle. Локальна збірка, скрипти встановлення та npm-залежності виконання не потрібні. Назву @libre-webui/dsh-native-provider не опубліковано в npm: використовуйте GitHub URL.
Bundle обирає <DSH home>/lwui-provider/llm.sock, зазвичай $HOME/.dsh/lwui-provider/llm.sock. Налаштований DSH_HOME має перевагу. Приватний каталог створюється за потреби. Використовуйте один активний міст на домашній каталог DSH або перевизначте шлях у користувацькому cordis.patch.yml додаткових профілів. Повний шлях має вкладатися в 100 байтів UTF-8 і не містити символічних посилань. Перевизначення описано в окремому посібнику пакета.
Необов’язковий еквівалент через CLI:
dsh plugin --profile web add https://github.com/libre-webui/dsh-native-provider
Замість web укажіть фактичний профіль інстансу. Після встановлення через CLI перезапустіть його; встановлення через активний UI може ввімкнути плагін одразу. Дотримуйтеся повідомлень DSH про перезапуск. Код DSH змінювати й копіювати ключі не потрібно.
Підготовка bundle з Libre WebUI
Libre WebUI також містить скрипт підготовки. У checkout вихідного коду зберіть backend і підготуйте новий вихідний каталог:
npm run build:backend
node scripts/prepare-dsh-provider.mjs /absolute/dsh-provider-bundle /absolute/private-directory/provider.sock
dsh plugin --profile web add /absolute/dsh-provider-bundle
Дистрибутив npm уже має скомпільований backend і скрипт. У його каталозі виконайте останні дві команди без збірки, після чого перезапустіть обраний профіль DSH. Обидва способи відхиляють наявні вихідні каталоги й додають метадані пакета, ліцензію та інструкції.
Підключення Libre WebUI
Задайте в cordis.config.yml той самий абсолютний шлях сокета. Для типового публічного bundle замініть /absolute/home своїм домашнім каталогом:
nativeProvider:
socketPath: /absolute/home/.dsh/lwui-provider/llm.sock
Або задайте абсолютний шлях у LIBRE_DSH_PROVIDER_SOCKET. Порожнє значення вимикає з’єднання навіть за наявності шляху у файлі. Увімкніть Рушій Cordis у LWUI. Активні адміністратори зможуть вибирати нативні моделі в рушії DeepSeek Harness для Work, на сторінці рушія й у групі агентів Chat. У Chat також потрібно ввімкнути Моделі агентів CLI. Work зберігає початкові ID моделі й провайдера з providerType: dsh; попередні DSH-завдання через LWUI зберігають стару ідентичність та позначку рушія.
Каталог нативних моделей читається наживо. Зміни провайдера або ключів скасовують покоління з’єднання й поточні нативні виклики. Недоступний сокет, модель чи провайдер зупиняє запит без переходу на Ollama чи іншого постачальника. Заголовки та підсумки міркувань викликають обраний LLM напряму без інструментів. Початкова версія підтримує текст, міркування та повідомлення інструментів, але відхиляє посилання на нативні зображення й файли.
Ключі належать оператору DSH, тому з’єднання доступне лише адміністраторам, навіть якщо звичайний Work відкритий ширше. Налаштований провайдер може надсилати запити за межі хоста; Work показує повідомлення про віддалений сервіс. У team кожен worker, який обробляє такі завдання, потребує доступу до локального з’єднання; за його відсутності робота блокується. Вимкнення Cordis чи видалення шляху відкликає нативний доступ, не видаляючи завдань. Якщо DSH аварійно завершився й лишив сокет, зупиніть його інстанс і приберіть лише цей старий сокет перед перезапуском. Плагін не замінює наявні файлові об’єкти.
Оновлення або видалення плагіна
Перед зміною дочекайтеся завершення активних запитів або скасуйте їх. Для заміни старого локального bundle 0.0.0/0.1.0 у DSH UI оберіть Uninstall, поверніться до Add plugin і встановіть публічну GitHub URL вище. Користувацький шлях сокета збережіть через підтримуване перевизначення профілю. Нативні сеанси й облікові дані лишаються.
Установлений із GitHub пакет можна оновити через CLI:
dsh plugin --profile web update @libre-webui/dsh-native-provider
Після CLI-оновлення перезапустіть профіль і перевірте версію. Вимкнений раніше плагін залишається вимкненим, тож перевірте його стан перед тестуванням. Для фіксації чи відкату використовуйте github:libre-webui/dsh-native-provider#<commit>. Власні локальні bundles слід збирати в новому каталозі й додавати цей каталог повторно; оновлення локальної залежності не завантажує GitHub.
Щоб прибрати з’єднання, спочатку видаліть nativeProvider.socketPath у LWUI або встановіть порожній LIBRE_DSH_PROVIDER_SOCKET, потім виконайте:
dsh plugin --profile web remove @libre-webui/dsh-native-provider
Після видалення перезапустіть профіль DSH. Збережені завдання LWUI лишаються, але їхні нативні запити не виконуються до відновлення того самого явного з’єднання. Видалення плагіна не стирає провайдерів чи ключі DSH. Старі згенеровані каталоги прибирайте лише після того, як вони більше не встановлені.
Використання нативного провайдера
Нативні запити показуються у розділі Використання провайдерів як DeepSeek Harness · провайдер з оригінальною моделлю. Кожен реальний запит враховується один раз, включно з раундами інструментів, заголовками й підсумками. Панель показує успіхи, помилки, скасування, затримку та токени, які повідомив DSH. Кешований ввід додається до загального вводу один раз; відсутні дані не оцінюються й лишаються невиміряними. ID мають вигляд dsh-native:<percent-encoded-native-provider-id> для чинних правил тарифів і витрат. Невідомий тариф не оцінюється грошима.
Запити DSH через провайдерів LWUI залишаються в їхніх наявних записах. Читання каталогу й запити, відхилені до нативного виконання, не додають подій моделі. Вимірювання починається з установлення цієї версії; попереднє використання не вигадується. Зберігаються ідентичність, стан, час і лічильники, але не промпти, відповіді, ключі, endpoints чи тексти помилок провайдерів.
Перевірка налаштувань
curl -s http://127.0.0.1:3001/api/cordis/health | jq
{
"success": true,
"enabled": true,
"ready": true,
"services": [
{ "name": "llm", "state": "ready" },
{ "name": "systemPrompt", "state": "ready" },
{ "name": "sessions", "state": "ready" },
{ "name": "tools", "state": "ready" },
{ "name": "agents", "state": "ready" }
]
}
503 з code: CORDIS_UNAVAILABLE означає, що композиція не змонтувалася. Причина міститься в error; LIBRE_CORDIS_TRACE=true додає журнал активації Cordis. Типові причини наведено в Усуненні несправностей.