-
Notifications
You must be signed in to change notification settings - Fork 7
AI Tvorba obsahu NFT pomocí OpenAI
V rámci tohoto článku je popsáno, jak vytvořit obsah NFT pomocí OpenAI nástrojů.
V době psaní článku jsou dané funkce ve větvi 172-automatic-nft-description-by-ai.
Co se týče generování obecně, je pro tento účel potřeba využít pokročilou AI, jako je například ChatGPT od OpenAI. Pro API OpenAI již existuje několik wrapperů. V tuto chvíli byl do VEF integrován balíček Betalgo. Jeho jednoduchý wrap mezi byznys logikou a tímto balíčkem zajišťuje třída VirtualAssistant.cs.
Tento asistent je velmi zjednodušený a obsahuje jen několik základních příkazů. Nejdřív je potřeba získat svůj API klíč od OpenAI. Pokud jej nemáte, je potřeba si vytvořit účet u OpenAI a v nastavení si vygenerovat nový API klíč:
Pokud již klíč máte, je možné vytvořit instanci VirtualAssistant třídy a provést jeho inicializaci.
var assistant = new VirtualAssistant(apiKey);
var init = await assistant.InitAssistant();
if (init.Item1)
await Console.Out.WriteLineAsync("AI Assistant Initialized.");
Po dokončení tohoto kroku je již možné poslat konkrétní příkazy, jako je například přivítací fráze pro uživatele:
var welcome = await assistant.GetWelcome();
if (welcome.Item1)
{
Console.WriteLine("--------------Assistant---------------");
Console.WriteLine(welcome.Item2);
}
Celý test je možné najít zde.
V následujícím příkladu si ukážeme, jak vytvořit NFT Post. K tomu je vhodné vyplnit:
- Text
- Název
- Popis
- Tagy
- Obrázek
V rámci dema existují dvě možnosti, jak začít. Buď máme již k dispozici základní text, a nebo je potřeba nechat ho vytvořit pomocí AI.
Pokud už máme text v nějakém souboru, je možné si jej načíst pomocí FileHelpers:
var text = FileHelpers.ReadTextFromFile(fileName);
Pokud ne, můžeme se zeptat ChatGPT následujícím způsobem:
var storybase = "efektivní spolupráci lidí.";
Console.WriteLine("Creating base text...");
// create random text by ChatGPT
var baseEn = "Create some short article about how people could treat each other better. Output will be in Markdown.";
var baseCz = "Vytvoř prosím krátký článek o tom, jak by se k sobě lidé mohli chovat lépe. Výstup bude Markdown.";
if (!string.IsNullOrEmpty(storybase))
{
baseCz = "Vytvoř prosím krátký článek o " + storybase + ". Výstup bude Markdown.";
}
var story = await assistant.SendSimpleQuestion(baseCz, articleLength);
if (story.Item1)
{
Console.WriteLine("Text created: ");
Console.WriteLine("-------------------------");
Console.WriteLine(story.Item2);
Console.WriteLine("-------------------------");
text = story.Item2;
}
Tímto jsme získali základní text, který je uložený v proměnné text
. Ten můžeme dále použít k vytvoření názvu, popisu a tagů NFT:
Console.WriteLine("Creating NFT content...");
// Create set of the data for the new NFT based on the input text
var nft = new PostNFT("");
var responseForNFT = await assistant.GetNewDataForNFT(text);
if (responseForNFT.Item1)
{
var nftInput = responseForNFT.Item2;
nft.Name = nftInput.Name;
nft.Description = nftInput.Description;
nft.Tags = nftInput.Tags;
nft.Text = text;
Console.WriteLine("");
Console.WriteLine("-------------------------");
Console.WriteLine("Design of NFT:");
Console.WriteLine($"Name: {nft.Name}");
Console.WriteLine($"Description: {nft.Description}");
Console.WriteLine($"Tags: {nft.Tags}");
Console.WriteLine($"Text: {nft.Text}");
Console.WriteLine("-------------------------");
}
Pokud chceme nechat vygenerovat také obrázek pro NFT, je potřeba si nejdříve inicializovat StorageDriver, abychom mohli obrázek uploadnout na IPFS:
//init the storage driver
IPFSHelpers.GatewayURL = "https://ve-framework.com/";
var res = await Storage.AddDriver(new StorageDriverConfigDto()
{
Type = "IPFS",
Name = "ChatGPTDriver",
Location = "Cloud",
ID = "ChatGPT",
IsPublicGateway = true,
IsLocal = false,
ConnectionParams = new StorageDriverConnectionParams()
{
APIUrl = "https://ve-framework.com/",
APIPort = 443,
Secured = false,
GatewayURL = "https://ve-framework.com/ipfs/",
GatewayPort = 443,
}
});
Poté je možné vytvořit obrázek pomocí AI. To se provede tímto příkazem:
var responseForImage = await assistant.GetImageForText($"Název: {nft.Name}, Popis: {nft.Description}, Tagy: {nft.Tags}");
Proměnná responseForImage
obsahuje v Item1
výsledek true/false
podle úspěchu requestu. V Item2
je v případě úspěchu obrázek ve formátu Base64 string. Ten je potřeba převést na byte[]
a uploadnout na IPFS:
if (responseForImage.Item1 && !string.IsNullOrEmpty(responseForImage.Item2))
{
var item = new NFTDataItem()
{
Storage = DataItemStorageType.IPFS,
IsMain = true,
Type = DataItemType.Image
};
var link = string.Empty;
try
{
await Console.Out.WriteLineAsync("Uploading image to IPFS...");
var bytes = Convert.FromBase64String(responseForImage.Item2);
using (Stream stream = new MemoryStream(bytes))
{
//Request IPFS upload with StorageDriver
var result = await Storage.SaveFileToIPFS(new WriteStreamRequestDto()
{
Data = stream,
Filename = $"{DateTime.UtcNow.ToString("yyyy_MM_ddThh_mm_ss")}-{nft.Name.Replace(' ', '_')}.png",
DriverType = StorageDriverType.IPFS,
StorageId = "ChatGPT",
BackupInLocal = false,
});
if (result.Item1)
{
await Console.Out.WriteLineAsync("Upload finished.");
await Console.Out.WriteLineAsync("Image Link: " + result.Item2);
// store link to image for later use
link = result.Item2;
// store IPFS hash of image in DataItem
var hash = IPFSHelpers.GetHashFromIPFSLink(result.Item2);
if (!string.IsNullOrEmpty(hash))
item.Hash = hash;
}
else
Console.WriteLine("Cannot upload. " + result.Item2);
}
}
catch (Exception ex)
{
await Console.Out.WriteLineAsync("Cannot upload Image to IPFS. " + ex.Message);
}
}
Následně je možné vzít proměnné link
i item
a použít je pro vyplnění NFT:
Console.WriteLine($"Link to NFT Image: {link}");
nft.ImageLink = link;
nft.DataItems.Add(item);
Tím je NFT objekt připravený k mintování. K tomu je potřeba inicializovat účet. Pokud nemáte připravený Backup file z VENFT aplikace, vytvořte si adresu v nové VENFT App. Pokud nemáte k dispozici Neblio a tokeny, můžete požádat o Airdrop na VENFT About page. Pokud jej již máte k dispozici, tak lze načíst účet v kódu následovně:
var account = new NeblioAccount();
// load the Neblio Address for minting of NFT
Console.WriteLine("Loading VENFT Backup file.");
account.FirsLoadingStatus += Account_FirsLoadingStatus;
if (await account.LoadAccountFromVENFTBackup(password, "", backupFile))
Console.WriteLine($"Adresa {account.Address} loaded.");
Výpis načítání účtu obsluhuje handler, který jen vypíše příchozí zprávu do konzole:
private static void Account_FirsLoadingStatus(object? sender, string e)
{
Console.WriteLine("Loading of account: " + e);
}
Po načtení účtu je možné vymintovat NFT:
// Mint the NFT
if (!string.IsNullOrEmpty(link) && !string.IsNullOrEmpty(item.Hash))
{
nft.Author = $"{account.Profile.Name} {account.Profile.Surname}";
Console.WriteLine("Minting NFT...");
var mintres = await account.MintNFT(nft);
if (mintres.Item1)
{
Console.WriteLine("-------------------------");
Console.WriteLine("NFT minted.");
Console.WriteLine($"NFT minted. Transaction ID is: {mintres.Item2}");
Console.WriteLine("-------------------------");
}
}
else
{
await Console.Out.WriteLineAsync("Cannot mint without the image.");
}
Výstup z programu vypadá následovně: