-
Notifications
You must be signed in to change notification settings - Fork 7
AI AI Učitel Španělštiny s možností prodeje lekcí formou NFT
V tomto článku najdete popis jednoduché Blazor Server aplikace, která využívá ChatGPT k vytváření lekcí španělštiny z různých jazyků. Tyto lekce ukládá v podobě NFT na blockchain. Lekce jsou k dispozici zdarma, avšak kdokoliv si může koupit i kopie lekcí, které mu přijdou na jeho adresu v rámci účtu na VENFT App, kde si může lekce kdykoliv v budoucnu jednoduše najít.
Celá demo aplikace je k dispozici zde.
Aplikace je k dispozici i Online zde na https://learnlanguagewithai.azurewebsites.net/
Flow aplikace je jednoduché:
sequenceDiagram
participant Student
participant LearnLanguageWithAI
participant Blockchain
participant VENFTApp
Student->>LearnLanguageWithAI: navštíví aplikaci a zadá téma lekce
LearnLanguageWithAI->>LearnLanguageWithAI: vygeneruje pomocí AI novou lekci
LearnLanguageWithAI->>Blockchain: uloží lekci zdarma na blockchain
Note over Blockchain: lekce přidána do seznamu historie lekcí
loop Každá lekce
OtherStudents->>Blockchain: najít lekci v seznamu historie lekcí
OtherStudents->>VENFTApp: kopit lekci z VENFT Aplikace
end
OtherStudents->>LearnLanguageWithAI: platba za verifikaci transakce
LearnLanguageWithAI->>VENFTApp: odešle kopii lekce po verifikaci transakce s platbou
OtherStudents->>VENFTApp: najde a přečte si lekci ve své VENFT App kdykoliv potřebuje
Nyní ke kódu aplikace. Obecně vychází z apliakce MintFreeForAI, ke které je k dispozici článek zde. Než budete pokračovat, doporučuji si tento článek přečíst.
Jádro aplikace je v podstatě stejné. Jedná se o Blazor Server App s API kontrolerem. Aplikace načítá i Neblio blockchain účet, přes který se mintují NFT, a ten také zpracovává příchozí platby za články a mintuje kopie článků zákazníkům, kteří si kopii koupí.
Pro provoz takové aplikace potřebujete také OpenAI API klíč. Pro jeho získání je potřeba mít účet na OpenAI.com a vytvořit si nový klíč v nastavení účtu.
Hlavní odlišnost oproti aplikaci MintFreeForAI je hlavně ve zjednodušení všech formulářů. Vyplňuje se v podstatě jen:
- téma lekce
- komentář studenta
- přezdívka
Téma lekce může být například:
- "hotel"
- "návštěva lékaře"
- "nakupování automobilu"
- "pracovní pohovor"
apod.
Komentář studenta se připojuje na konec textu lekce jako feedback pro budoucí zlepšování (jeho zadání je volitelné).
Text generuje ChatGPT pomocí wrapovací třídy VirtualAssistant.cs. Konkrétně k tomu dochází v komponentě GetText.razor. Zde je postup jednoduchý. Podle typu jazyka (ty jsou definovány v rámci tohoto enumu) se sestaví request pro ChatGPT.
Narozdíl od MintFreeForAI se zde nezadává název článku ani tagy. Ty jsou vygenerovány automaticky během mintování. Proto bylo potřeba rozšířit funkci v rámci HomeController.cs.
Pro vytvoření Name, Tags a Descriptions bylo potřeba přidat následující část:
var tx = nft.Text;
if (tx.Length > 500)
tx = tx.Substring(0, 500);
var txt = await MainDataContext.Assistant.GetNewDataForNFT(tx);
if (txt.Item1)
{
nft.Name = txt.Item2.Name;
nft.Tags = txt.Item2.Tags.Replace("#", string.Empty);
nft.Description = txt.Item2.Description;
}
var lang = Enum.GetName(typeof(Languages), data.language);
if (!nft.Tags.Contains(lang))
nft.Tags += $" {lang}";
Nejdřív se upraví Text na maximální délku 500 znaků (předpokládá se, že v rámci toho už bude moct ChatGPT rozpoznat hlavní téma lekce). Poté se zavolá funkce GetNewDataForNFT v rámci instance VirtualAssistenta.
Do tagů se ještě přidá typ jazyka, například "cz2es" nebo "en2es", apod.
Aby bylo možné koupit NFT, je potřeba mu nastavit cenu a také příkaz, aby se prodávaly pouze kopie NFT:
nft.Price = 0.5;
nft.SellJustCopy = true;
Poté už je možné vymintovat NFT:
(bool, string) res = (false, string.Empty);
if (VEDLDataContext.Accounts.TryGetValue(MainDataContext.MainAccount, out var account))
{
var rcv = NeblioTransactionHelpers.ValidateNeblioAddress(data.receiver);
res = await account.MintNFT(nft, rcv);
await Task.Delay(500);
var tnft = await NFTFactory.GetNFT(NFTHelpers.TokenId, res.Item2, 0, 0, true);
if (tnft != null)
MainDataContext.MintedNFTs.TryAdd(tnft.Utxo, tnft);
}
else
res.Item2 = "Cannot find MainAccount.";
return res.Item2;
Lekci budete moct najít v seznamu posledních lekcí:
Případně si můžete otevřít celé znění lekce:
Seznam se získává z API. Konkrétně se jedná o funkci GetLastLessons.
V rámci této funkce se nejdřív zjistí jazyk, který se zadává jako parametr GET requestu:
try
{
var l = (Languages)Enum.Parse(typeof(Languages), language);
if (l != null)
lang = l;
}
catch (Exception ex)
{
throw new HttpResponseException((HttpStatusCode)501, $"Wrong language input!");
}
Podle jazyka se provede filtrace NFT, které obsahují tag daného jazyka. Ten se přidává před mintováním, jak bylo popsáno výše.
if (VEDLDataContext.Accounts.TryGetValue(MainDataContext.MainAccount, out var account))
{
if (lang == Languages.cz2es)
{
var nfts = account.NFTs.Where(n => n.Type == NFTTypes.Post && (n.Tags.Contains(language) || (n.Tags.Contains("lekce") && n.Tags.Contains("španělština") && n.Tags.Contains("čeština")))).ToList();
if (nfts != null && nfts.Count > 0)
return nfts;
}
else if (lang == Languages.en2es)
{
var nfts = account.NFTs.Where(n => n.Type == NFTTypes.Post && (n.Tags.Contains(language) || (n.Tags.Contains("lesson") && n.Tags.Contains("spanish") && n.Tags.Contains("english")))).ToList();
if (nfts != null && nfts.Count > 0)
return nfts;
}
else
{
var nfts = account.NFTs.Where(n => n.Type == NFTTypes.Post && n.Tags.Contains(language)).ToList();
if (nfts != null && nfts.Count > 0)
return nfts;
}
}
Protože v mém případě bylo první zkušební NFT vymintováno bez názvu jazyka, bylo nutné přidat dva custom filtry pro češtinu a angličtinu. Ty zohledňují i případnou kombinaci několika tagů, které způsobují, že když se vyskytují v NFT, jedná se také o lekci. Pokud se vychází pouze z tagu názvu jazyka, stačí jen poslední filtr:
var nfts = account.NFTs.Where(n => n.Type == NFTTypes.Post && n.Tags.Contains(language)).ToList();
if (nfts != null && nfts.Count > 0)
return nfts;
V UI se volá tento API příkaz následovně:
private async Task LoadNFT()
{
await LoadingStatus(true);
var result = await Http.GetAsync($"/api/GetLastLessons/{Enum.GetName(typeof(Languages),Language)}");
if (result.StatusCode == System.Net.HttpStatusCode.OK)
{
var returnStr = await result.Content.ReadAsStringAsync();
try
{
var nfts = JsonConvert.DeserializeObject<List<PostNFT>>(returnStr);
if (nfts != null)
NFTs = nfts;
}
catch (Exception ex)
{
Console.WriteLine("Cannot deserialize the NFT list: " + ex.Message);
}
}
await LoadingStatus(false);
}
Pokud chcete v UI zobrazit link na koupi NFT, nejjednodušší varianta je následující:
@if (NFT.PriceActive)
{
<Row Margin="Margin.Is2.FromTop">
<Column Flex="Flex.JustifyContent.Center">
<Button Color="Color.Secondary"
Block
Type="ButtonType.Link"
To="@("https://apptest.ve-nft.com/buynft?utxo=" + NFT.Utxo + "&index=0")"
Target="Target.Blank">
@BuyLesson
</Button>
</Column>
</Row>
}
Pokud je cena NFT aktivní (větší než 0), zobrazí se tlačítko s odkazem na VENFT App, ve které je integrovaná logika pro platební bránu a nákup NFT. Příklad odkazu na nákup článku je zde:
Pokud již máte vytvořený účet ve VENFT App, pak se po otevření odkazu načte tento screen:
Tam je potřeba vyplnit své heslo pro odemknutí VENFT App účtu, aby se mohla provést platba. Po odemčení se zobrazí i stav účtu, aby se ověřilo, jestli je k dispozici na adrese dostatečná částka pro nákup NFT.
Kromě 0.5 NEBL je potřeba mít také alespoň 10 VENFT tokenů, aby bylo možné poslat tzv. NFT Payment, která obsahuje informace pro zprocesování odeslání NFT. Na blockchainu je totiž možné zkombinovat do jedné transakce platbu i datovou část. Nositelem datové části jsou právě tokeny (v tomto případě VENFT tokeny).
Po odeslání transakce vypadá screen následovně:
Pod tlačítkem je možné najít odkaz na Neblio explorer, kde se cca do 30-60 sekund objeví záznam o provedené transakci. Vzorová transakce je zde.
Pro zjednodušení si můžete v tomto případě představit NFT Payment jako prázdný formulář pro objednávku, který má "vodoznak" VENFT a je na něm rovnou přidělaná bankovka s hodnotou přesně odpovídající výši platby za to, co kupujete.
NFT Payment obsahuje následující informace:
Key | Value |
---|---|
NFT | true |
Type | NFT Payment |
Price | 0.500000 |
Sender | Nh7712QcTBT49NA7f9sB3WqX5WjbGLUmo8 |
NFTUtxoTxId | 97dea20c7704fa5dd1f04f45831c1eba8144d4d5208bff87e0967b8cf789dd9b |
NFTUtxoIndex | 0 |
Zde je hlavní Price (Cena) a NFTUtxoTxId a NFTUtxoIndex - ty identifikují konkrétní NFT, které se kupuje.
Na detailu částek v transakci můžete vidět, že na adresu účtu, který vlastní NFT, bylo posláno opravdu 0.5 NEBL a 1 VENFT Token:
O zpracování odbavení NFT se stará logika NeblioAccountBase.cs.
Po zpracování transakce přijde do VENFT App článek. Viz následující pohled do Galerie NFT:
Transakce odbavení NFT je zde:
https://explorer.nebl.io/tx/48b9e8268f36bbb0193768745f338792bc5b8a8c458131938da24dc8f01f4890
V rámci této transakce probíhá opět několik kroků současně. Pro pochopení je potřeba se podívat na detaily transakce ve formě JSON. Tu je možné najít zde v rámci Nebio exploreru.
Na transakci je vidět, že má celkem 3 vstupy:
- První vstup č.0 je zdroj pro mintování nového NFT, v tomto případě lot s 487 VENFT tokeny.
- Druhý vstup č.1 je Neblio pro zaplacení poplatku za provedení transakce.
- Třetí vstup č.2 je původní token získaný v rámci transakce NFT Payment.
Výstupy jsou:
- První výstup č.0 je NFT Post, který směřuje k tomu kdo si koupil NFT.
- Druhý výstup č.1 je NFT Receipt, který směřuje k tomu, kdo NFT prodával.
- Třetí výstup č.2 je zbytek Neblio po zaplacení poplatku za transakci.
- Čtvrtý výstup č.3 je zbytek VENFT tokenů pro mintování (původně vstup č.0).
Zde jsou první dva výstupy:
Druhé dva výstupy:
Pro platbu poplatku je použita přijatá platba 0.5 NEBL. Díky tomu se tyto platby propojí v rámci jedné transakce s NFT Receipt.
Tímto způsobem je možné prodat v podstatě jakékoliv NFT. Jedná se tedy o univerzální postup, jehož logika je již vyřešena v rámci knihovny VEDriversLite.
NFT Receipts je možné vidět ve VENFT App pod účtem prodejce:
V tom spočívá výhoda kombinace VENFT App a serverové nebo konzolové aplikace. Můžou totiž používat stejnou adresu. Vytvoří se například VENFT App účet, provede se backup a backup file se použije jako zdroj pro serverovou aplikaci. Díky tomu je pak ve VENFT App vidět, co se děje na "serverovém" účtu.