DeepSeek Vision and Grok Imagine models are now live on CometAPI →
guide/Badania CometAPI

Jak połączyć wiele modeli AI z n8n za pomocą jednego klucza CometAPI

Zbuduj w n8n przepływ pracy typu low-code, który kieruje zadania z arkuszy kalkulacyjnych do wielu dostawców AI za pośrednictwem jednego klucza CometAPI, cyklicznie sprawdza status zadań wideo i zapisuje wszystkie wyniki.

CometAPI
AnnaZespół badań AI modeli i API
Zaktualizowano Aug 25, 2026 11 min czyt.
Jak połączyć wiele modeli AI z n8n za pomocą jednego klucza CometAPI
Użyj tego wzorca

Wykonaj pierwsze wywołanie API.

from openai import OpenAI

client = OpenAI(
    api_key="YOUR_COMETAPI_KEY",
    base_url="https://api.cometapi.com/v1",
)

response = client.chat.completions.create(
    model="gpt-5-mini",
    messages=[{"role": "user", "content": "Build this workflow."}],
)

print(response.choices[0].message.content)

Jak połączyć wiele modeli AI z n8n za pomocą jednego API?

Łączenie modeli AI po jednym dostawcy może wystarczyć do prototypu, ale wraz ze wzrostem użycia staje się kruche. Każdy dostawca to osobne dane logowania, endpointy, formaty żądań, limity zapytań, rozliczanie i struktury odpowiedzi. W n8n często prowadzi to do zduplikowanych węzłów HTTP i gałęzi specyficznych dla dostawców, więc dodanie modelu lub zmiana ścieżki awaryjnej oznacza edycję kilku części przepływu.

n8n i CometAPI rozwiązują różne warstwy tego problemu. n8n kontroluje, kiedy zadanie się uruchamia, waliduje wejścia, kieruje zadania synchroniczne i asynchroniczne, ponawia próby w razie błędów i przechowuje wyniki. CometAPI centralizuje dostęp do modeli za pomocą jednego klucza API i jednego base URL. Razem trzymają zmiany po stronie dostawców z dala od warstwy orkiestracji: możesz przełączać identyfikator modelu, zachowując tę samą kolejkę, odpytywanie, przechowywanie i logikę monitoringu.

To połączenie jest szczególnie przydatne dla mieszanych zadań obrazowych i wideo pochodzących z arkuszy kalkulacyjnych lub narzędzi wewnętrznych. Przepływ pozostaje wizualny i audytowalny w n8n, a dane logowania, dostępność modeli i koszty użycia są łatwiejsze do zarządzania przez jedną warstwę API.

Najłatwiejszym sposobem integracji wielu dostawców AI w jednej aplikacji jest rozdzielenie orkiestracji od dostępu do modeli. Pozwól n8n obsługiwać wyzwalacze, rozgałęzienia, ponowienia i przechowywanie, podczas gdy CometAPI nada każdej gałęzi jeden klucz API i jeden base URL. Identyfikator modelu staje się polem w każdym zadaniu zamiast osobnego konta dostawcy, SDK i konfiguracji rozliczeń.

W tym przewodniku zbudujesz działający, niskokodowy pipeline, który odczytuje zadania obrazowe i wideo z Google Sheets, wysyła je do modeli OpenAI i ByteDance przez CometAPI, zapisuje asynchroniczne identyfikatory zadań wideo, odpyta o zakończenie i wykona upsert finalnego wyniku do n8n Data Table.

Co zbudujesz

Gotowy przepływ podąża tą ścieżką:

Google Sheets Trigger → Normalize Job → Switch by media type → CometAPI image or video request → Wait and poll video tasks → Upload or reference the output → Data Table upsert.

Użyj tych kolumn w arkuszu źródłowym:

job_id | media_type | model | prompt | size | seconds | status

Typowy wiersz dla obrazu używa image, gpt-image-2 i 1024x1024. Wiersz dla wideo używa video, seedance-2-5, 1280x720 i czasu trwania od 4 do 30 sekund.

Zanim zaczniesz

Potrzebujesz instancji n8n, arkusza Google, klucza API CometAPI i n8n Data Table o nazwie ai_jobs. Utwórz te kolumny w Data Table: job_id, media_type, model, status, task_id, result_url, error i updated_at.

Dla samodzielnie hostowanego n8n dodaj poniższe wartości do środowiska używanego przez proces n8n:

COMETAPI_BASE_URL=https://api.cometapi.com/v1COMETAPI_KEY=your_cometapi_key

Zrestartuj n8n po zmianie środowiska. W n8n Cloud lub gdy nie chcesz ujawniać zmiennych środowiskowych w wyrażeniach węzłów, utwórz poświadczenie HTTP Header Auth o nazwie CometAPI Bearer. Ustaw nazwę nagłówka na Authorization, a wartość na Bearer your_cometapi_key. Przykłady poniżej używają tych poświadczeń i stałego, kompatybilnego z OpenAI base URL https://api.cometapi.com/v1.

Używaj aktualnych identyfikatorów modeli

ZadanieDostawca i modelŻądanieWynik
ObrazOpenAI · gpt-image-2POST /v1/images/generationsSynchroniczny obraz w base64
WideoByteDance · seedance-2-5POST /v1/videosZadanie asynchroniczne, potem odpytywanie

Oba identyfikatory i możliwości były dostępne w żywym katalogu modeli CometAPI (API) 11 sierpnia 2026 r. Model obrazu obsługuje generowanie tekst→obraz. Seedance 2.5 obsługuje generowanie tekst→wideo i obraz→wideo, klipy 4–30 sekund oraz udokumentowane rozmiary 480p i 720p.

Cennik na dzień 11 sierpnia 2026 r.: strona modelu GPT Image 2 podaje $4 za milion tokenów wejściowych i $24 za milion tokenów wyjściowych. Strona modelu Seedance 2.5 podaje $0.103 za sekundę przy 480p i $0.231 za sekundę przy 720p. Ceny mogą się zmienić, więc jako źródło prawdy w czasie wykonywania używaj żywego katalogu modeli lub strony modelu.

Istotna różnica architektoniczna polega na tym, że generowanie obrazów można obsłużyć jako operację żądanie–odpowiedź, natomiast generowanie wideo powinno być traktowane jako stanowe zadanie. Utrwalenie identyfikatora zadania wideo przed odpytywaniem zapobiega utracie zadania po restarcie wykonania n8n.

Zbuduj przepływ w n8n

1. Wyzwalaj nowe zadania z Google Sheets

Dodaj węzeł Google Sheets Trigger i wybierz Row added or updated. Wskaż arkusz zawierający kolejkę zadań. Dodaj węzeł IF bezpośrednio po wyzwalaczu i kontynuuj tylko, gdy status jest pusty lub równy queued. Zapobiega to ponownemu przesyłaniu zakończonych wierszy po zmianach w arkuszu.

2. Normalizuj i waliduj każdy wiersz

Dodaj węzeł Code o nazwie Normalize Job. Ten węzeł stosuje bezpieczne wartości domyślne, ogranicza przepływ do zatwierdzonych identyfikatorów modeli i wytwarza te same pola dla obu gałęzi.

const row = $json;​const allowedModels = {  image: new Set(['gpt-image-2']),  video: new Set(['seedance-2-5']),};​const mediaType = String(row.media_type || '').trim().toLowerCase();if (!allowedModels[mediaType]) {  throw new Error(`media_type must be image or video; received: ${row.media_type}`);}​const defaultModel = mediaType === 'image' ? 'gpt-image-2' : 'seedance-2-5';const model = String(row.model || defaultModel).trim();if (!allowedModels[mediaType].has(model)) {  throw new Error(`Model ${model} is not allowed for ${mediaType} jobs`);}​const prompt = String(row.prompt || '').trim();if (!prompt) throw new Error('prompt is required');​const seconds = mediaType === 'video' ? Number(row.seconds || 4) : null;if (mediaType === 'video' && (!Number.isInteger(seconds) || seconds < 4 || seconds > 30)) {  throw new Error('Seedance 2.5 seconds must be an integer from 4 to 30');}​return [{  json: {    job_id: String(row.job_id || $execution.id),    media_type: mediaType,    model,    prompt,    size: String(row.size || (mediaType === 'image' ? '1024x1024' : '1280x720')),    seconds,    status: 'processing',    updated_at: new Date().toISOString(),  },}];

Dodaj węzeł Switch po Normalize Job. Kieruj image do gałęzi obrazów i video do gałęzi wideo.

3. Generuj obrazy przez jeden endpoint

Dodaj węzeł HTTP Request o nazwie Create Image z następującymi ustawieniami:

  • Method: POST
  • URL: https://api.cometapi.com/v1/images/generations
  • Authentication: poświadczenie Header Auth CometAPI Bearer
  • Body Content Type: JSON
{  "model": "={{ $('Normalize Job').item.json.model }}",  "prompt": "={{ $('Normalize Job').item.json.prompt }}",  "size": "={{ $('Normalize Job').item.json.size }}"}

GPT Image 2 zwraca dane obrazu w base64. Dodaj węzeł Code o nazwie Prepare Image File, aby przekształcić te dane w element binarny n8n:

const job = $('Normalize Job').item.json;const b64 = $json.data?.[0]?.b64_json;if (!b64) throw new Error('CometAPI returned no image data');​return [{  json: {    ...job,    status: 'completed',    task_id: '',    result_url: '',    error: '',    updated_at: new Date().toISOString(),  },  binary: {    media: {      data: b64,      mimeType: 'image/png',      fileName: `${job.job_id}.png`,    },  },}];

Połącz ten węzeł z preferowanym węzłem magazynu obiektowego, takim jak S3 lub Google Drive. Zapisz zwrócony URL pliku w result_url, a następnie wykonaj upsert wiersza do ai_jobs. Trzymaj duże ładunki base64 poza Data Table.

4. Utwórz asynchroniczne zadanie wideo

Dodaj węzeł HTTP Request o nazwie Create Video:

  • Method: POST
  • URL: https://api.cometapi.com/v1/videos
  • Authentication: CometAPI Bearer
  • Body Content Type: Form-Data

Dodaj cztery pola formularza: model, prompt, seconds i size. Zmapuj ich wartości z Normalize Job.

Następnie dodaj węzeł Code o nazwie Save Video Task:

const job = $('Normalize Job').item.json;const taskId = $json.id || $json.task_id;if (!taskId) throw new Error('Video task ID missing from create response');​return [{  json: {    ...job,    task_id: taskId,    status: $json.status || 'queued',    result_url: '',    error: '',    updated_at: new Date().toISOString(),  },}];

Wykonaj upsert tego elementu do ai_jobs przed odpytywaniem. Natychmiastowe zapisanie identyfikatora zadania oznacza, że restart lub timeout nie spowoduje utraty zadania.

5. Czekaj, odpytywaj i zapisz URL wideo

Dodaj węzeł Wait ustawiony na 15 sekund. Następnie dodaj węzeł HTTP Request o nazwie Get Video:

  • Method: GET
  • URL: =https://api.cometapi.com/v1/videos/{{ $json.task_id }}
  • Authentication: CometAPI Bearer

Po żądaniu użyj węzła Switch na status:

  • queued lub in_progress: wróć do węzła Wait.
  • completed: przejdź do Finalize Video.
  • failed lub error: zapisz błąd do ai_jobs i zatrzymaj.

Dodaj ten węzeł Code dla gałęzi zakończonej:

const prior = $('Save Video Task').item.json;const resultUrl = $json.video_url || $json.url || $json.data?.video_url;if (!resultUrl) throw new Error('Completed video response has no video URL');​return [{  json: {    ...prior,    status: 'completed',    result_url: resultUrl,    error: '',    updated_at: new Date().toISOString(),  },}];

Wykonaj upsert finalnego elementu do ai_jobs według job_id. URL-e wideo CometAPI mogą być podpisane i tymczasowe, więc w środowisku produkcyjnym pobierz i przenieś plik przed zapisaniem trwałego adresu URL. Jeśli Twoja aplikacja może przyjmować żądania przychodzące, zastąp odpytywanie webhookiem tam, gdzie wybrany model obsługuje callbacki.

Pełna mapa węzłów

Pełny przepływ można złożyć z następujących węzłów:

  1. Google Sheets Trigger — Row added or updated
  2. IF — Przetwarzaj tylko nowe lub zakolejkowane wiersze
  3. Code — Normalize Job
  4. Switch — Obraz lub wideo
  5. Gałąź obrazu: HTTP Request → Prepare Image File → Object Storage → Data Table Upsert
  6. Gałąź wideo: HTTP Request → Save Video Task → Data Table Upsert → Wait → HTTP Request → Status Switch
  7. Zakończone wideo: Finalize Video → Object Storage lub trwały URL → Data Table Upsert
  8. Niepowodzenie wideo: Set Error → Data Table Upsert

Dla gałęzi błędu użyj tego wyrażenia w węźle Edit Fields:

{  "job_id": "={{ $('Save Video Task').item.json.job_id }}",  "status": "failed",  "task_id": "={{ $('Save Video Task').item.json.task_id }}",  "result_url": "",  "error": "={{ $json.error?.message || $json.message || 'Video generation failed' }}",  "updated_at": "={{ $now.toISO() }}"}

Przetestuj przepływ

Dodaj te dwa wiersze do arkusza źródłowego:

img-001 | image | gpt-image-2 | A cinematic product photo of a glass robot on a dark desk | 1024x1024 | | queuedvid-001 | video | seedance-2-5 | A paper airplane flies through a sunlit studio, smooth tracking shot | 1280x720 | 4 | queued

Żądanie obrazu powinno zwrócić strukturę podobną do:

{  "created": 1786400000,  "data": [    { "b64_json": "iVBORw0KGgoAAA..." }  ]}

Żądanie utworzenia wideo powinno zwrócić strukturę zadania podobną do:

{  "id": "video_task_abc123",  "object": "video",  "status": "queued",  "progress": 0}

Po odpytywaniu zakończona odpowiedź powinna zawierać ten sam identyfikator zadania, status: completed i video_url. Dokładne pola opcjonalne mogą się różnić w zależności od modelu, dlatego kod normalizacji odczytuje stabilny status zadania i URL wyniku zamiast kopiować całą odpowiedź dostawcy do Twojej bazy.

Typowe błędy i rozwiązania

BłądRozwiązanie
401 UnauthorizedPotwierdź, że wartość w Header Auth zaczyna się od Bearer i że klucz jest aktywny.
404 model or task not foundSprawdź żywy katalog modeli i potwierdź, że używany jest zapisany identyfikator w GET /v1/videos/{id}.
400 invalid size or secondsUżyj obsługiwanego rozmiaru i utrzymuj czas trwania Seedance 2.5 między 4 a 30 sekund.
429 rate limitedZmniejsz współbieżność w n8n i ponów z wykładniczym backoffem oraz jitterem.
Polling never endsUtrwal licznik prób i zatrzymaj po zdefiniowanym czasie; traktuj failed i error jako terminalne.
Image payload is too largeKonwertuj base64 na binarne, wgraj i zapisuj tylko trwały URL.

Lista kontrolna dla produkcji

  • Chroń poświadczenia. Przechowuj klucz API w poświadczeniach n8n lub po stronie serwera w zmiennych środowiskowych. Nigdy nie umieszczaj go w arkuszu ani nie zwracaj do przeglądarki.
  • Uczyń każde zadanie idempotentnym. Użyj job_id jako klucza upsert w Data Table. Przed utworzeniem nowego zadania pomiń wiersze już oznaczone jako processing lub completed.
  • Kontroluj odpytywanie i współbieżność. Odpytuj zadania wideo co 10–20 sekund, ogranicz liczbę prób i liczbę równoległych wykonań. Stosuj backoff dla odpowiedzi 429, 500 i 503 zamiast tworzyć duplikaty zadań.
  • Waliduj politykę modeli przed każdym żądaniem. Utrzymuj listę dozwolonych modeli per typ mediów. Odświeżaj dostępność modeli i ceny z żywego katalogu według harmonogramu, ale wdrażaj zmiany modeli po przeglądzie zamiast pozwalać użytkownikom arkusza przesyłać dowolne identyfikatory.
  • Śledź koszt per zadanie. Zapisz model, rozdzielczość, czas trwania i pola użycia przy każdym wyniku. Czterosekundowe zadanie Seedance 2.5 w 720p to około $0.924 przy stawce z 11 sierpnia 2026 r.; te same 4 sekundy w 480p to około $0.412. Wymuszaj maksymalny czas trwania i rozdzielczość przed wysłaniem żądania.
  • Rehostuj wygenerowane media. Traktuj podpisane URL-e dostawcy jako łącza dostarczania, a nie trwałe przechowywanie. Pobierz ukończone media, prześlij do kontrolowanego zasobnika i zapisz trwały URL oraz sumę kontrolną.
  • Utrzymuj ślad audytowy. Przechowuj model żądania, zanonimizowane parametry, identyfikator zadania, przejścia statusów, liczbę ponowień, czas odpowiedzi i finalną lokalizację zasobu. Nie loguj kluczy API ani pełnych prywatnych promptów.

Dlaczego ten wzorzec się skaluje

Przepływ pozostaje prosty, ponieważ każdy nowy dostawca lub model to decyzja routingu, a nie nowa integracja konta. Arkusz kalkulacyjny pozostaje kolejką zadań, n8n pozostaje warstwą orkiestracji, a CometAPI pozostaje pojedynczą warstwą dostępu. Dodaj model, rozszerzając listę dozwolonych i konfigurację gałęzi; wyzwalacz, utrwalenie zadań, odpytywanie, przechowywanie i monitoring pozostają bez zmian.

To praktyczna odpowiedź na integrację wielodostawców AI: jeden kontrolowany endpoint i klucz, jawny routing modeli, oddzielne ścieżki synchroniczne i asynchroniczne oraz trwały zapis każdego zadania.

Najczęstsze pytania

Czy n8n może wywoływać wielu dostawców AI przez jedno API?

Tak. Dzięki ujednoliconej warstwie API, takiej jak CometAPI, n8n może wysyłać żądania do różnych obsługiwanych modeli, utrzymując scentralizowane poświadczenia dostawcy i integrację HTTP.

Czy mogę używać CometAPI z węzłem HTTP Request w n8n?

Tak. Węzeł HTTP Request może wysyłać żądania do endpointu CometAPI z wymaganą autentykacją i parametrami specyficznymi dla modelu.

Czy n8n może automatycznie przełączać modele AI, gdy jeden zawiedzie?

Tak. Użyj gałęzi IF/Switch po żądaniu API i kieruj błędy podlegające ponowieniu lub specyficzne dla modelu do modelu awaryjnego. Model awaryjny powinien obsługiwać ten sam rodzaj danych i wymagane możliwości.

Kontynuuj naukę

Połącz ten artykuł z następną decyzją.

Zobacz wszystkie tematy
Opublikowano Aug 25, 2026
Ostatnia aktualizacja Aug 25, 2026
0 wyświetleń
Sprawdzone pod kątem przejrzystości, atrybucji źródeł i aktualnej terminologii API.

Gotowy na obniżenie kosztów rozwoju AI o 20%?

Zacznij za darmo w kilka minut. Dołączone kredyty na bezpłatny okres próbny. Karta kredytowa nie jest wymagana.

Czytaj więcej