EN ZalogujOtwórz Studio
Wersja podglądowa. Katalog modeli, ceny, kalkulator i dokumentacja działają. Generowanie uruchomimy po starcie serwisu.

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:

  1. Pobiera z arkusza Google pierwszy temat ze statusem nowy (kolumny temat i status).
  2. Prosi model czatu o prompt do pionowego wideo, po angielsku.
  3. Zleca klip w Seedance 2.5.
  4. Co 30 sekund sprawdza, czy klip jest gotowy.
  5. Ściąga MP4 i wrzuca go do folderu na Dysku.
  6. 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: temat oraz status,
  • 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 Trigger z interwałem dziennym (Days) i godziną 7.
  • Odczyt arkusza - Google Sheets w trybie Get Row(s): wskazujesz plik, filtrujesz status = nowy i 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
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):

json
{
  "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:

  1. Pauza - węzeł Wait, tryb After Time Interval, 30 sekund.
  2. Odczyt - GET na https://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.
  3. Switch po {{ $json.status }}: przy succeeded przechodzisz do ściągania pliku, przy failed do gałęzi z alarmem, a queued i running kierujesz znów na pauzę.
  4. 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
1Schedule Triggeruruchomienie o 7:00
2Google Sheetstemat ze statusem nowy
3HTTP Requestprompt z /v1/chat/completions
4HTTP Requestzlecenie w /v1/generate
5Wait30 s przerwy
6HTTP Requeststan z /v1/tasks/{id}
7Switchdalej, błąd albo z powrotem do Wait
8HTTP RequestMP4 jako plik
9Google Drivezapis rolki
10Google Sheetsstatus 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:

json
{
  "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.

json
{
  "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 (zapomniany JSON.stringify), albo pole, którego model nie zna. Dopuszczalne wartości pokaże GET /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ą.