Besplatni alati veštačke inteligencije koje pokreće zajednica, TTS i API-jevi za Twitch streamere
Besplatni alati veštačke inteligencije koje pokreće zajednica, TTS i API-jevi za Twitch streamere

Kako generisati AI slike u Streamer.bot uz prilagođenu skriptu

Saznajte kako da generišete besplatne AI slike za vaš Twitch stream direktno unutar Streamer.bot-a, dodavanjem prilagođene Execute Code skripte, bez potrebe za middleware-om treće strane.
Ova stranica je prevedena sa engleskog od strane naših veoma motivisanih AI pripravnika radi vaše udobnosti. Oni još uče, pa se mogu pojaviti neke greške. Za najtačnije informacije molimo vas da pogledate englesku verziju.
Хоме Vodiči Kako Da Uradite Kako generisati AI slike u Streamer.bot uz prilagođenu skriptu

PotatoHotDog nudi besplatan API za generisanje AI slika koji možete pozvati direktno iz Streamer.bot, bez potrebe za bilo kakvim posredničkim softverom treće strane. Ovaj vodič prikazuje kako da dodate malu prilagođenu C# skriptu u podakciju Execute Code unutar Streamer.bot-a koja generiše AI sliku iz tekstualnog prompta i preuzima je na disk.

Potrebno je samo vaš PotatoHotDog API ključ i prompt koji opisuje sliku koju želite da se generiše, a preuzeta slika se čuva u posebnom folderu unutar instalacionog direktorijuma vašeg Streamer.bot.

Pripremite API ključ

Ako ga još nemate, kreirajte API ključ u svom kontrolnom panelu i držite ga pri ruci, biće vam potreban u sledećem koraku.

Idi na API ključeve Kreiraj API ključ u PotatoHotDog nadzornoj ploči

Preduslovni Argumenti

Da biste generisali AI sliku, dva argumenta moraju biti navedeni u Streamer.bot pre nego što se Execute Code podakcija pokrene. Drugim rečima, ove dve stvari treba da budu navedene:

  • API ključ.
  • Uputstva za prompt koja opisuju sliku koju želite da generišete.

Ovo se odnosi na sledeće argumente Streamer.bot-a:

  • potatoKey
  • potatoInstructions

Specifikujete argumente u vašoj akciji desnim klikom na Sub Actions, zatim izaberite Add, Core, Arguments i na kraju Set Argument.

Dodaj podakciju Set Argument u Streamer.bot

Dodavanje akcije Execute Code u Streamer.bot

Otvorite Streamer.bot i idite na karticu Akcije. Kreirajte novu akciju ili otvorite postojeću i dajte joj naziv koji ćete kasnije prepoznati, na primer "PotatoHotDog AI Image".

Kada je vaša akcija izabrana, kliknite Dodaj ispod Pod Akcije, zatim izaberite Core, a zatim Execute C# Code. Ovo dodaje pod akciju u kojoj možete zalepiti sirovi C# kod koji Streamer.bot kompajlira i izvršava u realnom vremenu.

Dodaj podakciju 'Execute C# Code' u Streamer.bot

Nalepi skriptu ispod u uređivaču koda. Ona učitava argumente potatoKey i potatoInstructions, poziva naš Generate AI Image API da generiše sliku i dobije njen URL, a zatim preuzima nastalu sliku u mapi pod nazivom temp_potatohotdog_images unutar vašeg Streamer.bot instalacionog direktorijuma.

using System; using System.IO; using System.Net.Http; using Newtonsoft.Json.Linq; public class CPHInline { // Tracks the version of this script for troubleshooting and support. private const string VERSION = "1.0.0"; // Base URL for the endpoint that generates an AI image. private const string BASE_URL_GENERATE = "https://api-generate-image-v1.potatohotdog.com/"; // Tracks the next numbered log argument. private int logIndex = 0; // Reuses one HTTP client for all API requests. private static readonly HttpClient httpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(30) }; // Adds a log message as a numbered action argument. private void Log(string message) { // Stores the message under a numbered key. CPH.SetArgument($"potatoLog{logIndex}", message); // Advances the log index for the next message. logIndex++; // Keeps the total log count in sync. CPH.SetArgument("potatoLogCount", logIndex); } // Ensures a required action argument exists and is not empty. private bool RequireArgument(string name, out string value) { // Fails when the argument is missing or blank. if (!CPH.TryGetArg(name, out value) || string.IsNullOrWhiteSpace(value)) { value = ""; return false; } return true; } // URL-encodes a value so it can safely be used in a query string. private string EncodeUrlValue(string value) { // Escapes reserved characters for safe use in a URL. return Uri.EscapeDataString(value); } // Performs an HTTP GET request and returns the response body. private string HttpGet(string url) { try { Log($"GET {url}"); // Sends the HTTP request synchronously. HttpResponseMessage response = httpClient.GetAsync(url).GetAwaiter().GetResult(); // Reads the complete response body. string responseBody = response.Content.ReadAsStringAsync().GetAwaiter().GetResult(); Log($"HTTP status: {(int)response.StatusCode} {response.ReasonPhrase}"); // Stops when the server returns an unsuccessful status code. if (!response.IsSuccessStatusCode) { Log($"Error: HTTP request failed with status {(int)response.StatusCode} {response.ReasonPhrase}."); // Logs the server error response when available. if (!string.IsNullOrWhiteSpace(responseBody)) { Log($"Error response: {responseBody}"); } return null; } Log($"Received {responseBody.Length} characters."); return responseBody; } catch (Exception exception) { // Logs network, timeout, and other HTTP-related exceptions. Log($"Error: HTTP request failed: {exception.Message}"); return null; } } // Downloads a file from a URL and saves it to disk. private bool DownloadFile(string url, string destinationPath) { try { Log($"Downloading image from \"{url}\"."); Log($"Saving image to \"{destinationPath}\"."); // Sends the image download request. HttpResponseMessage response = httpClient.GetAsync(url).GetAwaiter().GetResult(); Log($"Image download HTTP status: {(int)response.StatusCode} {response.ReasonPhrase}"); // Reads the complete image response into memory. byte[] fileData = response.Content.ReadAsByteArrayAsync().GetAwaiter().GetResult(); // Stops when the image server returns an unsuccessful status. if (!response.IsSuccessStatusCode) { Log($"Error: Image download failed with status {(int)response.StatusCode} {response.ReasonPhrase}."); return false; } // Rejects an empty image response. if (fileData == null || fileData.Length == 0) { Log("Error: The downloaded image file is empty."); return false; } // Writes the downloaded image bytes to the destination file. File.WriteAllBytes(destinationPath, fileData); Log($"Downloaded {fileData.Length} image bytes."); // Confirms that the image file now exists on disk. if (!File.Exists(destinationPath)) { Log("Error: The image download completed, but the file does not exist on disk."); return false; } // Reports the final file size from disk. FileInfo fileInfo = new FileInfo(destinationPath); Log($"Image file saved successfully. File size: {fileInfo.Length} bytes."); return true; } catch (Exception exception) { // Logs download, filesystem, and permission errors. Log($"Error: Could not download the image file: {exception.Message}"); return false; } } // Extracts a required string value from a JSON response. private bool TryGetJsonString(string json, string propertyName, out string value) { value = ""; try { // Parses the response body as a JSON object. JObject jsonObject = JObject.Parse(json); // Retrieves the requested JSON property. JToken property = jsonObject[propertyName]; if (property == null) { Log($"Error: JSON response does not contain \"{propertyName}\"."); return false; } value = property.ToString(); // Rejects empty JSON string values. if (string.IsNullOrWhiteSpace(value)) { Log($"Error: JSON property \"{propertyName}\" is empty."); value = ""; return false; } return true; } catch (Exception exception) { // Logs malformed JSON and property conversion errors. Log($"Error: Could not parse JSON property \"{propertyName}\": {exception.Message}"); return false; } } // Creates and returns the dedicated PotatoImage folder. private string GetImageFolder() { // Uses Streamer.bot's application directory instead of the process working directory. string streamerBotFolder = AppDomain.CurrentDomain.BaseDirectory; // Places generated image files inside a dedicated subfolder. string imageFolder = Path.Combine(streamerBotFolder, "temp_potatohotdog_images"); Log($"Streamer.bot folder: \"{streamerBotFolder}\"."); Log($"Image folder: \"{imageFolder}\"."); // Creates the image folder if it does not already exist. if (!Directory.Exists(imageFolder)) { Log("Image folder does not exist. Creating it..."); Directory.CreateDirectory(imageFolder); Log("Image folder created."); } else { Log("Image folder already exists."); } return imageFolder; } // Runs the main PotatoHotdog AI image action. public bool Execute() { // Resets log numbering for this execution. logIndex = 0; CPH.SetArgument("potatoLogCount", 0); Log("Starting script..."); // Logs the script version so runs can be tracked over time. Log($"Version: {VERSION}"); // Retrieves the PotatoHotdog API key. if (!RequireArgument("potatoKey", out string potatoKey)) { Log("Error: potatoKey variable is missing. Please login to potatohotdog.com, generate an API key, create a set variable action and save the variable \"potatoKey\" with your key."); return false; } // Retrieves the prompt instructions describing the image to generate. if (!RequireArgument("potatoInstructions", out string potatoInstructions)) { Log("Error: potatoInstructions variable is missing. Create a set variable action and save the variable \"potatoInstructions\" with a description of the image you want generated."); return false; } // Logs the non-secret input values. Log("potatoKey was provided."); Log($"potatoInstructions=\"{potatoInstructions}\""); // Builds the API URL used to generate the AI image. string generateUrl = BASE_URL_GENERATE + "?key=" + EncodeUrlValue(potatoKey) + "&instructions=" + EncodeUrlValue(potatoInstructions); // Requests generation of the AI image. string generateJson = HttpGet(generateUrl); if (generateJson == null) { Log("Error: Failed to generate the AI image."); return false; } Log($"Generate response: {generateJson}"); // Extracts the generated item's ID, reused below as the local filename. if (!TryGetJsonString(generateJson, "itemID", out string itemID)) { Log("Error: Could not retrieve itemID from the generate response."); return false; } Log($"itemID=\"{itemID}\""); // Logs the generation duration when present, purely for troubleshooting. if (TryGetJsonString(generateJson, "duration", out string duration)) { Log($"duration={duration} second(s)"); } // Extracts the generated image URL from the response. if (!TryGetJsonString(generateJson, "imageURL", out string imageURL)) { Log("Error: Could not retrieve imageURL from the generate response."); return false; } Log($"imageURL=\"{imageURL}\""); string imageFolder; try { // Resolves and creates the dedicated PotatoImage directory. imageFolder = GetImageFolder(); } catch (Exception exception) { Log($"Error: Could not create or access the image folder: {exception.Message}"); return false; } // Reuses the item's own ID as the local filename instead of minting a new one. string imageFileName = $"{itemID}.png"; // Combines the image folder and unique filename. string imageFilePath = Path.Combine(imageFolder, imageFileName); Log($"Generated image filename: \"{imageFileName}\"."); Log($"Local image path: \"{imageFilePath}\"."); // Downloads the generated image file to the PotatoImage folder. if (!DownloadFile(imageURL, imageFilePath)) { Log("Error: Failed to download the generated AI image."); return false; } // Stores the remote image URL as a final action argument. CPH.SetArgument("potatoGeneratedImageURL", imageURL); // Stores the absolute local file path as a final action argument. CPH.SetArgument("potatoGeneratedImageFile", imageFilePath); Log($"potatoGeneratedImageURL=\"{imageURL}\""); Log($"potatoGeneratedImageFile=\"{imageFilePath}\""); Log("Finished."); return true; } }

Nakon što nalepiš skriptu, podseti se da klikneš na Find Refs i Compile i uveri se da se kompajlira uspešno. Sačuvaj akciju, zatim je pokreni ručno ili je povežiš sa komandom ili nagradom za poene kanala da testiraš da li je slika pravilno generisana.

Zalepi skriptu i kompajliraj je u Streamer.bot

Pregledajte preuzetu sliku

Nakon što se akcija izvršila, možete proveriti varijable akcije putem Istorije akcija kako biste potvrdili da je sve funkcionisalo onako kako se očekivalo.

Tamo ćete pronaći lokalnu putanju do lokacije na kojoj je generisana slika sačuvana na disku, unutar fascikle temp_potatohotdog_images u vašem direktorijumu za instalaciju Streamer.bot.

Pregledajte varijable generisanih slika u istoriji radnji

Otvorite taj folder da biste direktno videli preuzetu sliku.

Pregledajte varijable akcije putem istorije akcija u Streamer.bot

Otklanjanje problema

Ako skripta ne radi onako kako se očekuje, najbolji način da rešite problem je proverom logova akcija.

Možete to uraditi tako što ćete proveriti svoje varijable akcije putem Istorije akcija.

Pregledajte varijable akcije putem istorije akcija u Streamer.bot

Ovaj vodič je prvi put objavljen 2026-07-19 i poslednji put izmenjen 2026-07-19.

Ostali slični vodiči

Evo još nekoliko vodiča koji bi vam mogli biti od koristi.

Kako povezati Streamer.bot sa AI
Kako povezati Streamer.bot sa AI
Saznajte kako da generišete besplatne AI (LLM) odgovore za vaš Twitch stream u Streamer.bot-u koristeći Fetch URL podakciju i PotatoHotDog Generate AI Response API, bez potrebe za prilagođenim skriptama.
Pročitaj vodič
Kako da besplatno pustite TTS zvuk u Streamer.bot uz dinamične Browser izvore
Kako da besplatno pustite TTS zvuk u Streamer.bot uz dinamične Browser izvore
Saznajte kako da reproducujete besplatan AI TTS (Text-to-Speech) audio za vaš Twitch stream uz pomoć Dynamic Browser Source-a i jednostavnog Fetch URL webhook zahteva, bez potrebe za prilagođenim skriptama.
Pročitaj vodič
Kako igrati besplatan TTS audio u Streamer.bot uz prilagođenu skriptu
Kako igrati besplatan TTS audio u Streamer.bot uz prilagođenu skriptu
Naučite kako da reproducujete besplatan AI TTS zvuk za vaš Twitch stream direktno unutar Streamer.bot-a, dodavanjem prilagođenog skripta Execute Code, a Speaker.bot nije potreban.
Pročitaj vodič