Jak jsem naučil redakční systém tvořit články, SEO i grafiku na jedno kliknutí
Propojil jsem jádro redakčního systému Orchard Core přímo s API umělé inteligence. Majitelům webů teď stačí zadat téma a můj kód se postará o vygenerování, naformátování a roztřídění obsahu přímo do databáze.
Co bylo cílem a s čím jsem bojoval
Psaní firemního obsahu nebo plnění e-shopu produkty je pro provozovatele webů extrémně zdlouhavé. I když dnes lidé běžně používají umělou inteligenci, v praxi to znamená mít otevřených několik různých oken. V jednom okně si necháte napsat text, ve druhém složitě ladíte prompty pro obrázek, vše pak ručně kopírujete zpět do svého redakčního systému, formátujete nadpisy a doplňujete štítky pro vyhledávače.
Chtěl jsem tento "kopírovací" proces kompletně zrušit. Cílem bylo vytvořit nástroj zabudovaný přímo v srdci webu. Nástroj, který bude znát vaše rubriky, vaše interní pravidla a technickou strukturu stránek, a podle toho připraví kompletní výstup.
Jaké technologie a přístupy dostaly hlavní roli
Architekturu jsem postavil na platformě .NET 10 a redakčním systému Orchard Core. Napsal jsem vlastní modul nazvaný PV.ContentAIGenerator, který v pozadí řídí takzvané "agenty" (digitální persony s konkrétním úkolem) a zajišťuje, že se výsledná data nerozsypou, ale přesně zapadnou do připravených chlívečků v databázi.
Automatická analýza struktury
Aplikace si přes rozhraní redakčního systému sama přečte, jaká pole web používá (např. hlavní text, perex, SEO titulek, náhledový obrázek). Z toho vytvoří striktní šablonu, kterou pošle umělé inteligenci, a donutí ji tak vrátit data v přesně požadovaném formátu.
Grafika přímo do knihovny médií na jedno kliknutí
Umělá inteligence zvládne na základě textu rovnou vytvořit i obrázky. Modul tato obrazová data (Base64) automaticky chytí na pozadí, převede je na fyzické soubory a bezpečně je zapíše do mediální knihovny webu. Redaktorovi pak už jen podstrčí správnou URL adresu.
Šablonovací engine Liquid
Aby výsledek nebyl jen holý text, zapojil jsem do procesu vestavěný šablonovací systém Liquid. Vygenerovaná data od AI se před uložením proženou šablonou, která jim dodá perfektní HTML strukturu (včetně CSS tříd pro váš konkrétní web).
Nahlédnutí pod kapotu: Jak modul funguje v kódu
Abychom zajistili, že AI nebude generovat "omáčku", ale strukturovaná data, napsal jsem službu ContentSchemaAnalyzer. Ta prozkoumá definici obsahu v Orchard Core a vytvoří systémový prompt. Donutíme tak model vrátit čistý JSON.
public async Task<string> GenerateSchemaPromptAsync(string contentTypeName)
{
var typeDef = await _contentDefinitionManager.GetTypeDefinitionAsync(contentTypeName);
if (typeDef == null) return string.Empty;
var sb = new StringBuilder();
sb.AppendLine("Tvá odpověď MUSÍ být striktní JSON objekt bez markdown značek, odpovídající této struktuře:");
sb.AppendLine("{");
sb.AppendLine(" \"DisplayText\": \"<Generovaný hlavní název>\",");
foreach (var part in typeDef.Parts)
{
if (part.PartDefinition.Name == "HtmlBodyPart")
sb.AppendLine($" \"{part.PartDefinition.Name}\": {{ \"Html\": \"<Generovaný HTML obsah>\" }},");
// ... (dynamické mapování dalších polí)
}
sb.AppendLine("}");
return sb.ToString();
}
Jakmile máme hotový text, nastupuje agent pro generování obrázků. Vygenerovaný obrázek přijde z API jako textový řetězec. Můj kontroler ho vezme a fyzicky ho propíše přímo do souborového systému (Media Library) vašeho webu.
[HttpPost("save-media")]
public async Task<IActionResult> SaveMedia([FromBody] SaveMediaPayload payload)
{
// Převod z Base64 textu na skutečná data obrazu
byte[] imageBytes = Convert.FromBase64String(CleanBase64String(payload.ImageData));
// Vygenerování unikátního názvu a cesty v CMS
string fileName = $"{payload.ImageKey}_{Guid.NewGuid().ToString().Substring(0, 8)}.jpg";
string mediaPath = _mediaFileStore.Combine("ai-generated-content", fileName);
// Fyzické uložení streamu do úložiště webu
using (var stream = new MemoryStream(imageBytes))
{
await _mediaFileStore.CreateFileFromStreamAsync(mediaPath, stream, overwrite: true);
}
// Vrácení veřejné URL pro vložení do článku
return Ok(new { success = true, mediaPath = mediaPath, publicUrl = _mediaFileStore.MapPathToPublicUrl(mediaPath) });
}
Ve finále všechny tyto dílky – text, SEO pole a cesty k uloženým obrázkům – vezmu a založím z nich v redakčním systému zbrusu nový koncept (Draft).
// Vytvoření nové položky obsahu v paměti
var contentItem = await _contentManager.NewAsync(targetContentType);
// Sloučení vygenerovaného JSONu s vnitřní strukturou systému
contentItem.Merge(jsonNode);
// Renderování obsahu přes Liquid šablonu pro dokonalý design
string finalHtml = await _liquidTemplateManager.RenderStringAsync(pipelineTemplate, HtmlEncoder.Default, null, properties);
contentItem.Content["HtmlBodyPart"] = new { Html = finalHtml };
// Bezpečné uložení do databáze jako koncept (Draft)
await _contentManager.CreateAsync(contentItem, VersionOptions.Draft);
Porovnání: Starý přístup vs. Nové řešení
Podívejte se, jak integrace přímo do jádra systému šetří reálný čas a eliminuje lidské chyby.
| Vlastnost / Metrika | Původní stav | Nové řešení |
|---|---|---|
| Časová náročnost na 1 položku | Desítky minut přepínání oken a kopírování z ChatGPT/Midjourney. | 2–3 minuty na zpracování na pozadí, kontrola a jedno kliknutí na uložení. |
| Kvalita zdrojového kódu (HTML) | Často rozbité styly a skryté znaky po vložení přes schránku (Ctrl+V). | Čistý a validní HTML kód generovaný přes nativní šablonovací engine Liquid. |
| Vyplňování skrytých parametrů (SEO/OpenGraph) | Ruční vypisování, na které se často v rychlosti zapomnělo. | Modul sám navrhne a vloží Google Schema, popisky i štítky. |
Jak celý systém funguje v praxi pro běžného uživatele
Administrační rozhraní jsem postavil nad komponentami Syncfusion (konkrétně ej.navigations.Stepper a DropDownList). Uživatel si prostě vybere předpřipravený proces (tzv. Pipeline) a zadá téma, o kterém chce psát. Odklikne start a na obrazovce vidí, jak systém postupně volá jednotlivé modely z rodiny Google Gemini.
Když je hotovo, redaktor se neocitne před hromadou textu, kterou by musel někam vkládat. Připravil jsem chytrou tabulku. V levém sloupci svítí políčka z vašeho webu (např. "Titulek stránky", "Perex", "Obsah článku") a vpravo roletky s tím, co AI vymyslela. Pokud jste spokojeni, kliknete na tlačítko "Vytvořit článek". Systém na pozadí sestaví finální JSON objekt, přes API založí obsah a přesměruje vás do klasického editoru, kde už všechno leží úhledně poskládané a uložené v režimu konceptu.
Časté otázky a odpovědi
Proč jsem to nepostavil jako běžnou webovou aplikaci stojící mimo web?
Protože největší brzda v produktivitě je samotný přenos dat. Tím, že je modul pevnou součástí Orchard Core, má přístup k databázi (YesSql) a knihovně médií. Dokáže si sám přečíst nastavení webu a vkládat soubory přímo na server. Navenek tak celý systém funguje jako jeden obrovský mozek, který plní web za vás.
Co se stane, když umělá inteligence vygeneruje úplný nesmysl?
Ošetřil jsem to na úrovni kódu. Veškerý obsah, který modul založí, se do redakčního systému ukládá striktně přes volání CreateAsync(contentItem, VersionOptions.Draft). To znamená, že nikdy nedojde k automatickému publikování na živý web. Článek čeká v sekci konceptů, dokud ho člověk nepřečte a neschválí.