{"id":151,"date":"2026-03-18T12:28:20","date_gmt":"2026-03-18T10:28:20","guid":{"rendered":"https:\/\/xn--tekolyblogi-o8a.com\/?p=151"},"modified":"2026-03-18T12:28:32","modified_gmt":"2026-03-18T10:28:32","slug":"kuinka-rakensin-ai-orkesterin-nollasta","status":"publish","type":"post","link":"https:\/\/xn--tekolyblogi-o8a.com\/index.php\/2026\/03\/18\/kuinka-rakensin-ai-orkesterin-nollasta\/","title":{"rendered":"Kuinka rakensin AI-orkesterin nollasta"},"content":{"rendered":"<h1>Kuinka rakensin AI-orkesterin nollasta<\/h1>\n<p>Olen valokuvaaja. Erikoistunut 1850-luvun m\u00e4rk\u00e4levy-kollodiotekniikkaan. Teen kuvia kemiallisilla prosesseilla, joissa aikaviide on kirjaimellinen: levyn pit\u00e4\u00e4 olla m\u00e4rk\u00e4 koko kuvaushetken ajan.<\/p>\n<p>En siis ole softaihminen, vaikka teen my\u00f6s softatestausta.<\/p>\n<p>Silti jossain vaiheessa p\u00e4\u00e4dyin rakentamaan viiden teko\u00e4lyagentin j\u00e4rjestelm\u00e4\u00e4 artradar.fi-projektilleni. T\u00e4ss\u00e4 tuo tarina \u2014 rehellisesti, ilman kaunistelua.<\/p>\n<hr \/>\n<h2>Miksi edes l\u00e4hdin t\u00e4h\u00e4n<\/h2>\n<p>artradar.fi on sivusto, jossa suomalaiset taiteilijat voivat l\u00f6yt\u00e4\u00e4 n\u00e4yttelypaikkoja maakunnittain ja seurata avoimia apurahahakuja. Tietokanta py\u00f6rii Supabasessa, sivusto Next.js:ll\u00e4.<\/p>\n<p>Ongelma: kaiken yll\u00e4pito oli k\u00e4sity\u00f6t\u00e4. N\u00e4yttelypaikat piti etsi\u00e4 itse, tiedot sy\u00f6tt\u00e4\u00e4 itse, apurahat seurata itse. Se k\u00e4vi tyls\u00e4ksi nopeasti.<\/p>\n<p>Jossain kohtaa ajattelin: mit\u00e4 jos t\u00e4m\u00e4n hoitaisi jokin muu?<\/p>\n<p>En ollut koskaan rakentanut teko\u00e4lyagentin et\u00e4isint\u00e4k\u00e4\u00e4n sukulaista. En katsonut yht\u00e4\u00e4n opetusvideota. En lukenut ohjeita. Hypp\u00e4sin suoraan syv\u00e4\u00e4n veteen.<\/p>\n<hr \/>\n<h2>Ensimm\u00e4iset kaksi p\u00e4iv\u00e4\u00e4: kaaos<\/h2>\n<p>Asensin OpenClawin ensin Linux-virtuaalikoneelle. Sitten asensin sen Macille. Yritin k\u00e4ytt\u00e4\u00e4 samaa Telegram-bottia molemmista \u2014 ei toiminut. Luonnollisesti ei toiminut, koska botti voi olla kirjautuneena vain yhteen paikkaan kerrallaan, mutta sen tajusin vasta paljon my\u00f6hemmin.<\/p>\n<p>Sitten tuli versiop\u00e4ivitys: 2026.2.24 \u2192 2026.3.13. Yritin p\u00e4ivitt\u00e4\u00e4. Jokin hajosi. Yritin uudelleen. Taas hajosi. Kymmenen yrityksen j\u00e4lkeen l\u00f6ysin syyn: OpenClaw oli asennettu kahteen eri paikkaan samanaikaisesti \u2014 nvm:n kautta ja Homebrew:n kautta. Ne sotivat kesken\u00e4\u00e4n.<\/p>\n<p>Ratkaisu oli brutaali mutta ainoa toimiva: poistin kaiken. Kloonasin OpenClawin suoraan git-reposta ja kopioin konfiguraatiot manuaalisesti oikeisiin paikkoihin. Tuntui v\u00e4\u00e4r\u00e4lt\u00e4. Toimi.<\/p>\n<hr \/>\n<h2>Arkkitehtuuri syntyy<\/h2>\n<p>Kun OpenClaw vihdoin k\u00e4ynnistyi oikein, hahmottelin mit\u00e4 haluan. En yhden teko\u00e4lyn vaan orkesterin \u2014 eri rooleja varten eri agentit, yksi koordinoimassa kokonaisuutta.<\/p>\n<p><strong>Koordinaattori<\/strong> on se, joka vastaanottaa teht\u00e4v\u00e4t ja jakaa ne eteenp\u00e4in. Mallina Hunter Alpha, ilmainen, miljoona tokenia kontekstia.<\/p>\n<p><strong>Galleria-agentti<\/strong> etsii n\u00e4yttelypaikkoja ymp\u00e4ri Suomen maakunnittain ja tallentaa ne Supabasen venues-tauluun. My\u00f6s Hunter Alpha.<\/p>\n<p><strong>Blog-agentti<\/strong> kirjoittaa artikkeleita kolmelle WordPress-sivulle \u2014 mukaan lukien t\u00e4m\u00e4 teksti. Mallina Trinity Large Preview, joka on yll\u00e4tt\u00e4v\u00e4n hyv\u00e4 luovaan kirjoittamiseen. T\u00e4h\u00e4n tuli muutos, Trinity ei osaa suomea, tai no osaa se, mutta aika tolkutonta teksti\u00e4 siit\u00e4 tuli. Vaihdoin suosiolla ilmaisesta maksulliseen, eli nyt se on Claude Sonnet 4.6. Yhden artikkelin hinnaksi tulee 4-6 eurosentti\u00e4, ei huono.<\/p>\n<p><strong>Apuraha-agentti<\/strong> seuraa avoimia apurahahakuja taiteilijoille. Kannassa on nyt 20 apurahaa, joista seitsem\u00e4n on t\u00e4ll\u00e4 hetkell\u00e4 auki.<\/p>\n<p><strong>Coding-agentti<\/strong> k\u00e4ytt\u00e4\u00e4 Qwen3 Coder 480B -mallia. Se on kytketty artradar-repoon GitHubissa ja korjaa bugeja automaattisesti, sek\u00e4 tekee koodaushommia jos satun keksim\u00e4\u00e4n jotain uutta mit\u00e4 pit\u00e4\u00e4 muokata tai tehd\u00e4 sivulle.<\/p>\n<p>Kaikki mallit ovat ilmaisia OpenRouterin kautta. Kustannus on l\u00e4hes py\u00f6re\u00e4t nolla euroa.<\/p>\n<hr \/>\n<h2>JSON on kirottu<\/h2>\n<p>En t\u00e4h\u00e4n menness\u00e4 ollut tajunnut, miten herk\u00e4sti JSON-tiedostot hajoavat. Yksi ylim\u00e4\u00e4r\u00e4inen pilkku, yksi puuttuva sulku \u2014 ja koko konfiguraatio on rikki.<\/p>\n<p>openclaw.json meni rikki useampaan kertaan. Joka kerta piti kaivaa ongelma esiin rivi rivilt\u00e4. Opin kantap\u00e4\u00e4n kautta, ett\u00e4 JSON-editoria, joka ilmoittaa syntaksivirheist\u00e4 reaaliajassa, ei kannata ohittaa.<\/p>\n<hr \/>\n<h2>Agentit eiv\u00e4t puhu kesken\u00e4\u00e4n \u2014 ellei niille opeta<\/h2>\n<p>Rakensin koordinaattorin. Rakensin muut agentit. Koordinaattori yritti delegoida teht\u00e4vi\u00e4. Mit\u00e4\u00e4n ei tapahtunut.<\/p>\n<p>Ongelma: agentit istuvat omissa sessioissaan eiv\u00e4tk\u00e4 kuule toisiaan automaattisesti. Koordinaattorin piti osata k\u00e4ytt\u00e4\u00e4 sessions_send-ty\u00f6kalua \u2014 l\u00e4hett\u00e4\u00e4 viesti suoraan oikealle agentille oikeaan sessioon. T\u00e4m\u00e4 ei ollut itsest\u00e4\u00e4nselv\u00e4\u00e4, ja se piti opettaa erikseen.<\/p>\n<p>Kun se vihdoin toimi, koordinaattori alkoi delegoida oikein: n\u00e4yttelypaikkakyselyt galleria-agentille, kirjoitusteht\u00e4v\u00e4t blog-agentille, koodikorjaukset coding-agentille.<\/p>\n<p>Toinen kompastuskivi: agentit pit\u00e4\u00e4 k\u00e4ynnist\u00e4\u00e4 ennen kuin koordinaattori voi ottaa niihin yhteytt\u00e4. Istuin hetken ajan miettim\u00e4ss\u00e4 miksi delegointi ei toimi, ennen kuin tajusin, ett\u00e4 kohdeagentti oli yksinkertaisesti nukkumassa.<\/p>\n<hr \/>\n<h2>Supabase-integraatio: data alkaa liikkua<\/h2>\n<p>Galleria-agentti rupesi k\u00e4ym\u00e4\u00e4n l\u00e4pi n\u00e4yttelypaikkoja sivusto sivustolta ja tallentamaan tietoja Supabaseen. Se l\u00f6ysi 207 n\u00e4yttelypaikkaa, joista 206 on tarkistettu.<\/p>\n<p>Matkan varrella tuli yksi hauska tilanne: agentti huomasi itse, ett\u00e4 kuvastin.info on vanhentunut l\u00e4hde \u2014 tiedot eiv\u00e4t en\u00e4\u00e4 vastaa todellisuutta \u2014 ja ilmoitti siit\u00e4 ennen kuin edes ehdin kysy\u00e4. Se ei ollut ohjelmoitu tunnistamaan t\u00e4t\u00e4 erikseen; se p\u00e4\u00e4tteli sen itse.<\/p>\n<p>Pieni\u00e4 hetki\u00e4, joissa ymm\u00e4rt\u00e4\u00e4 mit\u00e4 n\u00e4m\u00e4 j\u00e4rjestelm\u00e4t oikeasti pystyv\u00e4t tekem\u00e4\u00e4n.<\/p>\n<hr \/>\n<h2>Tandem Browser: agentti n\u00e4kee<\/h2>\n<p>Yksi integroinneista, joka muutti eniten: Tandem Browser. Se on AI-selain, jonka avulla agentit voivat navigoida oikeilla verkkosivuilla \u2014 ei pelk\u00e4st\u00e4\u00e4n analysoida HTML-koodia, vaan toimia kuten ihminen selaamassa.<\/p>\n<p>Galleria-agentti ei en\u00e4\u00e4 vain skrapaa \u2014 se menee sivulle, katsoo mit\u00e4 siell\u00e4 on, ja tekee p\u00e4\u00e4t\u00f6ksi\u00e4 sen perusteella.<\/p>\n<hr \/>\n<h2>Mission Control: mit\u00e4 tapahtuu juuri nyt<\/h2>\n<p>Rakensin hallintan\u00e4kym\u00e4n, joka n\u00e4ytt\u00e4\u00e4 reaaliajassa koko j\u00e4rjestelm\u00e4n tilan. N\u00e4en milloin galleria-agentti hakee tietoja, milloin blog-agentti kirjoittaa, milloin coding-agentti tekee pullrequestin.<\/p>\n<p>Se oli ensimm\u00e4ist\u00e4 kertaa kun j\u00e4rjestelm\u00e4 alkoi tuntua oikealta orkesterilta eik\u00e4 pelk\u00e4lt\u00e4 kokoelmalta erillisi\u00e4 skriptej\u00e4.<\/p>\n<hr \/>\n<h2>GitHub-integraatio: bugikorjaukset automaattisesti<\/h2>\n<p>Coding-agentti on kytketty artradar-repositorioon. Se lukee Issues-listan, ottaa bugin k\u00e4sittelyyn, kloonaa repon, paikallistaa vian, korjaa sen, ajaa testit ja avaa pull requestin.<\/p>\n<p>Min\u00e4 hyv\u00e4ksyn tai hylk\u00e4\u00e4n. Se tekee pohjaty\u00f6n.<\/p>\n<hr \/>\n<h2>Mik\u00e4 meni pieleen \u2014 rehellisesti<\/h2>\n<p><strong>OpenRouter API-avain<\/strong> tallentui aluksi v\u00e4\u00e4r\u00e4\u00e4n paikkaan. Agentit eiv\u00e4t p\u00e4\u00e4sseet malleihin, eik\u00e4 virheilmoitus ollut erityisen selke\u00e4.<\/p>\n<p><strong>Telegram-token<\/strong> oli vanhentunut. Se oli per\u00e4isin Linux-asennuksesta, jonka jo poistin \u2014 mutta token oli j\u00e4\u00e4nyt konfiguraatioon. L\u00f6ytyi vasta kun ihmettelin miksi Telegram-ohjaus ei reagoi mihink\u00e4\u00e4n.<\/p>\n<p><strong>bestrelationshiptips.com<\/strong>-sivuston WordPress-salasana ei yksinkertaisesti toiminut. Application Password oli generoitu, autentikointi meni l\u00e4pi testauksessa, mutta julkaisu ei onnistunut. En viel\u00e4k\u00e4\u00e4n tied\u00e4 tarkkaa syyt\u00e4 \u2014 arvailen palvelinpuolen rajoitusta.<\/p>\n<p><strong>Ilmaiset mallit logittavat kaiken.<\/strong> T\u00e4m\u00e4 ei ole salaisuus, mutta muistutin itselleni sen liian my\u00f6h\u00e4\u00e4n. Hunter Alpha, Qwen3 Coder ja Trinity ovat ilmaisia \u2014 ja OpenRouter k\u00e4ytt\u00e4\u00e4 niiden kautta kulkevaa dataa mallikoulutukseen. Ei arkaluontoisia tietoja ilmaisiin malleihin.<\/p>\n<hr \/>\n<h2>Mit\u00e4 lopulta toimii<\/h2>\n<p>Koordinaattori delegoi oikein. Galleria-agentti hakee ja tallentaa tietoja ilman, ett\u00e4 minun tarvitsee katsoa per\u00e4\u00e4n. Blog-agentti kirjoittaa \u2014 t\u00e4m\u00e4 artikkeli on sen tekem\u00e4. Apuraha-agentti pit\u00e4\u00e4 hakukalenterin ajan tasalla. Coding-agentti korjaa bugeja ja koodaa uutta.<\/p>\n<p>Kaikki k\u00e4ynnistyy automaattisesti macOS LaunchAgentin kautta, kun kone k\u00e4ynnistyy. En tee mit\u00e4\u00e4n.<\/p>\n<p>Se tuntuu melko hyv\u00e4lt\u00e4.<\/p>\n<hr \/>\n<h2>Mit\u00e4 opin<\/h2>\n<p>Muutamia asioita j\u00e4i mieleen pysyv\u00e4sti:<\/p>\n<p><strong>Aloita puhtaalta p\u00f6yd\u00e4lt\u00e4.<\/strong> \u00c4l\u00e4 yrit\u00e4 kikkailla kahden asennuksen kanssa. Valitse yksi ymp\u00e4rist\u00f6, pid\u00e4 se siistin\u00e4.<\/p>\n<p><strong>JSON on herkempi kuin luulet.<\/strong> K\u00e4yt\u00e4 editoria, joka validoi syntaksin ennen tallentamista.<\/p>\n<p><strong>Agentit tarvitsevat selke\u00e4t ohjeet delegoinnista.<\/strong> sessions_send-ty\u00f6kalu ja oikea target-m\u00e4\u00e4rittely ovat kriittisi\u00e4. Ilman niit\u00e4 koordinaattori puhuu tyhji\u00f6\u00f6n.<\/p>\n<p><strong>K\u00e4ynnist\u00e4 agentit ennen delegointia.<\/strong> Kuulostaa itsest\u00e4\u00e4nselv\u00e4lt\u00e4. Ei ole.<\/p>\n<p><strong>Ilmaiset mallit ovat yll\u00e4tt\u00e4v\u00e4n hyvi\u00e4.<\/strong> En odottanut, ett\u00e4 Hunter Alpha ja Qwen3 Coder olisivat t\u00e4h\u00e4n teht\u00e4v\u00e4\u00e4n riitt\u00e4vi\u00e4 \u2014 ne ovat.<\/p>\n<p><strong>Virheet kuuluvat prosessiin.<\/strong> L\u00e4hes kaikki meni pieleen ainakin kerran. Se on normaalia. Jatka.<\/p>\n<hr \/>\n<p>Jos t\u00e4m\u00e4 kuulostaa projektilta, jota haluaisit kokeilla: kannattaa kokeilla. Minulla ei ollut taustaa teko\u00e4lyj\u00e4rjestelmist\u00e4 eik\u00e4 erityist\u00e4 teknist\u00e4 osaamista t\u00e4h\u00e4n. Tein sen silti.<\/p>\n<p>Muutamassa p\u00e4iv\u00e4ss\u00e4 nollasta siihen, ett\u00e4 j\u00e4rjestelm\u00e4 py\u00f6rii itsekseen taustalla.<\/p>\n<p>Ei huono.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tamperelainen valokuvaaja rakensi viiden teko\u00e4lyagentin orkesterin artradar.fi-projektilleen \u2014 rehellinen tarina asennushaasteista, onnistumisista ja opituista asioista.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-151","post","type-post","status-publish","format-standard","hentry","category-blog"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/xn--tekolyblogi-o8a.com\/index.php\/wp-json\/wp\/v2\/posts\/151","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/xn--tekolyblogi-o8a.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/xn--tekolyblogi-o8a.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/xn--tekolyblogi-o8a.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/xn--tekolyblogi-o8a.com\/index.php\/wp-json\/wp\/v2\/comments?post=151"}],"version-history":[{"count":1,"href":"https:\/\/xn--tekolyblogi-o8a.com\/index.php\/wp-json\/wp\/v2\/posts\/151\/revisions"}],"predecessor-version":[{"id":153,"href":"https:\/\/xn--tekolyblogi-o8a.com\/index.php\/wp-json\/wp\/v2\/posts\/151\/revisions\/153"}],"wp:attachment":[{"href":"https:\/\/xn--tekolyblogi-o8a.com\/index.php\/wp-json\/wp\/v2\/media?parent=151"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/xn--tekolyblogi-o8a.com\/index.php\/wp-json\/wp\/v2\/categories?post=151"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/xn--tekolyblogi-o8a.com\/index.php\/wp-json\/wp\/v2\/tags?post=151"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}