Kuinka rakensin AI-orkesterin nollasta
Kuinka rakensin AI-orkesterin nollasta
Olen valokuvaaja. Erikoistunut 1850-luvun märkälevy-kollodiotekniikkaan. Teen kuvia kemiallisilla prosesseilla, joissa aikaviide on kirjaimellinen: levyn pitää olla märkä koko kuvaushetken ajan.
En siis ole softaihminen, vaikka teen myös softatestausta.
Silti jossain vaiheessa päädyin rakentamaan viiden tekoälyagentin järjestelmää artradar.fi-projektilleni. Tässä tuo tarina — rehellisesti, ilman kaunistelua.
Miksi edes lähdin tähän
artradar.fi on sivusto, jossa suomalaiset taiteilijat voivat löytää näyttelypaikkoja maakunnittain ja seurata avoimia apurahahakuja. Tietokanta pyörii Supabasessa, sivusto Next.js:llä.
Ongelma: kaiken ylläpito oli käsityötä. Näyttelypaikat piti etsiä itse, tiedot syöttää itse, apurahat seurata itse. Se kävi tylsäksi nopeasti.
Jossain kohtaa ajattelin: mitä jos tämän hoitaisi jokin muu?
En ollut koskaan rakentanut tekoälyagentin etäisintäkään sukulaista. En katsonut yhtään opetusvideota. En lukenut ohjeita. Hyppäsin suoraan syvään veteen.
Ensimmäiset kaksi päivää: kaaos
Asensin OpenClawin ensin Linux-virtuaalikoneelle. Sitten asensin sen Macille. Yritin käyttää samaa Telegram-bottia molemmista — ei toiminut. Luonnollisesti ei toiminut, koska botti voi olla kirjautuneena vain yhteen paikkaan kerrallaan, mutta sen tajusin vasta paljon myöhemmin.
Sitten tuli versiopäivitys: 2026.2.24 → 2026.3.13. Yritin päivittää. Jokin hajosi. Yritin uudelleen. Taas hajosi. Kymmenen yrityksen jälkeen löysin syyn: OpenClaw oli asennettu kahteen eri paikkaan samanaikaisesti — nvm:n kautta ja Homebrew:n kautta. Ne sotivat keskenään.
Ratkaisu oli brutaali mutta ainoa toimiva: poistin kaiken. Kloonasin OpenClawin suoraan git-reposta ja kopioin konfiguraatiot manuaalisesti oikeisiin paikkoihin. Tuntui väärältä. Toimi.
Arkkitehtuuri syntyy
Kun OpenClaw vihdoin käynnistyi oikein, hahmottelin mitä haluan. En yhden tekoälyn vaan orkesterin — eri rooleja varten eri agentit, yksi koordinoimassa kokonaisuutta.
Koordinaattori on se, joka vastaanottaa tehtävät ja jakaa ne eteenpäin. Mallina Hunter Alpha, ilmainen, miljoona tokenia kontekstia.
Galleria-agentti etsii näyttelypaikkoja ympäri Suomen maakunnittain ja tallentaa ne Supabasen venues-tauluun. Myös Hunter Alpha.
Blog-agentti kirjoittaa artikkeleita kolmelle WordPress-sivulle — mukaan lukien tämä teksti. Mallina Trinity Large Preview, joka on yllättävän hyvä luovaan kirjoittamiseen. Tähän tuli muutos, Trinity ei osaa suomea, tai no osaa se, mutta aika tolkutonta tekstiä siitä tuli. Vaihdoin suosiolla ilmaisesta maksulliseen, eli nyt se on Claude Sonnet 4.6. Yhden artikkelin hinnaksi tulee 4-6 eurosenttiä, ei huono.
Apuraha-agentti seuraa avoimia apurahahakuja taiteilijoille. Kannassa on nyt 20 apurahaa, joista seitsemän on tällä hetkellä auki.
Coding-agentti käyttää Qwen3 Coder 480B -mallia. Se on kytketty artradar-repoon GitHubissa ja korjaa bugeja automaattisesti, sekä tekee koodaushommia jos satun keksimään jotain uutta mitä pitää muokata tai tehdä sivulle.
Kaikki mallit ovat ilmaisia OpenRouterin kautta. Kustannus on lähes pyöreät nolla euroa.
JSON on kirottu
En tähän mennessä ollut tajunnut, miten herkästi JSON-tiedostot hajoavat. Yksi ylimääräinen pilkku, yksi puuttuva sulku — ja koko konfiguraatio on rikki.
openclaw.json meni rikki useampaan kertaan. Joka kerta piti kaivaa ongelma esiin rivi riviltä. Opin kantapään kautta, että JSON-editoria, joka ilmoittaa syntaksivirheistä reaaliajassa, ei kannata ohittaa.
Agentit eivät puhu keskenään — ellei niille opeta
Rakensin koordinaattorin. Rakensin muut agentit. Koordinaattori yritti delegoida tehtäviä. Mitään ei tapahtunut.
Ongelma: agentit istuvat omissa sessioissaan eivätkä kuule toisiaan automaattisesti. Koordinaattorin piti osata käyttää sessions_send-työkalua — lähettää viesti suoraan oikealle agentille oikeaan sessioon. Tämä ei ollut itsestäänselvää, ja se piti opettaa erikseen.
Kun se vihdoin toimi, koordinaattori alkoi delegoida oikein: näyttelypaikkakyselyt galleria-agentille, kirjoitustehtävät blog-agentille, koodikorjaukset coding-agentille.
Toinen kompastuskivi: agentit pitää käynnistää ennen kuin koordinaattori voi ottaa niihin yhteyttä. Istuin hetken ajan miettimässä miksi delegointi ei toimi, ennen kuin tajusin, että kohdeagentti oli yksinkertaisesti nukkumassa.
Supabase-integraatio: data alkaa liikkua
Galleria-agentti rupesi käymään läpi näyttelypaikkoja sivusto sivustolta ja tallentamaan tietoja Supabaseen. Se löysi 207 näyttelypaikkaa, joista 206 on tarkistettu.
Matkan varrella tuli yksi hauska tilanne: agentti huomasi itse, että kuvastin.info on vanhentunut lähde — tiedot eivät enää vastaa todellisuutta — ja ilmoitti siitä ennen kuin edes ehdin kysyä. Se ei ollut ohjelmoitu tunnistamaan tätä erikseen; se päätteli sen itse.
Pieniä hetkiä, joissa ymmärtää mitä nämä järjestelmät oikeasti pystyvät tekemään.
Tandem Browser: agentti näkee
Yksi integroinneista, joka muutti eniten: Tandem Browser. Se on AI-selain, jonka avulla agentit voivat navigoida oikeilla verkkosivuilla — ei pelkästään analysoida HTML-koodia, vaan toimia kuten ihminen selaamassa.
Galleria-agentti ei enää vain skrapaa — se menee sivulle, katsoo mitä siellä on, ja tekee päätöksiä sen perusteella.
Mission Control: mitä tapahtuu juuri nyt
Rakensin hallintanäkymän, joka näyttää reaaliajassa koko järjestelmän tilan. Näen milloin galleria-agentti hakee tietoja, milloin blog-agentti kirjoittaa, milloin coding-agentti tekee pullrequestin.
Se oli ensimmäistä kertaa kun järjestelmä alkoi tuntua oikealta orkesterilta eikä pelkältä kokoelmalta erillisiä skriptejä.
GitHub-integraatio: bugikorjaukset automaattisesti
Coding-agentti on kytketty artradar-repositorioon. Se lukee Issues-listan, ottaa bugin käsittelyyn, kloonaa repon, paikallistaa vian, korjaa sen, ajaa testit ja avaa pull requestin.
Minä hyväksyn tai hylkään. Se tekee pohjatyön.
Mikä meni pieleen — rehellisesti
OpenRouter API-avain tallentui aluksi väärään paikkaan. Agentit eivät päässeet malleihin, eikä virheilmoitus ollut erityisen selkeä.
Telegram-token oli vanhentunut. Se oli peräisin Linux-asennuksesta, jonka jo poistin — mutta token oli jäänyt konfiguraatioon. Löytyi vasta kun ihmettelin miksi Telegram-ohjaus ei reagoi mihinkään.
bestrelationshiptips.com-sivuston WordPress-salasana ei yksinkertaisesti toiminut. Application Password oli generoitu, autentikointi meni läpi testauksessa, mutta julkaisu ei onnistunut. En vieläkään tiedä tarkkaa syytä — arvailen palvelinpuolen rajoitusta.
Ilmaiset mallit logittavat kaiken. Tämä ei ole salaisuus, mutta muistutin itselleni sen liian myöhään. Hunter Alpha, Qwen3 Coder ja Trinity ovat ilmaisia — ja OpenRouter käyttää niiden kautta kulkevaa dataa mallikoulutukseen. Ei arkaluontoisia tietoja ilmaisiin malleihin.
Mitä lopulta toimii
Koordinaattori delegoi oikein. Galleria-agentti hakee ja tallentaa tietoja ilman, että minun tarvitsee katsoa perään. Blog-agentti kirjoittaa — tämä artikkeli on sen tekemä. Apuraha-agentti pitää hakukalenterin ajan tasalla. Coding-agentti korjaa bugeja ja koodaa uutta.
Kaikki käynnistyy automaattisesti macOS LaunchAgentin kautta, kun kone käynnistyy. En tee mitään.
Se tuntuu melko hyvältä.
Mitä opin
Muutamia asioita jäi mieleen pysyvästi:
Aloita puhtaalta pöydältä. Älä yritä kikkailla kahden asennuksen kanssa. Valitse yksi ympäristö, pidä se siistinä.
JSON on herkempi kuin luulet. Käytä editoria, joka validoi syntaksin ennen tallentamista.
Agentit tarvitsevat selkeät ohjeet delegoinnista. sessions_send-työkalu ja oikea target-määrittely ovat kriittisiä. Ilman niitä koordinaattori puhuu tyhjiöön.
Käynnistä agentit ennen delegointia. Kuulostaa itsestäänselvältä. Ei ole.
Ilmaiset mallit ovat yllättävän hyviä. En odottanut, että Hunter Alpha ja Qwen3 Coder olisivat tähän tehtävään riittäviä — ne ovat.
Virheet kuuluvat prosessiin. Lähes kaikki meni pieleen ainakin kerran. Se on normaalia. Jatka.
Jos tämä kuulostaa projektilta, jota haluaisit kokeilla: kannattaa kokeilla. Minulla ei ollut taustaa tekoälyjärjestelmistä eikä erityistä teknistä osaamista tähän. Tein sen silti.
Muutamassa päivässä nollasta siihen, että järjestelmä pyörii itsekseen taustalla.
Ei huono.