Skip to content

AI Tvorba obsahu NFT pomocí OpenAI

Štefan Prokop edited this page Mar 29, 2023 · 4 revisions

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íč:

obrazek

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ě:

OpenAI-test

Clone this wiki locally