[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-pl-netpostpanel":3,"technology-slugs-pl":41,"mdc-5wt555-key":65},{"id":4,"title":5,"content":6,"date":7,"description":8,"extension":9,"featured":10,"image":11,"links":12,"meta":18,"stack":19,"stem":35,"tags":36,"url":39,"__hash__":40},"projects_pl\u002Fpl\u002Fprojects\u002Fnetpostpanel.yml","NetPostPanel","Wewnętrzna platforma AI do operacji na treści, która zamienia research tematu w gotową treść: pełny pipeline RAG (Google Custom Search + RSS → scraping → generacja multi-provider → wektoryzacja), plus wersjonowane zewnętrzne API zasilające procesy treściowe innych projektów, w tym pipeline bloga DigiSpace.\n\n## Kluczowe funkcje\n\n- **Zewnętrzne API** - wersjonowane `POST \u002Fapi\u002Fv1\u002Fgenerate` + `\u002Ftranslate` z kluczami i limitami per klient udostępnia cały pipeline innym aplikacjom, synchronicznie lub asynchronicznie z callbackami\n- **Auto Pilot** - codzienne zaplanowane uruchomienia generują treść z nowych inspiracji lub własnych tematów, w pełni automatycznie\n- **AI bez przywiązania do dostawcy** - Gemini i OpenAI za abstrakcją driverów, więc zmiana modelu to konfiguracja, nie refaktoryzacja\n- **Pipeline semantyczny** - wyszukiwanie wektorowe na Qdrant deduplikuje i grupuje newsy zanim trafią do generacji\n- **Autonomiczna agregacja** - auto-wykrywanie kanałów RSS oraz Google Custom Search plus scraping zamieniają temat w samozasilające się źródło treści\n- **Widoczne wywołania LLM** - każda generacja jest śledzona w Langfuse: tokeny, opóźnienie, koszt\n- **Dostęp oparty na rolach** - role admin\u002Fcontent manager\u002Feditor, każde zapytanie ograniczone do właściciela poza adminem\n\n## Stos technologiczny\n\n- **Backend**: Laravel, agenci `laravel\u002Fai`\n- **Frontend**: Inertia.js + Vue 3 (SPA Search & Creation, edytor TipTap)\n- **AI**: Multi-provider (Gemini\u002FOpenAI) za abstrakcją driverów\n- **Research**: Google Custom Search + agregacja RSS, scraping stron\n- **Baza wektorowa**: Qdrant do wyszukiwania semantycznego\n- **Obserwowalność**: Langfuse do śledzenia LLM\n- **Kolejka**: Laravel Horizon\n- **Testy**: PHPUnit\u002FPest + Cypress E2E\n","2024-11-10","Platforma AI do operacji na treści — pipeline RAG (research → scraping → generacja → wektoryzacja), zewnętrzne API dla innych aplikacji oraz Auto Pilot do generacji bez udziału człowieka","yml",true,"\u002Fhero\u002Fnetpostpanel.avif",[13],{"label":14,"to":15,"color":16,"icon":17},"Przegląd projektu","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fnet-post-panel-overview","neutral","i-simple-icons-github",{},[20,23,26,29,32],{"name":21,"icon":22},"Laravel","i-simple-icons-laravel",{"name":24,"icon":25},"AI","i-heroicons-sparkles",{"name":27,"icon":28},"Qdrant","i-simple-icons-qdrant",{"name":30,"icon":31},"Langfuse","i-heroicons-chart-bar",{"name":33,"icon":34},"Horizon","i-simple-icons-laravelhorizon","pl\u002Fprojects\u002Fnetpostpanel",[24,21,37,38,27,33],"RAG","External API","https:\u002F\u002Fnet-post-panel.digispace.pro","Gkp9EK0q-C32J7DZ0z0fi4In36IKL9zOIc9U4HbCAxA",[42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64],"caddy","cloudflare","digitalocean","docker","filament","github-actions","go","hetzner","hostinger","laravel","mysql","nuxt","php","postgresql","proxmox","redis","stripe","symfony","tailwindcss","terraform","typescript","vite","vue",{"data":66,"body":67},{},{"type":68,"children":69},"root",[70,78,85,178,184],{"type":71,"tag":72,"props":73,"children":74},"element","p",{},[75],{"type":76,"value":77},"text","Wewnętrzna platforma AI do operacji na treści, która zamienia research tematu w gotową treść: pełny pipeline RAG (Google Custom Search + RSS → scraping → generacja multi-provider → wektoryzacja), plus wersjonowane zewnętrzne API zasilające procesy treściowe innych projektów, w tym pipeline bloga DigiSpace.",{"type":71,"tag":79,"props":80,"children":82},"h2",{"id":81},"kluczowe-funkcje",[83],{"type":76,"value":84},"Kluczowe funkcje",{"type":71,"tag":86,"props":87,"children":88},"ul",{},[89,118,128,138,148,158,168],{"type":71,"tag":90,"props":91,"children":92},"li",{},[93,99,101,108,110,116],{"type":71,"tag":94,"props":95,"children":96},"strong",{},[97],{"type":76,"value":98},"Zewnętrzne API",{"type":76,"value":100}," - wersjonowane ",{"type":71,"tag":102,"props":103,"children":105},"code",{"className":104},[],[106],{"type":76,"value":107},"POST \u002Fapi\u002Fv1\u002Fgenerate",{"type":76,"value":109}," + ",{"type":71,"tag":102,"props":111,"children":113},{"className":112},[],[114],{"type":76,"value":115},"\u002Ftranslate",{"type":76,"value":117}," z kluczami i limitami per klient udostępnia cały pipeline innym aplikacjom, synchronicznie lub asynchronicznie z callbackami",{"type":71,"tag":90,"props":119,"children":120},{},[121,126],{"type":71,"tag":94,"props":122,"children":123},{},[124],{"type":76,"value":125},"Auto Pilot",{"type":76,"value":127}," - codzienne zaplanowane uruchomienia generują treść z nowych inspiracji lub własnych tematów, w pełni automatycznie",{"type":71,"tag":90,"props":129,"children":130},{},[131,136],{"type":71,"tag":94,"props":132,"children":133},{},[134],{"type":76,"value":135},"AI bez przywiązania do dostawcy",{"type":76,"value":137}," - Gemini i OpenAI za abstrakcją driverów, więc zmiana modelu to konfiguracja, nie refaktoryzacja",{"type":71,"tag":90,"props":139,"children":140},{},[141,146],{"type":71,"tag":94,"props":142,"children":143},{},[144],{"type":76,"value":145},"Pipeline semantyczny",{"type":76,"value":147}," - wyszukiwanie wektorowe na Qdrant deduplikuje i grupuje newsy zanim trafią do generacji",{"type":71,"tag":90,"props":149,"children":150},{},[151,156],{"type":71,"tag":94,"props":152,"children":153},{},[154],{"type":76,"value":155},"Autonomiczna agregacja",{"type":76,"value":157}," - auto-wykrywanie kanałów RSS oraz Google Custom Search plus scraping zamieniają temat w samozasilające się źródło treści",{"type":71,"tag":90,"props":159,"children":160},{},[161,166],{"type":71,"tag":94,"props":162,"children":163},{},[164],{"type":76,"value":165},"Widoczne wywołania LLM",{"type":76,"value":167}," - każda generacja jest śledzona w Langfuse: tokeny, opóźnienie, koszt",{"type":71,"tag":90,"props":169,"children":170},{},[171,176],{"type":71,"tag":94,"props":172,"children":173},{},[174],{"type":76,"value":175},"Dostęp oparty na rolach",{"type":76,"value":177}," - role admin\u002Fcontent manager\u002Feditor, każde zapytanie ograniczone do właściciela poza adminem",{"type":71,"tag":79,"props":179,"children":181},{"id":180},"stos-technologiczny",[182],{"type":76,"value":183},"Stos technologiczny",{"type":71,"tag":86,"props":185,"children":186},{},[187,203,213,222,232,242,252,262],{"type":71,"tag":90,"props":188,"children":189},{},[190,195,197],{"type":71,"tag":94,"props":191,"children":192},{},[193],{"type":76,"value":194},"Backend",{"type":76,"value":196},": Laravel, agenci ",{"type":71,"tag":102,"props":198,"children":200},{"className":199},[],[201],{"type":76,"value":202},"laravel\u002Fai",{"type":71,"tag":90,"props":204,"children":205},{},[206,211],{"type":71,"tag":94,"props":207,"children":208},{},[209],{"type":76,"value":210},"Frontend",{"type":76,"value":212},": Inertia.js + Vue 3 (SPA Search & Creation, edytor TipTap)",{"type":71,"tag":90,"props":214,"children":215},{},[216,220],{"type":71,"tag":94,"props":217,"children":218},{},[219],{"type":76,"value":24},{"type":76,"value":221},": Multi-provider (Gemini\u002FOpenAI) za abstrakcją driverów",{"type":71,"tag":90,"props":223,"children":224},{},[225,230],{"type":71,"tag":94,"props":226,"children":227},{},[228],{"type":76,"value":229},"Research",{"type":76,"value":231},": Google Custom Search + agregacja RSS, scraping stron",{"type":71,"tag":90,"props":233,"children":234},{},[235,240],{"type":71,"tag":94,"props":236,"children":237},{},[238],{"type":76,"value":239},"Baza wektorowa",{"type":76,"value":241},": Qdrant do wyszukiwania semantycznego",{"type":71,"tag":90,"props":243,"children":244},{},[245,250],{"type":71,"tag":94,"props":246,"children":247},{},[248],{"type":76,"value":249},"Obserwowalność",{"type":76,"value":251},": Langfuse do śledzenia LLM",{"type":71,"tag":90,"props":253,"children":254},{},[255,260],{"type":71,"tag":94,"props":256,"children":257},{},[258],{"type":76,"value":259},"Kolejka",{"type":76,"value":261},": Laravel Horizon",{"type":71,"tag":90,"props":263,"children":264},{},[265,270],{"type":71,"tag":94,"props":266,"children":267},{},[268],{"type":76,"value":269},"Testy",{"type":76,"value":271},": PHPUnit\u002FPest + Cypress E2E"]