Шматагентны блогер на Mac без выдаткаў на API: Gemma 4, Ollama і Google ADK
Будуем лакальную сістэму з агентаў-планавальніка, аўтара і валідатара на Apple Silicon з Gemma 4 праз Ollama, LiteLLM і Google ADK без платы за кожны запыт.
Крыніцы: No API Costs: Building a Local Multi-Agent AI System with Gemma 4, Ollama, and Google ADK
Агент для планавання і напісвання можа працаваць цалкам на ноутбуку. Усё, што пасля, выкананае на Mac з процэсарам Apple Silicon без якіх-лібо платаў за кожны запіт: Gemma 4, які працюе пад кераваннем Ollama, кіт для развіцці агентаў Google (ADK), які керуе агентамі, і LiteLLM, які ўз’еднвае іх.
Мадэлі мов пераходзяць за межы фармата запыт-адказ. Аплікацыі, створаныя на ўсіх іх, аналізуюць цэль, складаюць план, запускаюць інструменты, оцінююць рэзультаты і перадаюць заведамення спецыялізаваным агентам. Большасць інструкцый для такіх сістэм апыляецца на платныя хмарныя API, што ўдобна, але прыносіць платы за выкарыстанне, неабходнасць керавання ключамі API, ліміты на выкарыстанне і пытанні пра тое, куды ідуць даны. Выкарыстанне локальных рашэнняў усунуе платаў на аснове токенаў. Аднак цэлкам не робіць вычысленні безкоштовным, адколі все ўсё такі ж вітрачаецца памяць, час працэсара, прыемліванне дадзеных і электрэчнасць.
Сістэма, якая ствараецца
Праект плануе, пішчырае і адзначае артыкул для тэхнічнага блогу. Пры заданым тэме ён вырахоўвае крокі, стварае структураваны план, пішчырае матэрыял і адзначае чэрнавік. Гэта розвівае два базовыя аспекты агентнага ІІ: разумаванне і дзеянне. Для выканання задачы вікорыстоўваецца пяць компонентаў:
- Агент-планавальнік, які стварае план статты.
- Агент-пераканальнік плану, які пераканаецца, чы рэалізаваны план адпавядае трэбаванням.
- Агент-пішчыраец, які ператварае затверджаны план у цэлую артыкул.
- Агент-адзначальнік статты, які адзначае структуру і тэхнічную яснасць.
- Корневы агент, які коордынуе весь працэс.
Дызайн створаны на адной з методыкаў Google — Build an AI Agent with Google ADK codelab, з аднай змянай: мадэль Gemini, якая раней была на хостынгу, заменена на Gemma 4, якая працуе локальна за дапамогою Ollama.
Выбір модэлі
Gemma 4 — гэта новая група адаптаваных модэляў ад Google DeepMind, якія падтрымляюць мультымадальны вхід, логічныя выводы, вікорыстанне інструментаў і кодаванне. У гэтай сістэме вікорыстоўваецца:
gemma4:e4b
Абявка E4B аднася да фактычнага колькіства параметраў, якія ўвесь час ўваходзяць у працю, і мае на мету забезпечыць вышэйшую ўстойчывасць без неабходнасці выкарыстоўвання кожнага параметра для кожнага вхіднага дадзенага. Размер версіі Ollama станавіць апошнія 9,6 ГБ і яна должна працаваць на Mac з 16 ГБ аб’еднанай памяці, хоць для іншых прыкладнікаў застане мало месца. Для апаратаў, у якіх ёсць проблемы з працэйнасцю, існуе меншая версія:
gemma4:e2b
Ён жэртвуе часткай якосцю аналізу зарады шырокаспектнасці і меньшага выкарыстоўвання памяці.
Апэліцыйныя прыстроі — гэта Apple M1 Pro з процэсарам на 10 ядраў, 16 ГБ аб’еднанай памяці, macOS, Python 3.13, Homebrew і Ollama. Іншыя сістэмы, якія падтрымляецца Ollama, таксама магу працаваць, хоць команды для інсталяцыі і шырокаспектнасць буду разныя.
Шаг 1: інсталяцыя Ollama
Ollama — гэта просты спосаб развантажыць і запусціць адкрытыя мадэлі локальна. За дапамогою Homebrew:
brew install ollama
Калі ён ужэ установлена, апдэйтуйце яе:
brew update
brew upgrade ollama
Падтвердзіце установку:
ollama --version
Дапраўны аплікэнт для macOS з сайту Ollama ёсць альтэрнатыва.
Шаг 2: завантажыць модэль
Завантажыце модэль E4B. Гэта займе калькі хвілін, адколькі файл мае розмер калькі гігабайтаў:
ollama pull gemma4:e4b
Потым пераканаўцеся, чы ён уключаны:
ollama list
Этот элемент паведамлення павінен выглядаць прыблізна так:
NAME ID SIZE
gemma4:e4b ... 9.6 GB
Шаг 3: размова з модэлем безпосерэдньа
Перш чым дадзіць ADK, пераканайцеся, што Gemma працюе сама праз Ollama:
ollama run gemma4:e4b
Спробуйце просты праграмат:
Create an outline for an article explaining AI agents to beginners.
Будзь-якая разумная адказва паказвае, што локальны модэль працуе. Заканчыце інтэрактыўную сесію так:
/bye
Гэты тэст выявляе проблемы. Калі мадэль не працюе тут, дэбаггін фрэймворка агента ўсунець нічога.
Шаг 4: пераканацца, чы не працюе ўжо Ollama
По значэнню за замовчаннем Ollama праслухоўвае на:
http://127.0.0.1:11434
Запуск сервера вручную можа спрыяць выйшу кацэк:
ollama serve
Error: listen tcp 127.0.0.1:11434: bind: address already in use
Эта памяць не павінна неабяжна значыць проблему. Яна зазвычай значыць, што Ollama ужо запусцены. Пераканайцеся, выканаўшы запіт да канцэнтра паўнакоў:
curl http://127.0.0.1:11434/api/tags
Работаючы сервер адпавяда JSON-данымі, у якіх пераказаны встановленыя мадэлі. Чырага, якія мадэлі зараз завантажаны:
ollama ps
Няхай другі серверы ніколі не запускаюцца на той самы порт.
Шаг 5: стварыць праект ADK
Створыце папку для праекта там, дзе вам зручна:
cd /Users/yourusername
mkdir bloggeragent
cd bloggeragent
Створыце файлы, якія патрабуець праект:
touch requirements.txt .env .gitignore __init__.py agent.py
Маючысяць выглядаць так:
bloggeragent/
├── .env
├── .gitignore
├── __init__.py
├── agent.py
└── requirements.txt
Шаг 6: віртуальная асяроддзе
Віртуальная асяроддзе Python дозволяе выдэляць залежнасці праекта ад рэшты сістэмы. Створыце ўсё гэта:
python3 -m venv .venv
Актывацыя:
source .venv/bin/activate
Указвач тэрміналу цяпер павінен пачынацся так:
(.venv)
Пераканаўцеся, што выкарыстоўваецца правы перакладчык:
which python
Паць які будзе вярнуты, павінен выказваць месца ў сэраўе праекта, чымсь на кшталт:
/Users/philipobiorah/bloggeragent/.venv/bin/python
Шаг 7: установіце ADK з падтрымкам даклёгі модэля
Занесіце залежнасці ў requirements.txt:
google-adk[extensions]==2.2.0
python-dotenv
litellm>=1.84
Потым іх установіце:
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
Частка [extensions] мае важнае значэнне. Пры стандартный установцы ADK можа не быць неабяжлівых пакетаў, якія патрэбны для працы кэрэйвера LiteLlm, і тады пры імпорце можа выйсці адказ пра адказку:
ImportError: LiteLLM support requires:
pip install google-adk[extensions]
Калі гэта з’явіцца, явнаючы сабе ўстановіце дадатковыя элементы:
python -m pip install --upgrade "google-adk[extensions]==2.2.0"
python -m pip install --upgrade "litellm>=1.84"
Апостраблі не дазваюць такім экзэкюятарам, як Zsh, спрыяць тому, каб квадратныя складкі былі спрыяваны як шаблон. Чыба пераканацца ў інтэграцыі:
python -c "from google.adk.models.lite_llm import LiteLlm; print('LiteLLM connection ready')"
Апэктыўваны выхадны рэзультат ёсць:
LiteLLM connection ready
Шаг 8: налаштаваеце праект на Ollama
Дадзіце локальную адрэсу ў .env:
OLLAMA_API_BASE=http://127.0.0.1:11434
У працэўнае версіі Gemini, якая розмешчана на серверах, не трэба ключа Google API, таму ў локальнай наладзе гэтая змянная не выкарыстоўваецца:
GOOGLE_API_KEY
Локальная настройка яшчэ цінна для захавання, таму дадзіце гэтыя элементы ў .gitignore:
.env
.venv/
__pycache__/
*.pyc
Зберагчы .env параду з контролем версій — гэта хорашая практыка, нават якшто ў файле сёньня няма ніякіх секрэтных дадзеных.
Шаг 9: ператворыць папку на пакет
Дадзіце адну лінію ў __init__.py, каб ADK могла імпортаваць вялічыню агента з пакета:
from . import agent
Шаг 10: задаць локальную мадэль
Ачыніце agent.py і пачніце з імпорта:
import datetime
from dotenv import load_dotenv
from google.adk.agents import Agent, LoopAgent
from google.adk.models.lite_llm import LiteLlm
from google.adk.tools import agent_tool
Завантажыце настройкі сераўыска:
load_dotenv()
Створыце з’ёднанне з локальным модэлем:
MODEL = LiteLlm(
model="ollama_chat/gemma4:e4b"
)
Google рэкамендуее адпраўнік ollama_chat замест звычайнага ollama. Інтэрфейс, прызначаны для чату, лепш захоўвае кантэкст размовы і зменшае шансы на непатрэбныя павтаральныя вызовы інструментаў. У разе меньшага модэлю змінюецца толькі строка з назвай модэлю:
MODEL = LiteLlm(
model="ollama_chat/gemma4:e2b"
)
Шаг 11: рабочы працэс з мнагае агентамі
Полны код для рэалізацыі рабочага працэса з мнагае агентамі аплікуюцца з кансэпту Google’s codelab, у яком разглядаецца стварэнне прыстрою для напісання блога з вікорыстоўванням мнагае агентамі. Паданы код знаходзіцца ў файле agent.py. У яму візначаюцца следуючы элементы:
BlogPlannerстварае структуру статты.OutlineValidationCheckerпераглядае ўзгаданую структуру.RobustBlogPlannerадмахчае працэс планавання і перагляду ў межах ціклу з фіксаваным лімітом.BlogWriterрозгледвае структуру і ператварае яе ў саму артыкул.BlogPostValidationCheckerаналізуе готовы тэкст.RobustBlogWriterспаявае працэс напісання з гэтым аналізам.planner_toolіwriter_toolпрэдставляюць два рабочыя працэса як інструменты, якія можна вызваць.root_agentкеруе всім працэсам з самага пачатку да канца.
У первасправе эты агенты размовляюць з модэлем Gemini, які рэалізаваны на серверэ. Архітэктура застаецца тая ж, і зменшыцца толькі настройкі модэля.
Як і ў кэдалабе, файл __init__.py мае:
from . import agent
Гэта практычнаяяе працэ агента даўа доступ ADK runner-у. Далей скорэктавайце імпорты ў agent.py кодлаба. Дадзіце імпорт LiteLlm:
from google.adk.models.lite_llm import LiteLlm
Этыя два імпорту не выкарыстоўваныя ў даданым кодзе і можна ўсунуць:
import sys
from pathlib import Path
Гэтыя застаюцца:
import datetime
from dotenv import load_dotenv
from google.adk.agents import Agent, LoopAgent
from google.adk.tools import agent_tool
У кэдалабе модэль задаецца за дапамою вышуквання ў сэрэдзе:
MODEL = os.getenv("MODEL", "gemini-flash-latest")
Заменіце тую лінію на местны канектар:
MODEL = LiteLlm(
model="ollama_chat/gemma4:e4b"
)
У верхней часты agent.py павінна быць такая тэкст:
import datetime
from dotenv import load_dotenv
from google.adk.agents import Agent, LoopAgent
from google.adk.models.lite_llm import LiteLlm
from google.adk.tools import agent_toolload_dotenv()MODEL = LiteLlm(
model="ollama_chat/gemma4:e4b"
)
Апрант, пісьменнік, пераканальнікі, а таксама вяліканія LoopAgent, AgentTool і root_agent застаюцца абсалютна такімі, якія іх паказвае кодлаб. Кожны агент ужо мае:
model=MODEL
Такім чынам, змянена спяльная змянная MODEL перэнаправляе цэлую сістэму з хоставанага API Gemini на Gemma 4, якая працюе праз Ollama.
Што практыкуецца
У гэтым невялікім праекце суяўся некалькі концэпцый агентаў:
- Разумовыя вычынанні: Gemma адначыта цель і выбірае падход.
- Планаванне: агент-планавальнік складае эскіз.
- Дзеянне: галоўны агент запускае спецыялістычныя працэсы.
- Іспытанне інструментаў: планаванне і напісанне выступаюць як інструменты агента.
- Спяльны стан: рэзультаты перадаюцца ад планавальніка да напісчыка і пераканальнікаў.
- Параболенне: спецыяльныя агенты-пераканальнікі пераглядаюць кожны проміжны выход.
- Оркестрацыя: галоўны агент вяршыць выбір, што і калі запускацца.
Разам яны паказваюць локальна прыемленае мовнае модэль, якая выступае як механізм разумавання ў мяркавейшай агентскай сістэме.
Запуск готовай версіі
Полная рэалізацыя, якая включае планавальнік, напісчык, верыфікаторы, настройкі локальнага Gemma 4 і галоўнага агента, публікуецца у рэпазітарыі GitHub пад назвай bloggeragent. Чырагаваць яго можна так:
git clone https://github.com/philipobiorah/bloggeragent.git
cd bloggeragent
Створыце і актывацыя віртуальнай асяроддзя:
python3 -m venv .venv
source .venv/bin/activate
З’явіце залежнасці:
python -m pip install -r requirements.txt
Гэта ўсесторонняя локальная адаптацыя прыклада напісання блога ад Google, налаштаваная для Gemma 4 за дапамою Ollama і LiteLLM заместо хоставанага API Gemini.
Вывык
АІ-агенту не завжды трэбуецца платныя API-мадэлі. За дапамою Gemma 4, Ollama, LiteLLM і Google ADK прыклад прыкладнай програмы з калькольнікамі агентаў можа спланаваць артыкул, пераканацца ў правільнасці плану, напісаць чэрнавік, яго пераглянуць і выдаты рэзультат на камп’ютары з Apple Silicon Mac без дагадковых збораў за кожны запіт. Работа локальна таксама дапамагае легчэй разумець, як працуюць сістэмы агентаў пад інтэрфейсам чату.
Галоўны урок заключаецца ў тым, што агент — гэта не проста яго мовны мадэль. Спроможны агент ствараецца за счытком мадэлі, інструкцый, інструментаў, стану, механізмаў коордынацыі, пераканання ў правільнасці дзеянняў і захоўніх мераў. Работа мадэлі локальна дае больш кантролю над інфраструктурой, а праектаванне сістэмы навакол яе вяршыць тое, чы рэзультатам такога кантролю стане ўжытковы, надзеяны і адпаведальны продукт.