spicyapiDokumentacja
Aplikacje i wtyczki
Treść główna

Bot na Telegram i Discord

Uruchom własnego, prywatnego bota, który tworzy obrazy i wideo, animuje zdjęcia i rozmawia z postaciami, które zdefiniujesz, płatnego z salda SpicyAPI, z limitami wydatków sprawdzanymi przed każdą opłatą.

Bot SpicyAPI to mały program, który uruchamiasz sam. Łączy się z Telegramem (a jeśli chcesz, także z Discordem) i pozwala osobom, którym na to pozwolisz, generować obrazy, tworzyć wideo, zamieniać obrazy w wideo i rozmawiać z postaciami, które zdefiniujesz. Wszystko jest opłacane z twojego własnego salda SpicyAPI, a każde żądanie jest wyceniane, zanim cokolwiek zostanie pobrane.

Bot jest bezpłatny i ma otwarty kod (MIT): github.com/spicyapi-ai/spicyapi-bot. Domyślnie jest prywatny: dopóki nie dopuścisz innych osób lub grup, możesz z niego korzystać tylko ty.

W skrócie

  1. W konsoli utwórz klucz API wyłącznie dla bota i nadaj mu dzienny limit wydatków.
  2. W Telegramie napisz do @BotFather, wyślij /newbot i skopiuj token.
  3. Sklonuj repozytorium, skopiuj .env.example do .env, uzupełnij SPICY_API_KEY, TELEGRAM_BOT_TOKEN i OWNER_ID, a potem uruchom docker compose up -d --build.
  4. Otwórz swojego bota w Telegramie, wyślij /start, zaakceptuj zasady i wypróbuj /pic a cozy cabin in the snow.

Co robi bot

  • Obrazy: /pic a lighthouse at dusk
  • Wideo: /vid waves rolling onto a beach at sunset
  • Animate: dotknij Animate pod dowolnym obrazem stworzonym przez bota albo odpowiedz na niego poleceniem /animate <jak ma się poruszać>.
  • Czat z postacią: pisz na czacie prywatnym albo użyj /talk. Odpowiedzi spływają strumieniem do jednej wiadomości.
  • Ochrona wydatków: każde żądanie jest najpierw wyceniane (wyceny są bezpłatne), drogie wymagają dotknięcia Confirm, a dzienne limity na osobę i na cały bot są egzekwowane.
  • Domyślnie prywatny: nikt inny nie może go używać, dopóki go nie dopuścisz.

Katalog SpicyAPI zawiera modele bez cenzury, które nie dodają własnego filtra treści, a bot działa z dowolnym wybranym modelem. Prawo i polityka treści SpicyAPI nadal obowiązują wszystko, co generujesz. Zobacz Treści i odpowiedzialność za korzystanie.

Polecenia

PolecenieCo robi
/pic <prompt>Generuje obraz
/vid <prompt>Generuje wideo z tekstu
/animate <motion>Odpowiedz na obraz, aby zamienić go w wideo. Obrazy stworzone przez bota działają zawsze; twoje własne zdjęcia tylko wtedy, gdy operator ustawił ALLOW_PHOTO_UPLOADS=true
Przycisk AnimatePod każdym wygenerowanym obrazem: animuje go, używając jego promptu
/talk <message>Rozmowa z bieżącą postacią (na czacie prywatnym możesz po prostu pisać)
/personaWybór postaci
/newchatZapomina rozmowę i zaczyna od nowa
/modelsWybór modeli obrazu, wideo, animacji i czatu
/spendIle wydano dzisiaj; właściciel widzi też wydatki całego bota i saldo konta
/report <text>Wysyła zgłoszenie do operatora
/helpPodsumowanie tego wszystkiego

Nazwy celowo nie brzmią /image, /video ani /chat, których używają inne popularne boty, dzięki czemu ten bot może dzielić grupę z nimi. W grupie na Telegramie odpowiedz na jedną z wiadomości czatu bota, aby dalej rozmawiać z postacią.

Zanim zaczniesz

  • Komputer lub serwer, który stale działa, z zainstalowanym Dockerem. (Albo konto Railway, patrz niżej.)
  • Konto SpicyAPI z saldem. Zobacz Przygotuj konto i Rozliczenia.
  • Konto na Telegramie, aby utworzyć bota przez BotFather.

Wdrożenie przez Docker Compose

Utwórz klucz dla bota

W konsoli utwórz nowy klucz API wyłącznie dla tego bota. Nadaj temu kluczowi dzienny limit wydatków i, jeśli chcesz, listę dozwolonych modeli.

Bot ma też własne limity, ale limit klucza egzekwuje samo SpicyAPI, więc obowiązuje nawet wtedy, gdy bot jest źle skonfigurowany albo jego dane zginą. Nowe klucze nie mają limitu, dopóki go nie ustawisz. Zobacz Uwierzytelnianie.

Utwórz bota na Telegramie

Otwórz @BotFather, wyślij /newbot, wybierz nazwę i nazwę użytkownika, a potem skopiuj token, który dostaniesz. Wygląda jak 123456789:AA....

Skonfiguruj

git clone https://github.com/spicyapi-ai/spicyapi-bot.git
cd spicyapi-bot
cp .env.example .env

Otwórz .env i uzupełnij trzy wymagane linie:

SPICY_API_KEY=sk-spicy-...
TELEGRAM_BOT_TOKEN=123456789:AA...
OWNER_ID=your-telegram-user-id

Każda pozostała linia ma bezpieczną wartość domyślną. .env.example wyjaśnia każde ustawienie.

Sprawdź swój identyfikator użytkownika na Telegramie (jeśli go nie znasz)

Na razie wpisz OWNER_ID=0 i dokończ następny krok. Potem wyślij botowi dowolną wiadomość, a odpowie twoim identyfikatorem. Wpisz ten numer w OWNER_ID i zrestartuj:

docker compose up -d

Uruchom

docker compose up -d --build
docker compose logs -f

Gdy bot jest gotowy, w logu pojawia się Telegram bot @yourbot is running.

Wypróbuj

Otwórz swojego bota na Telegramie, wyślij /start, jednorazowo zaakceptuj zasady i wyślij /pic a cozy cabin in the snow. Domyślny model obrazu kosztuje około $0.01 za obraz.

Aby później zaktualizować bota, uruchom git pull && docker compose up -d --build.

Wdrożenie na Railway

Railway może uruchomić bota bez własnego serwera. Nie ma szablonu na jedno kliknięcie: wdrażasz z własnej kopii repozytorium.

Utwórz projekt

W Railway wybierz New Project > Deploy from GitHub repo i wskaż swój fork. Railway znajdzie Dockerfile i go zbuduje.

Dodaj zmienne

Otwórz kartę Variables usługi i dodaj SPICY_API_KEY, TELEGRAM_BOT_TOKEN i OWNER_ID, a także każde inne ustawienie z .env.example.

Podłącz wolumen

Kliknij usługę prawym przyciskiem myszy, wybierz Attach volume i użyj ścieżki montowania /data. Bez wolumenu każde ponowne wdrożenie zapomina dzisiejsze wydatki i ustawienia wszystkich osób.

Wdróż

Wdróż i sprawdź w logach, czy jest Telegram bot @yourbot is running.

Zostaw usługę na jednej replice: dwie kopie odpytujące ten sam token Telegrama walczą o aktualizacje. Bot nie potrzebuje publicznej domeny ani otwartego portu.

Dodaj Discorda (opcjonalnie)

Utwórz aplikację

W Discord Developer Portal utwórz aplikację, otwórz Bot, zresetuj i skopiuj token, a opcję Public Bot wyłącz, abyś tylko ty mógł dodawać bota do serwerów. Uprzywilejowane intents nie są potrzebne.

Zaproś go na swój serwer

W OAuth2 > URL Generator zaznacz zakresy bot i applications.commands oraz uprawnienia Send Messages, Attach Files, Embed Links i Read Message History. Otwórz wygenerowany link i dodaj bota do serwera.

Skonfiguruj

W .env ustaw:

  • DISCORD_TOKEN na token bota.
  • DISCORD_GUILD_ID na identyfikator twojego serwera, jeśli chcesz, aby polecenia pojawiły się od razu, a nie po krótkim globalnym wdrożeniu.
  • OWNER_ID tak, aby zawierał twój identyfikator użytkownika Discorda, na przykład OWNER_ID=tg:123,dc:456. Prefiksy tg: i dc: przypisują identyfikator do jednej platformy.
  • ALLOWED_CHAT_IDS na identyfikator kanału lub serwera, na którym bot ma odpowiadać.

Aby znaleźć identyfikatory, włącz tryb dewelopera (User Settings > Advanced), a potem kliknij prawym przyciskiem użytkownika, kanał lub serwer i wybierz Copy ID. Zrestartuj bota.

Oznacz kanał jako z ograniczeniem wiekowym

Obrazy i wideo działają tylko na kanałach z ograniczeniem wiekowym: Edit Channel > Overview > Age-Restricted Channel. Polecenia /pic i /vid są zarejestrowane jako objęte ograniczeniem wiekowym, więc Discord pokazuje je tylko tam.

Czat (/talk albo wzmianka o bocie) działa na każdym dozwolonym kanale, chyba że ustawisz DISCORD_CHAT_REQUIRES_NSFW=true, co ogranicza czat także do kanałów z ograniczeniem wiekowym.

Discord nie dopuszcza aplikacji z poleceniami objętymi ograniczeniem wiekowym w swoim App Directory, więc zostaw bota prywatnego. .env.example zawiera też DISCORD_MEDIA_IN_DMS, domyślnie false: obrazy i wideo działają wtedy tylko na kanałach serwera z ograniczeniem wiekowym, a nie w wiadomościach prywatnych.

Kto może z niego korzystać

UstawienieDomyślnieEfekt
OWNER_IDwymaganeTy. Zawsze dopuszczony, nie obowiązuje go dzienny limit na osobę i tylko ty widzisz saldo konta. Kilka identyfikatorów oddziel przecinkami.
ALLOWED_USER_IDSpusteInne osoby dopuszczone na czatach prywatnych. Puste oznacza, że tylko ty.
ALLOWED_CHAT_IDSpusteGrupy (Telegram) albo kanały i serwery (Discord), w których bot odpowiada. Puste oznacza, że w żadnych grupach.
REQUIRE_CONSENTtrueKażdy raz potwierdza, że ma ukończone 18 lat i będzie przestrzegać zasad dotyczących treści.

Obcy, którzy znajdą bota, dowiadują się, że jest prywatny, i dostają swój identyfikator użytkownika, który mogą ci przesłać. Grupy są ignorowane, dopóki nie znajdą się w ALLOWED_CHAT_IDS; gdy grupa jest na liście, z bota może korzystać każdy jej członek, w granicach dziennych limitów. Identyfikatory grup na Telegramie są ujemne, na przykład -1001234567890.

Nie ustawiaj ALLOWED_USER_IDS=*

ALLOWED_USER_IDS=* czyni bota publicznym i pozwala każdemu, kto go znajdzie, wydawać twoje saldo. Użyj tego tylko wtedy, gdy naprawdę tego chcesz.

To ty prowadzisz tego bota i odpowiadasz za to, komu pozwalasz z niego korzystać. Obowiązuje regulamin SpicyAPI, w tym regiony, w których SpicyAPI nie świadczy usług.

Jak działają wydatki

  1. Najpierw cena. Każdy obraz lub wideo jest wyceniany przez SpicyAPI, zanim cokolwiek się wydarzy. Wyceny są bezpłatne.
  2. Twardy pułap. Jeśli żądanie mogłoby kosztować więcej niż MAX_COST_PER_REQUEST_USD (domyślnie $1), jest odrzucane. Nic nie jest pobierane.
  3. Potwierdzenie. Jeśli mogłoby kosztować więcej niż CONFIRM_ABOVE_USD (domyślnie $0.10), bot pokazuje cenę z przyciskami Confirm i Cancel. Potwierdzić może tylko osoba, która o to poprosiła.
  4. Dzienne limity. Każda osoba może wydać USER_DAILY_BUDGET_USD (domyślnie $1) na dobę UTC, a cały bot DAILY_BUDGET_USD (domyślnie $5). Generowania, które jeszcze trwają, liczą się jako wydane do zakończenia, więc kilka żądań naraz nie przemknie obok limitu. Właścicieli obowiązuje tylko limit całego bota.
  5. Brak podwójnych opłat. Każde żądanie niesie klucz idempotentności wyprowadzony z wiadomości czatu albo dotknięcia przycisku, więc zduplikowana aktualizacja Telegrama albo podwójne dotknięcie zwraca zadanie, które już istnieje.
  6. Wyniki. Postęp jest pokazywany przez edytowanie jednej wiadomości co kilka sekund. Wynik pokazuje faktyczną opłatę i identyfikator zadania, który znajdziesz w sekcji Logs w konsoli.

Przyjętego generowania nie można anulować. Udane uruchomienia są płatne, a zwykłe niepowodzenia zwalniają rezerwację. Niektóre odmowy treści są płatne wyłącznie wtedy, gdy strona modelu mówi o tym wprost. Zobacz Rozliczenia.

Użyj klucza z limitem

Bot prowadzi własny rejestr w DATA_DIR/state.json. Jeśli ten plik zginie, bot zapomina, ile wydano dzisiaj. Limit na kluczu API w konsoli to limit, którego nie da się stracić, bo egzekwuje go SpicyAPI. Utwórz osobny klucz dla bota, ustaw dzienny limit wydatków i opcjonalnie dopuść tylko modele, które chcesz. Gdy limit zostanie osiągnięty, bot informuje, że klucz osiągnął limit wydatków.

Inne przydatne ustawienia:

UstawienieDomyślnieCo robi
MAX_CONCURRENT_TASKS_PER_USER2Ile obrazów i wideo jedna osoba może mieć uruchomionych jednocześnie
VIDEO_SECONDS / VIDEO_RESOLUTION5 / 480pDługość i rozmiar wideo, dopasowane do tego, na co pozwala każdy model. Krótsze i mniejsze jest tańsze
ALLOWED_MODELSpusteOgranicza menu /models. Dokładne identyfikatory albo prefiksy kończące się na *, na przykład alibaba/*

Modele i ceny

Każda osoba może zmienić swoje modele poleceniem /models. Operator ustawia wartości domyślne:

ZmiennaDomyślnieKoszt w chwili pisania
DEFAULT_IMAGE_MODELZ-Image Turbo, tekst na obrazOkoło $0.01 za obraz
DEFAULT_VIDEO_MODELMiniMax H3, tekst na wideoOkoło $0.037 za sekundę w 768p
DEFAULT_ANIMATE_MODELMiniMax H3, obraz na wideoOkoło $0.037 za sekundę w 768p
DEFAULT_CHAT_MODELDeepSeek V4.1 FlashDowolny model czatu z katalogu

Dokładne identyfikatory modeli są w .env.example; aby zmienić model, skopiuj inny identyfikator z aktualnego katalogu (GET /api/v1/models; w przykładzie postaci poniżej MODEL_ID_FROM_CATALOG oznacza miejsce, w które taki identyfikator trafia). Ceny pochodzą z publicznego katalogu i mogą się zmieniać; bot zawsze pokazuje aktualną wycenę. Modele przeglądasz na spicyapi.ai/models albo w Katalogu modeli i schematach. Do roleplay ranking roleplay pomaga wybrać model czatu.

Postacie

Postacie znajdują się w pliku JSON (CHARACTERS_FILE, domyślnie characters/default.json, który zawiera dwie przykładowe postacie):

{
  "characters": [
    {
      "id": "mira",
      "name": "Mira",
      "system": "You are Mira, ... Never speak or act for {{user}}.",
      "greeting": "Welcome aboard, {{user}}!",
      "model": "MODEL_ID_FROM_CATALOG"
    }
  ]
}
  • system to instrukcje postaci. greeting (opcjonalne) to jej pierwsza kwestia. model (opcjonalne) przypina model czatu do tej postaci.
  • {{char}} i {{user}} są zastępowane imieniem postaci i imieniem osoby.
  • Wpisami mogą być też JSON-y Character Card V2, czyli format eksportowany przez większość serwisów z postaciami i przez SillyTavern. Używane są opis, osobowość, scenariusz, przykładowy dialog i pierwsza wiadomość.

W Dockerze zamontuj własny plik i wskaż go w ustawieniu. W docker-compose.yml:

volumes:
  - ./my-characters.json:/app/characters/custom.json:ro

A w .env:

CHARACTERS_FILE=characters/custom.json

Bot pamięta HISTORY_TURNS wymian na rozmowę (domyślnie 20) i ogranicza odpowiedzi do CHAT_MAX_TOKENS tokenów (domyślnie 2048). Modele z rozumowaniem wliczają swoje myślenie do tego limitu, więc bardzo mała wartość może nie zostawić miejsca na odpowiedź. Więcej o pisaniu postaci znajdziesz w Chat recipes.

Wysyłanie zdjęć jest domyślnie wyłączone

Domyślnie można animować tylko obrazy wygenerowane przez bota. Zamienianie zdjęć prawdziwych osób w wideo to główny sposób, w jaki nadużywa się takich botów, a osoba na zdjęciu nie zgodziła się pojawić w twoim wideo.

Jeśli ustawisz ALLOW_PHOTO_UPLOADS=true, każdy, komu pozwolisz, może animować zdjęcie, które wyśle. Włączaj to tylko dla osób, którym ufasz, i tylko dla zdjęć dorosłych, którzy się na to zgodzili. Gdy opcja jest włączona, przesłane obrazy są pobierane przez bota i przechowywane w SpicyAPI. Linki do plików Telegrama nigdy nie są przekazywane dalej, ponieważ zawierają token twojego bota.

Prywatność: co jest przechowywane i gdzie

CoGdzieJak długo
Dzienne sumy wydatków, wybór modelu i postaci każdej osoby, kto zaakceptował zasadystate.json w DATA_DIR (wolumen w Dockerze)Dopóki go nie usuniesz
Historia czatuTylko pamięćZapominana po restarcie, po dobie bezczynności albo przez /newchat
Logi botaTwój komputerTylko identyfikatory zadań i kwoty, nigdy prompty ani media
Prompty i wynikiSpicyAPIOkres przechowywania twojego konta; zobacz Przechowywanie i usuwanie danych

Ustaw RETENTION_SECONDS, aby poprosić SpicyAPI o usunięcie wyników i promptów wcześniej niż wynosi domyślny okres twojego konta.

W grupach wyniki są ukryte za spoilerem (SPOILER_MEDIA, domyślnie groups; inne wartości to always i never). /report przekazuje wiadomość właścicielowi. Treści naruszające zasady SpicyAPI można też zgłaszać na spicyapi.ai/abuse.

Rozwiązywanie problemów

Komunikat lub objawCo zrobić
„out of balance” (40201)Doładuj saldo SpicyAPI.
„reached the spend cap” (40202)Osiągnięto limit klucza w konsoli. Zwiększ go albo poczekaj.
„not allowed to use that model” (40301)Dopuść model na kluczu w konsoli albo wybierz inny przez /models.
„has not verified its email” (40310)Otwórz link weryfikacyjny od SpicyAPI.
„The model declined this request”Model odrzucił prompt. Dostosuj żądanie albo wybierz inny model. Sprawdź zasady naliczania opłat za odmowy na stronie modelu.
Conflict: terminated by other getUpdates requestDwie kopie bota używają tego samego tokenu. Zatrzymaj jedną.
Brak poleceń Discorda/pic i /vid pojawiają się tylko na kanałach z ograniczeniem wiekowym. Polecenia globalne mogą potrzebować chwili, by się pojawić; ustaw DISCORD_GUILD_ID, aby rejestracja była natychmiastowa.
Błędy sieci za proxyfetch w Node ignoruje HTTPS_PROXY, chyba że bot startuje z NODE_USE_ENV_PROXY=1.
Bot odpowiada liczbą, gdy do niego piszeszTo twój identyfikator użytkownika. Wpisz go w OWNER_ID i zrestartuj.

Kody błędów wyjaśnia strona Błędy.

Na tej stronie