Codzienna rolka AI z arkusza Google - workflow n8n węzeł po węźle
Rolki AI tworzone automatycznie w n8n: temat z Arkuszy Google, prompt z modelu czatu, wideo Seedance 2.5 przez API, pętla oczekiwania i zapis MP4 na Dysku.
Rano otwieram folder na Dysku Google i mam w nim świeżą rolkę 9:16 zrobioną w nocy z tematu, który wpisałem kiedyś do arkusza. Całość to kilkanaście węzłów n8n: harmonogram, arkusz, model czatu piszący prompt, zlecenie wideo, pętla czekania, pobranie pliku i zapis. Poniżej konfiguracja każdego węzła z treścią zapytań do skopiowania. Jeden klucz Kadrarisa obsługuje tu i czat, i wideo.
Plan działania
Workflow startuje codziennie o 7:00 i robi po kolei:
- Pobiera z arkusza Google pierwszy temat ze statusem
nowy(kolumnytematistatus). - Prosi model czatu o prompt do pionowego wideo, po angielsku.
- Zleca klip w Seedance 2.5.
- Co 30 sekund sprawdza, czy klip jest gotowy.
- Ściąga MP4 i wrzuca go do folderu na Dysku.
- Zmienia status tematu na
gotowy.
Publikacji w nim nie ma i to celowo. Rolki czekają w folderze, przeglądam je i wrzucam sam. Bez podglądu prędzej czy później wyszłoby do ludzi wideo z sześcioma palcami.
Potrzebne rzeczy
- n8n w chmurze albo na własnym serwerze - nie potrzebujesz żadnych dodatkowych paczek,
- konto w Kadrarisie, trochę środków i klucz
sk-kd-...(zakładasz je tutaj), - arkusz z dwiema kolumnami:
tematorazstatus, - połączenie OAuth z kontem Google w n8n (arkusze i Dysk).
Jedno poświadczenie na wszystkie zapytania
Klucz wpisuję raz, w poświadczeniu typu Header Auth. W Name idzie Authorization, w Value - Bearer sk-kd-....
Później każdy węzeł zapytań dostaje to samo poświadczenie: Authentication → Generic Credential Type → Header Auth. Gdy zmieniam klucz, poprawiam jedno miejsce, a nie sześć.
Start i temat dnia
- Wyzwalacz harmonogramu -
Schedule Triggerz interwałem dziennym (Days) i godziną 7. - Odczyt arkusza -
Google Sheetsw trybieGet Row(s): wskazujesz plik, filtrujeszstatus=nowyi w opcjach zostawiasz tylko pierwszy trafiony wiersz. Jeden temat dziennie, jedna rolka dziennie.
Model czatu pisze prompt
Węzeł HTTP Request, nazwij go Prompt - będę się do niego odwoływał dalej:
- Method:
POST - URL:
https://kadraris.com/v1/chat/completions - Authentication: poświadczenie z poprzedniego kroku
- Send Body: JSON
{
"model": "gemini-3.6-flash",
"messages": [
{
"role": "system",
"content": "You write prompts for an AI video model. Return a single English prompt, up to 70 words, vertical 9:16, one unbroken shot, with camera motion, light and background sound. No on-screen text, no dialogue."
},
{
"role": "user",
"content": "Topic: {{ $json.temat }}"
}
],
"temperature": 0.8
}Endpoint mówi w formacie OpenAI, więc treść odpowiedzi wyciągasz jak zwykle: {{ $json.choices[0].message.content }}. Krótki prompt nie wymaga ciężkiego modelu. Biorę Gemini 3.6 Flash (4,28 zł / 21,41 zł za 1 mln tokenów), a ponieważ jedno zapytanie zużywa kilkaset tokenów, przy cenie wideo ten krok prawie nie istnieje w rachunku.
Mowę i napisy blokuję już w prompcie systemowym. Polskie kwestie w modelach wideo wychodzą nierówno, a litery wygenerowane w kadrze lubią się przekręcać. Napisy i głos dokładam później, przy montażu.
Zlecenie wideo
Kolejny węzeł zapytań, tym razem z nazwą Zlecenie wideo. Ustawiasz POST na https://kadraris.com/v1/generate, wybierasz poświadczenie z początku i wklejasz treść jako wyrażenie (Expression):
{
"model": "seedance-2.5",
"input": {
"prompt": {{ JSON.stringify($json.choices[0].message.content) }},
"duration": 10,
"resolution": "720p",
"aspect_ratio": "9:16",
"generate_audio": true
}
}Nie pomijaj JSON.stringify. Prompt od modelu czatu potrafi mieć cudzysłowy i znaki nowej linii, a bez tej funkcji n8n wyśle uszkodzony JSON i dostaniesz 422.
Odpowiedź przychodzi od razu: kod 202, id zadania i estimated_cost. Ta kwota jest zablokowana na saldzie, dopóki zadanie trwa. Rolka 10 s w 720p kosztuje dziesięć sekund stawki 720p, czyli ok. 34 zł. Najniższa stawka modelu, od 1,50 zł za sekundę, dotyczy 480p.
Czekanie na wynik
Na klip czekasz zwykle od minuty do paru minut. Pętlę składam z czterech elementów:
- Pauza - węzeł
Wait, trybAfter Time Interval, 30 sekund. - Odczyt -
GETnahttps://kadraris.com/v1/tasks/{{ $('Zlecenie wideo').item.json.id }}, to samo poświadczenie. Jeśli węzeł zlecenia nazwałeś inaczej, popraw nazwę w wyrażeniu. - Switch po
{{ $json.status }}: przysucceededprzechodzisz do ściągania pliku, przyfaileddo gałęzi z alarmem, aqueuedirunningkierujesz znów na pauzę. - Bezpiecznik - w ustawieniach całego workflow limit 30 minut, inaczej zawieszone zadanie mieliłoby się w nieskończoność.
Połączenie wychodzące ze Switch i wracające do pauzy jest w n8n czymś normalnym.
Zadanie failed nic nie kosztuje, zablokowana kwota wraca w całości. W tej gałęzi wysyłam sobie wiadomość na Telegram z {{ $json.error.message }} i zostawiam temat jako nowy, więc następnego dnia workflow spróbuje jeszcze raz.
Zamiast pętli: webhook
Do treści zlecenia możesz dodać "webhook_url" z produkcyjnym adresem węzła Webhook w osobnym workflow. Gdy zadanie się skończy, ten adres dostanie POST z identyczną treścią jak odpowiedź GET /v1/tasks/{id}. Przy wielu rolkach naraz to wygodniejsze, ale twoja instancja n8n musi być widoczna z internetu. Podpis przychodzi w nagłówku x-kadraris-signature, a sposób sprawdzania opisuje dokumentacja webhooków.
Pobranie i zapis
Link do pliku działa ograniczony czas, więc ściągam go od razu.
Ściąganie to znowu węzeł zapytań: GET na {{ $json.output[0].url }}, bez uwierzytelnienia (link do pliku klucza nie potrzebuje). W opcjach odpowiedzi ustawiasz Response Format: File i pole wyjściowe data.
Zapis robi Google Drive w trybie Upload: pole binarne data, nazwa w stylu {{ $now.toFormat('yyyy-MM-dd') }}_{{ $('Google Sheets').item.json.temat }}.mp4, katalog Rolki/Do przejrzenia.
Na koniec Google Sheets w trybie Update Row wpisuje gotowy w tym samym wierszu, z którego wziąłeś temat.
Wszystkie węzły w jednej tabeli
| # | Węzeł | Zadanie |
|---|---|---|
| 1 | Schedule Trigger | uruchomienie o 7:00 |
| 2 | Google Sheets | temat ze statusem nowy |
| 3 | HTTP Request | prompt z /v1/chat/completions |
| 4 | HTTP Request | zlecenie w /v1/generate |
| 5 | Wait | 30 s przerwy |
| 6 | HTTP Request | stan z /v1/tasks/{id} |
| 7 | Switch | dalej, błąd albo z powrotem do Wait |
| 8 | HTTP Request | MP4 jako plik |
| 9 | Google Drive | zapis rolki |
| 10 | Google Sheets | status gotowy |
Ten sam bohater w każdej rolce
Gdy rolki mają wyglądać spójnie - ta sama postać, ten sam produkt - przed zleceniem wideo dokładam obraz. HTTP Request z POST https://kadraris.com/v1/generate?wait=60:
{
"model": "nano-banana-pro",
"input": {
"prompt": {{ JSON.stringify($json.choices[0].message.content) }},
"aspect_ratio": "9:16"
}
}Dzięki wait=60 odpowiedź przychodzi już z obrazem, bez pętli. Timeout węzła podnieś do 130 sekund. W zleceniu wideo dodajesz potem "image_url": "{{ $json.output[0].url }}" i Seedance animuje dokładnie ten kadr.
Jedna pułapka: po wstawieniu węzła z obrazem $json w zleceniu wideo wskazuje na odpowiedź z obrazem, a nie z czatu. Prompt pobierz więc po nazwie węzła: {{ JSON.stringify($('Prompt').item.json.choices[0].message.content) }}. Obraz z Nano Banana Pro to od 0,41 zł za obraz - mały dodatek do ceny klipu, a kompozycja jest pod kontrolą.
Piosenka zamiast dźwięku z wideo
Wolisz utwór z wokalem? W zleceniu wideo wyłącz dźwięk (generate_audio: false), a muzykę zamów osobnym zadaniem w Mureka V9. Ten model śpiewa podany tekst: lyrics jest wymagane (sekcje oznaczasz [Verse] i [Chorus]), prompt z opisem stylu jest opcjonalny, a płacisz za utwór.
{
"model": "mureka-v9",
"input": {
"lyrics": "[Verse]\nBudzik dzwoni, czas na plan\nJeden klik i mamy kadr\n[Chorus]\nJedziemy dalej, bez przerw",
"prompt": "bright minimal electro pop, soft kick, cheerful, 100 bpm"
}
}To również zadanie asynchroniczne, więc potrzebuje własnej pętli albo webhooka. Utwór zwykle trwa dłużej niż rolka, dlatego wideo i wybrany kawałek muzyki skleja się w montażu albo ffmpeg-iem. Ile wychodzi cała rolka z muzyką, obrazem i klipem, liczę w poradniku ile kosztuje rolka z AI.
Kiedy coś nie działa
- 422 na
/v1/generate- prawie zawsze winny jest cudzysłów z promptu, który rozbił JSON (zapomnianyJSON.stringify), albo pole, którego model nie zna. Dopuszczalne wartości pokażeGET /v1/models/seedance-2.5. - 402 - saldo niższe niż szacunek. BLIK zasila konto od ręki.
- 401 - przed kluczem w poświadczeniu nie ma słowa
Bearer. - Plik o zerowej wadze na Dysku - pobieranie zwraca tekst zamiast pliku, bo format odpowiedzi nie jest ustawiony na
File. - 429 - za dużo zapytań na minutę, np. przy Wait ustawionym na 1 sekundę. 30 sekund w zupełności wystarczy.
Ogólny opis n8n, Make i Zapiera jest w dokumentacji no-code, a jeśli chcesz zrobić jedną rolkę ręcznie na próbę, otwórz Kadraris Studio.
Pytania
Czy da się użyć wbudowanych węzłów OpenAI w n8n zamiast HTTP Request?
Do czatu tak - endpoint jest zgodny z OpenAI, więc w poświadczeniu OpenAI ustawiasz base URL https://kadraris.com/v1 i klucz sk-kd-.... Zlecanie wideo i tak idzie przez HTTP Request.
Co się stanie, jeśli w arkuszu skończą się tematy?
Węzeł Google Sheets nie zwróci wiersza i workflow zatrzyma się przed zleceniem, więc nic nie zapłacisz. Warto dodać IF, który w takiej sytuacji wyśle ci przypomnienie o nowych tematach.
Ile wychodzi miesiąc codziennych rolek?
Liczysz głównie wideo: 30 rolek po 10 s to 300 sekund Seedance 2.5, w 720p ok. 1020 zł (w 480p, po stawce od 1,50 zł za sekundę, ponad dwa razy mniej). Prompty z modelu czatu to ułamek tej kwoty, a dni z błędem nie kosztują nic. Własny wariant przeliczysz w kalkulatorze kosztów AI.
Czy workflow może od razu publikować na TikToku?
Da się, przez odpowiednie węzły albo interfejsy samych platform. Sam z tego rezygnuję, bo wideo z AI potrafi mieć błędy, które trzeba wyłapać przed publikacją.























