Знакът на КАГАМИ КАГАМИ
kagami.bg/academy · lesson · machine-readable viewVERIFIED 2026-10-01 · UPDATED 2026-10-01
IDENTITY
module
n8n-03 · AI Agent node with Ollama
series
n8n · lesson 3 of 10
level
Intermediate
duration
about 1 h
prerequisites
n8n 1 and 2; DevStation 2 (Ollama on the host with a pulled chat model) and 3 (n8n in Docker Compose)
trust_label
VERIFIED 2026-10-01 (against docs.n8n.io for n8n 2.x, the Ollama library pages and docs.ollama.com) · UPDATED 2026-10-01 · NOT TESTED end to end (no running n8n or Ollama during the check)
versions
n8n 2.41.x stable · Ollama 0.35.x · models with the tools badge: qwen2.5:7b, qwen3:8b, llama3.1:8b, llama3.2:3b
language
human view: bg · english edition: /en/academy/n8n/ (lesson 3)
previous / next
n8n 02 · Webhook and HTTP Request nodes / n8n 04 · Working with files and folders
PURPOSE

Build an AI Agent in n8n that runs on a local Ollama model: connect the Ollama Chat Model sub-node from a containerised n8n, choose a model that supports tool calling, give the agent memory (Simple Memory) and tools (HTTP Request, Custom Code, Postgres), and return a fixed JSON shape with the Structured Output Parser. Keep human approval for tools with real effect.

KEY CONCEPTS
COMMANDS / PATHS
CHECKLIST
NEXT MODULE

n8n 04 · Working with files and folders · read and write files, watch folders, process PDF, CSV and JSON · also: Quick experiment, see kagami.bg/stalbata/

SOURCES
TAGS
n8nai-agentollamatool-callingmemorystructured-outputpostgreslocal-llm
ПРОВЕРЕНО · 01.10.2026 ОБНОВЕНО · 01.10.2026

AI агент в n8n с локален модел през Ollama

В n8n можеш да сложиш агент — възел, който сам решава кой инструмент да извика, помни разговора и отговаря с модел от твоята машина. Тук го свързваме с Ollama, даваме му памет и три инструмента, а накрая го караме да връща точна структура вместо свободен текст.

⏱ около 1 ч Средно n8n · Обучение 3/10 AI Agent · Ollama · инструменти · памет
n8n · AI Agent нод🔒 локално Ollama Chat Model (моделът)🔒 локално Инструменти: Code · Postgres🔒 локално Инструмент HTTP Request към външна услуга🌐 глобален Библиотеката ollama.com (само теглене)🌐 глобален
🔄
ОБНОВЕНО · 01.10.2026 — какво
Моделите в стария урок не съществуваха. Там се ползваха qwen3:80b и llama3.2:8b — в библиотеката на Ollama qwen3 има размери от 0.6b до 235b (без 80b), а llama3.2 е само 1b и 3b. Заменени са с модели, които днес носят значката tools: qwen2.5:7b, qwen3:8b, llama3.1:8b, llama3.2:3b. В n8n 2.x се промениха имената: „Window Buffer Memory“ е вече Simple Memory; настройката „Agent Type“ е остаряла от версия 1.82.0 — всеки AI Agent нод работи като Tools Agent (старата версия на нода се маха в n8n 3.0). Добавено е изискването агентът да има поне един инструмент. Добавена е важна настройка на Ollama: без промяна контекстът е само 4k при видеокарти под 24 GiB, а документацията препоръчва за агенти поне 64000 (в рамките на тавана на модела). Съветът „намали температурата срещу безкрайни цикли“ е допълнен с Max Iterations; махната е несъществуващата опция „Request Timeout“; примерът с имейл е опростен до съобщение и IF; добавени са $fromAI(), Postgres Chat Memory, защита с потребител само за четене и одобрение от човек за инструменти. Махнати са имена, адреси и названия на машини — остава ясна конфигурация с host.docker.internal.
⚠️
Какво не сме пускали сами
При проверката нямахме работещи n8n и Ollama. Настройките са сверени с документацията на n8n и Ollama към 01.10.2026, но не са тествани от край до край — затова няма етикет „ТЕСТВАНО“. Особено непроверени са: как точно модел като qwen2.5:7b се справя с инструменти през Ollama Chat Model, името на изходното поле на веригата със структуриран изход и заявката към Postgres. Където има ⚠️, провери сам в панела Output.

01Какво ще научиш

02Преди да започнеш

⛔
Агент с инструменти = реални последици
Модел, който сам решава какво да извика, може да извика и грешното. Започни с инструменти само за четене; за всичко, което изпраща, трие или променя, ползвай одобрение от човек (стъпка 7).

03Стъпки

  1. Верига или агент

    n8n има два начина да пуснеш езиков модел. Защо е важно да ги различаваш? Защото веригата е предвидима и евтина, а агентът е гъвкав, но по-бавен и по-труден за контрол.

    ВъзелКакво правиПамет и инструментиПолзвай за
    Basic LLM ChainЕдин промпт → един отговор, по избор през парсер на изходаБез памет, без инструментиПревод, преформатиране, резюме, класификация по прост критерий
    AI AgentПолучава модел и инструменти, сам решава кои да извика и колко пътиИма памет и инструменти (поне един)Задачи на няколко стъпки: потърси, реши, извърши

    Съвет: ако задачата се решава с един промпт, започни с веригата. Агентът се оправдава, когато пътят до отговора не е известен предварително.

  2. Избери модел, който умее инструменти

    Агентът вика инструменти чрез „tool calling“ — моделът трябва да го поддържа. В библиотеката на Ollama 🌐 глобален такива модели носят значка tools. Към 01.10.2026 значката имат:

    МоделРазмер на файлаТаван на контекстаБележка
    qwen2.5:7b4.7 GB32KМоделът от предните уроци; добър за начало
    qwen3:8b5.2 GB40KНоси още значката thinking (разсъждава)
    llama3.1:8b4.9 GB128KДълъг контекст
    llama3.2:3b2.0 GB128KМалък — за слаби машини и бързи опити
    bash · в Ubuntu (WSL2)
    ollama pull qwen2.5:7b
    ollama list

    Без значката tools не очаквай агентът да работи с инструменти — ⚠️ не сме проверявали какво точно се случва. Изборът на модел е като избор на колега: по-малкият е бърз, но греши по-лесно. За агент започни от 7–8b.

    ⚠️
    Контекстът по подразбиране е малък
    Ollama по подразбиране отваря 4k контекст на видеокарти под 24 GiB и препоръчва за агенти поне 64000. Но всеки модел има таван (таблицата горе), а повече контекст значи повече памет. Практично: задай стойност в рамките на тавана и на видеопаметта си, например 32000 за qwen2.5:7b. Както в Обучение 2, променливите на сервиза стоят в override, не в ~/.bashrc.
    bash · override на сервиза
    sudo systemctl edit ollama
    # в редактора, под реда [Service]:
    #   Environment="OLLAMA_CONTEXT_LENGTH=32000"
    sudo systemctl daemon-reload && sudo systemctl restart ollama
  3. Свържи n8n с Ollama (credential)

    В n8n: Credentials → Create credential → Ollama. Има само едно задължително поле — Base URL. Ключ не ти трябва: полето „API key“ е само за Ollama зад прокси с автентикация (праща се като Bearer токен) — остави го празно.

    Къде работи n8nBase URL
    В Docker (Docker Desktop), Ollama на хостаhttp://host.docker.internal:11434
    В Docker на Linuxсъщото, но в compose има extra_hosts: "host.docker.internal:host-gateway" (вече е в стека от DevStation · Обучение 3)
    Директно на машината (не в контейнер)http://localhost:11434; при грешка ECONNREFUSED ::1 — http://127.0.0.1:11434

    Защо не localhost в контейнер? Вътре в контейнера localhost е самият контейнер. Провери от контейнера:

    bash · от папката на стека
    docker compose exec n8n wget -qO- http://host.docker.internal:11434/api/tags

    Трябва да видиш JSON със списък на моделите. Адресът е без /v1 — n8n говори с родния интерфейс на Ollama.

    ⚠️
    Контейнерът не стига до Ollama?
    Същата препоръка като в DevStation · Обучение 3: Ollama слуша само на loopback (безопасно), а промяната му се прави през sudo systemctl edit ollama и се придружава от затваряне на порта в защитната стена за всички освен собствената машина. Прочети предупреждението там, преди да пипаш адреса за слушане.
  4. Първи тест: Basic LLM Chain

    Преди агента провери, че моделът отговаря. Workflows → Create workflow → Manual Trigger → Basic LLM Chain. В промпта избери Define below и напиши примерно Обясни накратко какво е агент. Отговори на български. Към веригата закачи под-възела Ollama Chat Model: твоят credential и моделът qwen2.5:7b (списъкът с модели се тегли от твоя Ollama; ⚠️ страницата на нода в документацията още показва стари имена на Llama 2 — не им вярвай).

    настройки · Ollama Chat Model
    Model: qwen2.5:7b
    Options:
      Sampling Temperature: 0.2   # ниско = по-предсказуемо
      Top K / Top P: по подразбиране

    Натисни Execute workflow. Отговорът е в панела Output — обикновено в полето text (⚠️ виж как се казва при теб). Ако работи, основата е готова.

  5. AI Agent с памет

    Сега агентът. Започни нов работен процес: Chat Trigger → AI Agent. Към агента закачи три неща: Ollama Chat Model (същият credential), Simple Memory и поне един инструмент (следващата стъпка). Без инструмент възелът няма да тръгне.

    настройки · AI Agent
    Prompt: Connected Chat Trigger Node     # (или Define below)
    System Message:
      Ти си помощник на екипа. Отговаряй само на български, кратко и конкретно.
      Ползвай инструментите, когато ти трябва информация, която не знаеш.
      Ако не намериш отговора след 3 опита, отговори: "Не намерих информация."
      Днешна дата: {{ $now.toFormat('dd.MM.yyyy') }}
    
    Options:
      Max Iterations: 10             # по подразбиране; ограничава циклите
      Return Intermediate Steps: on  # за проверка кой инструмент е викан
    
    Ollama Chat Model:
      Model: qwen2.5:7b
      Sampling Temperature: 0.1      # ниско за работа с инструменти
    
    Simple Memory:
      Session Key: по подразбиране за чата
      Context Window Length: 10      # последните 10 размени
    💡
    Как работи паметта — и докъде стига
    Simple Memory пази последните разговори, за да може агентът да отговори на „а кога?“ след предишен въпрос. Това е памет за сесията — не се запазва между сесии и документацията не препоръчва възела при n8n в режим на опашка. За по-трайно пазене има Postgres Chat Memory (сам създава таблица; задай отделен Session Key за всеки разговор). Веригата (стъпка 1) няма памет изобщо. Ако Simple Memory дава грешка, махни го и го добави наново — често идва от стара версия на възела.

    Отвори чата на нода и попитай: Казвам се Мария. Как се казвам? Ако агентът отговори правилно, паметта работи.

  6. Три инструмента

    Инструментите са „ръцете“ на агента. Най-важното е описанието — моделът чете именно него, за да реши кога да извика инструмента. Пиши го като инструкция на колега: какво прави и какво да му подаде.

    а) HTTP Request 🌐 глобален — външна услуга

    Добави HTTP Request като инструмент към агента. Параметрите могат да се попълват от модела чрез $fromAI() — там „ключът“ е подсказка, не връзка към поле.

    настройки · HTTP Request (инструмент)
    Description: Взема кратка прогноза за времето за град. Подай името на града.
    Method: GET
    URL: https://wttr.in/{{ $fromAI('city', 'Име на града', 'string') }}?format=3

    Внимание: това е външна услуга — името на града излиза от машината ти. За чувствителни данни ползвай само локални инструменти.

    б) Custom Code 🔒 локално — малък код

    Инструмент с твой код, JavaScript или Python. Входът на инструмента е в променливата query; връщаш текст. ($fromAI() тук не работи — входът е само query.)

    Custom Code (JavaScript)
    // Description: Брои думите в подаден текст. Входът е самият текст.
    const words = String(query).trim().split(/\s+/).filter(Boolean);
    return String(words.length);

    в) Postgres 🔒 локално — справка в база

    Добави Postgres като инструмент: операция Execute Query. Заявката е с $1, а стойността идва от модела. n8n обезопасява параметрите на заявката срещу SQL инжекция.

    настройки · Postgres (инструмент)
    Description: Търси контакт по име или имейл. Подай част от името или имейла.
    Operation: Execute Query
    Query:
      SELECT name, email, company
      FROM contacts
      WHERE name ILIKE '%' || $1 || '%'
         OR email ILIKE '%' || $1 || '%'
      LIMIT 5;
    Options → Query Parameters:
      {{ $fromAI('query', 'Име или имейл за търсене', 'string') }}
    ✅
    Потребител само за четене, отделна база
    Credential-ът за този инструмент да е на потребител с права само SELECT върху нужната таблица, в отделна база — не в базата на самия n8n. Тогава и най-лошата грешка на модела не може да промени данни. ⚠️ Заявката не е пускана от нас; провери таблицата и имената на колоните при себе си.
  7. Човек одобрява опасното

    Когато даваш инструмент с реален ефект (изпраща съобщение, променя запис, трие), моделът не бива да го вика сам. n8n има Human-in-the-loop за инструменти: в панела Tools на агента добавяш стъпка „Human review“ и канал за одобрение (чат на n8n, Slack, Telegram, Gmail и др.), после закачаш рисковите инструменти към нея. При такова викане работният процес спира и чака „Approve“ или „Deny“ от човек; при отказ действието не се изпълнява. Подробности — в документацията на n8n (връзката е в „Източници“). ⚠️ Наличността на функцията зависи от твоята версия на n8n — провери в панела.

  8. Структуриран изход: отговор с точна форма

    Защо? Свободният текст не може да се прати на следващ възел. Когато искаш полета (категория, приоритет), моделът трябва да върне JSON по твоя схема. На веригата или агента включваш Require Specific Output Format и закачаш Structured Output Parser. Схема можеш да зададеш по два начина: Generate from JSON Example (n8n взема имената и типовете; всички полета стават задължителни) или Define using JSON Schema (ръчно; $ref не се поддържа).

    Structured Output Parser · схема (JSON Schema)
    {
      "type": "object",
      "properties": {
        "category": { "type": "string", "enum": ["urgent", "normal", "low", "spam"] },
        "sentiment": { "type": "string", "enum": ["positive", "neutral", "negative"] },
        "summary": { "type": "string", "description": "Резюме в едно изречение" },
        "action_required": { "type": "boolean" }
      },
      "required": ["category", "sentiment", "summary", "action_required"]
    }

    Пример: класификатор на съобщения. Manual Trigger → Edit Fields (Set) с поле message (примерен текст) → Basic LLM Chain с парсера → IF, който праща спешните по друг клон.

    Basic LLM Chain · промпт (Define below)
    Анализирай следното съобщение и го класифицирай.
    
    Съобщение: {{ $json.message }}
    
    Върни резултат по зададената схема.

    След веригата провери в панела Output къде са полетата — обикновено под output (⚠️ не сме го пускали), например {{ $json.output.category }}. В IF сравни категорията с urgent.

    💡
    Когато моделът греши формата
    Малките модели понякога връщат невалиден JSON. В документацията на n8n има и Auto-fixing Output Parser, предвиден за поправяне на невалиден изход (⚠️ не сме го пускали). По-голям модел също помага.
  9. Когато нещо не върви

    ❌
    Агентът зацикля в повиквания на инструменти
    Остави Max Iterations на разумна стойност (по подразбиране 10), държи температурата ниска, направи описанията на инструментите по-ясни и добави в системното съобщение кога да спре („след 3 неуспешни опита отговори, че не си намерил“). Включи Return Intermediate Steps, за да видиш какво вика.
    ❌
    Агентът не вика инструмент или вика грешно
    Най-вероятно моделът няма значка tools, е твърде малък, или контекстът е препълнен от описанията (виж стъпка 2). ⚠️ Това е наша преценка, не е от документацията — пробвай модел от таблицата и по-голям контекст.
    ❌
    „400 Invalid value for 'content': expected a string, got null“
    В промпта има израз, който не дава стойност. Провери, че полетата, които ползваш, съществуват. При Connected Chat Trigger Node махни празните стойности от chatInput.
    ❌
    „No prompt specified“ или „A Chat Model sub-node must be connected“
    Първото: смени Prompt от „Connected Chat Trigger Node“ на „Define below“ (когато не идва от Chat Trigger). Второто: към нода не е закачен модел — използвай бутона + Chat Model.
    ❌
    Първата заявка е бавна или изтича времето
    При първата заявка моделът се зарежда в паметта. Виж с ollama ps дали е зареден и дали е върху видеокартата (Обучение 2); пробвай по-малък модел за тестове.
    ❌
    Не се свързва с Ollama
    Виж стъпка 3: host.docker.internal в контейнер, без /v1, и за грешка с ::1 — адресът 127.0.0.1 (когато n8n не е в контейнер).

04Проверка

Чеклист

Тест

1. n8n работи в Docker Desktop, а Ollama — на твоята машина. Какъв е Base URL в credential-а?

2. Каква е разликата между Basic LLM Chain и AI Agent?

3. Какво показва значката „tools“ на модел в библиотеката на Ollama?

4. Защо инструментът за Postgres да ползва потребител само за четене, в отделна база?

05Какво следва

06Източници

  1. n8n: AI Agent · Tools Agent · чести проблеми — остарялата настройка „Agent Type“, Max Iterations, грешките с промпта.
  2. n8n: Ollama Chat Model · чести проблеми (Docker, host.docker.internal, ::1) · credential за Ollama.
  3. n8n: Simple Memory · Postgres Chat Memory.
  4. n8n: Basic LLM Chain · Structured Output Parser.
  5. n8n: Custom Code Tool · Postgres · HTTP Request като инструменти.
  6. n8n: Use AI for parameters ($fromAI()) · Human-in-the-loop for tools.
  7. Ollama: дължина на контекста 🔒 локално — стойности по подразбиране и препоръка за агенти.
  8. Библиотеката на Ollama 🌐 глобален: qwen2.5 · qwen3 · llama3.1 · llama3.2 — значка „tools“, размери и таван на контекста.